{"info":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","description":"<html><head></head><body><p>Nessa coleção estão documentadas as API's disponibilizadas pela Voalle agrupadas por seus relativos módulos do ERP e funcionalidades.</p>\n<p>Todas as API's desta coleção estão em um ambiente separado do ERP Voalle e devido a isso o usuário que será utilizado na API de autenticação para obter o access_token a ser informado nas demais requisições, deve ser identificado como um usuário de <strong>Integração</strong> e assim, não será possível usar esse usuário para acessar a interface do ERP.</p>\n<p>Ao acessar a rotina Configurações / Usuários e cadastrar um novo usuário, marcar a opção <strong>Usuário integrador</strong>. Quando marcado esse campo, esse usuário não irá conseguir logar no ERP, apenas na API Third Party. Caso não marcado, a API de autenticação irá retornar o status Não Autorizado.</p>\n<p>Todas as requisições feitas via API ao ERP Voalle irão gerar um log da transação e da ação realizada em nome do usuário autenticado. Com isso, é altamente indicado que seja criado um novo usuário para cada integração que irá acessar o ERPVoalle.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"16282829","collectionId":"fab82460-8195-4bc8-a769-b21548e86d11","publishedId":"TzzBqFw1","public":true,"customColor":{"highlight":"#FF6C37","top-bar":"#FFFFFF","right-sidebar":"#FFFFFF"},"publishDate":"2026-08-20T15:57:54.000Z"},"item":[{"name":"Autenticação","item":[{"name":"Autenticação","id":"8676cab9-4932-40a7-9a09-5214aed37653","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text","description":"<p>Valor Fixo</p>\n"},{"key":"scope","value":"syngw","type":"text","description":"<p>Valor Fixo</p>\n"},{"key":"client_id","value":"{{client_id}}","type":"text","description":"<p>Informado pelo cliente - “Suíte / Configurações / Usuários”, campo \"Client Id\" do usuário marcado como Integrador</p>\n"},{"key":"client_secret","value":"{{client_secret}}","type":"text","description":"<p>Informado pelo cliente - “Suíte / Configurações / Usuários”, campo \"Client Secret\" do usuário marcado como Integrador</p>\n"},{"key":"syndata","value":"{{token}}","type":"text","description":"<p>Informado pelo cliente - “Suíte / Configurações / Parâmetros” menu “Integração/Mapa” ou solicitado a Voalle via protocolo</p>\n"}]},"url":"{{URL}}:45700/connect/token","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza a autenticação do integrador junto ao Authorization Server e obtém o <code>access_token</code> (Bearer) usado em todas as demais chamadas desta coleção.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Usuário cadastrado em \"Suíte / Configurações / Usuários\" marcado como <strong>Integrador</strong>, com <code>Client Id</code> e <code>Client Secret</code> gerados.</li>\n<li>Valor de <code>syndata</code> informado pelo cliente em \"Suíte / Configurações / Parâmetros\", menu \"Integração/Mapa\", ou solicitado à Voalle via protocolo.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>grant_type</code> e <code>scope</code> são valores fixos (<code>client_credentials</code> e <code>syngw</code>, respectivamente).</li>\n<li><strong>Obs.:</strong> para realizar testes no ambiente de Staging/Homologação, utilize as informações de <code>client_id</code>, <code>client_secret</code> e <code>syndata</code> desse ambiente, mas envie a requisição de autenticação para o link do ambiente de <strong>produção</strong>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td>Sim</td>\n<td>Valor fixo: <code>client_credentials</code></td>\n</tr>\n<tr>\n<td><code>scope</code></td>\n<td>Sim</td>\n<td>Valor fixo: <code>syngw</code></td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Sim</td>\n<td>Informado pelo cliente — \"Suíte / Configurações / Usuários\", campo \"Client Id\" do usuário marcado como Integrador</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Sim</td>\n<td>Informado pelo cliente — \"Suíte / Configurações / Usuários\", campo \"Client Secret\" do usuário marcado como Integrador</td>\n</tr>\n<tr>\n<td><code>syndata</code></td>\n<td>Sim</td>\n<td>Informado pelo cliente — \"Suíte / Configurações / Parâmetros\", menu \"Integração/Mapa\", ou solicitado a Voalle via protocolo</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint roda em um Authorization Server externo ao repositório <code>Syntesis.SynGW</code> (padrão OAuth2 / <code>client_credentials</code>), portanto <strong>não segue</strong> o envelope padrão <code>success</code>/<code>messages</code>/<code>response</code> usado pelo restante desta coleção.</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>access_token</code></td>\n<td>string</td>\n<td>Token Bearer a ser usado no header <code>Authorization</code> das demais chamadas</td>\n</tr>\n<tr>\n<td><code>expires_in</code></td>\n<td>number</td>\n<td>Tempo de validade do token, em segundos</td>\n</tr>\n<tr>\n<td><code>refresh_token</code></td>\n<td>string</td>\n<td>Token para renovação (ver request \"Refresh Token\")</td>\n</tr>\n<tr>\n<td><code>token_type</code></td>\n<td>string</td>\n<td>Sempre <code>Bearer</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>A lógica de autenticação/emissão de token roda em um Authorization Server externo a este repositório (já confirmado em investigação anterior desta mesma iniciativa, junto ao request \"Refresh Token\"). Não foi possível confirmar no código-fonte os formatos exatos de erro (ex.: <code>client_id</code>/<code>client_secret</code> inválidos, <code>syndata</code> incorreto) — a confirmar com o time responsável pelo Authorization Server. Em fluxos OAuth2 client_credentials padrão, erros desse tipo costumam retornar HTTP 400 com um corpo <code>{\"error\": \"invalid_client\"}</code> ou similar, mas isso não foi verificado neste repositório.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Refresh Token\" — renova o <code>access_token</code> usando o <code>refresh_token</code> retornado aqui, sem precisar reenviar <code>client_id</code>/<code>client_secret</code>.</li>\n</ul>\n","urlObject":{"port":"45700","path":["connect","token"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"dedef76e-3d9a-4d75-a7d4-996650f475de","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text","description":"Valor Fixo"},{"key":"scope","value":"syngw","type":"text","description":"Valor Fixo"},{"key":"client_id","value":"Token Client_id","type":"text","description":"Informado pelo cliente - “Suíte / Configurações / Usuários”, campo \"Client Id\" do usuário marcado como Integrador"},{"key":"client_secret","value":"Token Client_secret","type":"text","description":"Informado pelo cliente - “Suíte / Configurações / Usuários”, campo \"Client Secret\" do usuário marcado como Integrador"},{"key":"syndata","value":"Token SynData","type":"text","description":"Informado pelo cliente - “Configurações / Usuários” quando o campo estiver marcado como Integrador"}]},"url":"https://erp.cliente.com.br:45700/connect/token"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"access_token\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"expires_in\": 3600,\n    \"refresh_token\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"token_type\": \"Bearer\"\n}"}],"_postman_id":"8676cab9-4932-40a7-9a09-5214aed37653"},{"name":"Refresh Token","id":"0f8416e2-b0b3-424c-b476-6809d0a6fd2b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"refresh_token","type":"text","description":"<p>Valor Fixo</p>\n"},{"key":"client_id","value":"synauth","type":"text","description":"<p>Valor Fixo</p>\n"},{"key":"client_secret","value":"df956154024a425eb80f1a2fc12fef0c","type":"text","description":"<p>Valor Fixo</p>\n"},{"key":"refresh_token","value":"Refresh Token","type":"text","description":"<p>Obtido no método de autenticação</p>\n"}]},"url":"{{URL}}:45700/connect/token","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Renova o <code>access_token</code> usando um <code>refresh_token</code>, sem precisar reenviar as credenciais completas de negócio. Chama o mesmo Authorization Server usado por \"Autenticação\" (<code>{{URL}}:45700/connect/token</code>) — um serviço de autenticação externo e compartilhado, que não faz parte do código-fonte do ERP Voalle (SynGW).</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>grant_type</code></td>\n<td>Sim</td>\n<td>Valor fixo: <code>refresh_token</code>.</td>\n</tr>\n<tr>\n<td><code>client_id</code></td>\n<td>Sim</td>\n<td>Valor fixo: <code>synauth</code>.</td>\n</tr>\n<tr>\n<td><code>client_secret</code></td>\n<td>Sim</td>\n<td>Valor fixo do client de autenticação — não é o <code>client_secret</code> do usuário integrador usado em \"Autenticação\".</td>\n</tr>\n<tr>\n<td><code>refresh_token</code></td>\n<td>Sim</td>\n<td>Token de renovação obtido na resposta do endpoint \"Autenticação\".</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<blockquote>\n<p><strong>A confirmar com o time responsável pela autenticação:</strong> o endpoint \"Autenticação\" desta collection usa <code>grant_type=client_credentials</code>, que pelo padrão OAuth2 normalmente <strong>não emite <code>refresh_token</code></strong>. Não foi possível confirmar, a partir do código-fonte do ERP (o Authorization Server é externo a este projeto), se a resposta de \"Autenticação\" realmente inclui um <code>refresh_token</code> utilizável aqui, ou se este request reflete um fluxo diferente/desatualizado. Antes de recomendar este fluxo a integradores, validar com o time responsável pelo Authorization Server se o refresh funciona como documentado aqui.</p>\n</blockquote>\n<h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint roda em um Authorization Server externo ao repositório <code>Syntesis.SynGW</code> (padrão OAuth2 / <code>refresh_token</code>), portanto <strong>não segue</strong> o envelope padrão <code>success</code>/<code>messages</code>/<code>response</code> usado pelo restante desta coleção.</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>access_token</code></td>\n<td>string</td>\n<td>Novo token Bearer a ser usado no header <code>Authorization</code> das demais chamadas</td>\n</tr>\n<tr>\n<td><code>expires_in</code></td>\n<td>number</td>\n<td>Tempo de validade do novo token, em segundos</td>\n</tr>\n<tr>\n<td><code>refresh_token</code></td>\n<td>string</td>\n<td>Novo token para renovação futura</td>\n</tr>\n<tr>\n<td><code>token_type</code></td>\n<td>string</td>\n<td>Sempre <code>Bearer</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Alternativa a chamar \"Autenticação\" novamente — usado para renovar o <code>access_token</code> sem repetir o login completo, quando o fluxo de fato suportar <code>refresh_token</code> (ver ressalva acima).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45700","path":["connect","token"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"afcb4eab-ceb5-4c6d-9a5b-4b57d1d79aa5","name":"Refresh Token","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"refresh_token","type":"text"},{"key":"client_id","value":"synauth","type":"text"},{"key":"client_secret","value":"df956154024a425eb80f1a2fc12fef0c","type":"text"},{"key":"refresh_token","value":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","type":"text"}]},"url":"https://erp.cliente.com.br:45700/connect/token"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"access_token\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"expires_in\": 3600,\n    \"refresh_token\": \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\",\n    \"token_type\": \"Bearer\"\n}"}],"_postman_id":"0f8416e2-b0b3-424c-b476-6809d0a6fd2b"}],"id":"9ef28731-5e42-4eca-a039-d3754998a9ce","_postman_id":"9ef28731-5e42-4eca-a039-d3754998a9ce","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Suite","item":[{"name":"Cadastrar Pessoa","id":"669d8e95-b62a-44c5-ad05-da89c8d2fbea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 123123,\n    \"typeTxId\": \"string\",\n    \"txId\": \"string\",\n    \"name\": \"string\",\n    \"email\": \"string\",\n    \"client\": true,\n    \"situation\": 1,\n    \"streetType\": \"string\",\n    \"postalCode\": \"string\",\n    \"street\": \"string\",\n    \"number\": \"string\",\n    \"addressComplement\": \"string\",\n    \"addressReference\": \"string\",\n    \"neighborhood\": \"string\",\n    \"city\": \"string\",\n    \"codeCityId\": 0,\n    \"state\": \"string\",\n    \"codeCountry\": \"string\",\n    \"contacts\": [\n        {\n            \"name\": \"string\",\n            \"txId\": \"string\",\n            \"identity\": \"string\",\n            \"email\": \"string\",\n            \"phone\": \"string\",\n            \"cellPhone1\": \"string\",\n            \"openTask\": true,\n            \"keyUser\": true\n        }\n    ]\n}","options":{"raw":{"language":"text"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/people","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria uma nova pessoa no ERP, opcionalmente já criando e vinculando contatos a ela na mesma chamada.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Valores aceitos</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>typeTxId</code></td>\n<td><code>1</code> = Pessoa Jurídica, <code>2</code> = Pessoa Física, <code>3</code> = Estrangeiro</td>\n</tr>\n<tr>\n<td><code>situation</code></td>\n<td><code>1</code> = Contato, <code>3</code> = Efetivo, <code>4</code> = Lead</td>\n</tr>\n<tr>\n<td><code>codeCountry</code></td>\n<td>Tabela de Países relacionada à NT, disponível no site da Fazenda (<a href=\"http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=/NJarYc9nus=\">link</a>)</td>\n</tr>\n<tr>\n<td><code>contacts</code></td>\n<td>Opcional — lista de contatos a criar e vincular à pessoa recém-cadastrada (ver \"Regras de negócio\")</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p><code>contacts</code> (opcional) segue exatamente as mesmas regras do endpoint \"Criar Contatos para uma Pessoa\":</p>\n<ul>\n<li><code>name</code> é obrigatório para cada contato.</li>\n<li>Se <code>txId</code> for informado, deve ser um CPF (11 dígitos) ou CNPJ (14 dígitos) válido, e não pode ser igual ao <code>txId</code> da pessoa principal.</li>\n<li>Se já existir uma pessoa com esse <code>txId</code> cadastrada no sistema, ela é reaproveitada como contato (não cria duplicado).</li>\n<li>Vínculos já existentes entre a pessoa e o contato são ignorados.</li>\n<li>Falha em um contato (nome vazio, CPF/CNPJ inválido, erro ao criar/vincular) <strong>não</strong> interrompe a criação da pessoa nem o processamento dos demais contatos — o cadastro da pessoa é concluído normalmente e o(s) contato(s) com problema aparecem como mensagens de aviso (<code>type: \"Warn\"</code>) na lista <code>messages</code> da resposta.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados da pessoa criada (sempre <code>null</code> em sucesso). Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Criar Contatos para uma Pessoa\" — usado para adicionar contatos a uma pessoa já existente, com as mesmas regras de validação de <code>contacts</code> usadas aqui.</li>\n<li>\"Atualização de Pessoa\" / \"Atualiza endereço do cliente\" — usados para editar dados após o cadastro.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","people"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"393bbafc-0616-46be-8d94-8763265fe77c","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 123123,\n    \"typeTxId\": 2,\n    \"txId\": 123456789,\n    \"name\": \"teste\",\n    \"email\": \"teste@teste.com\",\n    \"client\": true,\n    \"situation\": 1,\n    \"streetType\": \"Rua\",\n    \"postalCode\": 123456789,\n    \"street\": \"Rua\",\n    \"number\": \"00\",\n    \"addressComplement\": \"Complemento\",\n    \"addressReference\": \"Referencia\",\n    \"neighborhood\": \"Bairro\",\n    \"city\": \"Cidade\",\n    \"codeCityId\": 123456,\n    \"state\": \"BA\",\n    \"codeCountry\": \"1058\" // Código para o país Brasil\n}","options":{"raw":{"language":"json"}}},"url":"https://cliente.synsuite.com.br:45715/external/integrations/thirdparty/people"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Registro criado com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"4a5e0c48-72b6-1e5a-430f-e879f37a23a9","name":"Sucesso — contato com aviso","originalRequest":{"header":[]},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Registro criado com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        },\n        {\n            \"message\": \"Contato 'Maria Souza' (índice 1): O campo nome é obrigatório.\",\n            \"code\": null,\n            \"type\": \"Warn\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"669d8e95-b62a-44c5-ad05-da89c8d2fbea"},{"name":"Atualização de Pessoa","id":"30077d5b-2ce9-4b89-b50a-48d254f4fa07","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"id\": 99,\n  \"email\": {\n    \"email\": \"teste@teste.com.br\",\n    \"emailNfe\": \"testenfe@teste.com.br\"\n  },\n  \"phone\": {\n    \"phone\": \"55999999999\",\n    \"cellPhone\": \"55999999999\",\n    \"cellPhoneHasWhatsapp\": true\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/people/{id_pessoa}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Atualiza e-mail e telefone de uma pessoa já cadastrada.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>A pessoa deve existir e não estar excluída.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>id</code> da pessoa deve ser informado tanto na URL quanto no corpo da requisição, e os dois valores devem ser iguais.</li>\n<li>Se o objeto <code>email</code> não for informado, os e-mails não são alterados. Se informado com campos vazios, os respectivos e-mails são limpos.</li>\n<li>Se o objeto <code>phone</code> não for informado, os telefones não são alterados. Se informado com campos vazios, os respectivos telefones são limpos.</li>\n<li><code>email.email</code> é validado como e-mail simples; <code>email.emailNfe</code> aceita múltiplos e-mails (formato aceito pela validação de e-mail múltiplo do ERP). Ambos têm limite de 255 caracteres.</li>\n<li><code>phone.phone</code> e <code>phone.cellPhone</code> são validados por formato; não há uma validação efetiva de tamanho mínimo/máximo além da validação de formato.</li>\n<li>Só é possível alterar <code>cellPhoneHasWhatsapp</code> (indicador de WhatsApp) informando explicitamente o campo — se omitido, o valor atual não é alterado.</li>\n<li>Se nenhum campo realmente mudou em relação ao valor atual, a API retorna sucesso com a mensagem \"Nenhuma informação a ser atualizada.\" e não gera log.</li>\n<li>Toda alteração efetiva gera um log de alteração (histórico) vinculado à pessoa.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Sim</td>\n<td>Id da pessoa (deve ser igual ao <code>{id_pessoa}</code> da URL)</td>\n</tr>\n<tr>\n<td><code>email.email</code></td>\n<td>Não</td>\n<td>E-mail principal; formato de e-mail válido; até 255 caracteres</td>\n</tr>\n<tr>\n<td><code>email.emailNfe</code></td>\n<td>Não</td>\n<td>E-mail(s) para NF-e; aceita múltiplos e-mails; até 255 caracteres</td>\n</tr>\n<tr>\n<td><code>phone.phone</code></td>\n<td>Não</td>\n<td>Telefone fixo</td>\n</tr>\n<tr>\n<td><code>phone.cellPhone</code></td>\n<td>Não</td>\n<td>Celular</td>\n</tr>\n<tr>\n<td><code>phone.cellPhoneHasWhatsapp</code></td>\n<td>Não</td>\n<td>Indica se o celular possui WhatsApp</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.peopleAddressId</code></td>\n<td>number</td>\n<td>Sempre <code>0</code> — não utilizado neste endpoint</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Mensagem de confirmação</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem retornada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Corpo da requisição não enviado</td>\n<td>\"Valores não repassados ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>id</code> da URL diferente do <code>id</code> do corpo</td>\n<td>\"Registro não confere com o valor enviado no modelo.\"</td>\n</tr>\n<tr>\n<td>Pessoa não encontrada</td>\n<td>\"Registro não encontrado.\"</td>\n</tr>\n<tr>\n<td>Pessoa excluída</td>\n<td>\"Este registro já foi excluído.\"</td>\n</tr>\n<tr>\n<td><code>email.email</code> em formato inválido</td>\n<td>\"O e-mail informado é inválido.\"</td>\n</tr>\n<tr>\n<td><code>email.email</code> acima de 255 caracteres</td>\n<td>\"O e-mail informado não deve exceder 255 caracteres.\"</td>\n</tr>\n<tr>\n<td><code>email.emailNfe</code> em formato inválido</td>\n<td>\"O e-mail NFE informado é inválido.\"</td>\n</tr>\n<tr>\n<td><code>email.emailNfe</code> acima de 255 caracteres</td>\n<td>\"O e-mail NFE informado não deve exceder 255 caracteres.\"</td>\n</tr>\n<tr>\n<td><code>phone.phone</code> em formato inválido</td>\n<td>\"O telefone informado é inválido.\"</td>\n</tr>\n<tr>\n<td><code>phone.cellPhone</code> em formato inválido</td>\n<td>\"O celular informado é inválido.\"</td>\n</tr>\n<tr>\n<td>Nenhum campo alterado</td>\n<td>\"Nenhuma informação a ser atualizada.\" (sucesso, sem log)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","people","{id_pessoa}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"54724ce2-d80a-463e-ab78-b6046a6ff924","name":"Sucesso","originalRequest":{"method":"PUT","header":[],"body":{"mode":"raw","raw":"{\n  \"id\": 99,\n  \"email\": {\n    \"email\": \"teste@teste.com.br\",\n    \"emailNfe\": \"testenfe@teste.com.br\"\n  },\n  \"phone\": {\n    \"phone\": \"55999999999\",\n    \"cellPhone\": \"55999999999\",\n    \"cellPhoneHasWhatsapp\": true\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/people/{id_pessoa}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": {\n    \"peopleAddressId\": 0, // não utilizado neste endpoint (sempre 0)\n    \"message\": \"Informações da pessoa atualizadas com sucesso!\"\n  },\n  \"dataResponseType\": \"ReturnAddressInfo\",\n  \"elapsedTime\": null\n}"},{"id":"768ec8ba-e1d4-4a4b-8209-8d636dad4692","name":"Erro — pessoa não encontrada","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"id\": 99,\n  \"email\": {\n    \"email\": \"teste@teste.com.br\",\n    \"emailNfe\": \"testenfe@teste.com.br\"\n  },\n  \"phone\": {\n    \"phone\": \"55999999999\",\n    \"cellPhone\": \"55999999999\",\n    \"cellPhoneHasWhatsapp\": true\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/people/{id_pessoa}","description":"## Propósito\n\nAtualiza e-mail e telefone de uma pessoa já cadastrada.\n\n## Pré-requisitos\n\n- A pessoa deve existir e não estar excluída.\n\n## Regras de negócio\n\n- O `id` da pessoa deve ser informado tanto na URL quanto no corpo da requisição, e os dois valores devem ser iguais.\n- Se o objeto `email` não for informado, os e-mails não são alterados. Se informado com campos vazios, os respectivos e-mails são limpos.\n- Se o objeto `phone` não for informado, os telefones não são alterados. Se informado com campos vazios, os respectivos telefones são limpos.\n- `email.email` é validado como e-mail simples; `email.emailNfe` aceita múltiplos e-mails (formato aceito pela validação de e-mail múltiplo do ERP). Ambos têm limite de 255 caracteres.\n- `phone.phone` e `phone.cellPhone` são validados por formato; não há uma validação efetiva de tamanho mínimo/máximo além da validação de formato.\n- Só é possível alterar `cellPhoneHasWhatsapp` (indicador de WhatsApp) informando explicitamente o campo — se omitido, o valor atual não é alterado.\n- Se nenhum campo realmente mudou em relação ao valor atual, a API retorna sucesso com a mensagem \"Nenhuma informação a ser atualizada.\" e não gera log.\n- Toda alteração efetiva gera um log de alteração (histórico) vinculado à pessoa.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `id` | Sim | Id da pessoa (deve ser igual ao `{id_pessoa}` da URL) |\n| `email.email` | Não | E-mail principal; formato de e-mail válido; até 255 caracteres |\n| `email.emailNfe` | Não | E-mail(s) para NF-e; aceita múltiplos e-mails; até 255 caracteres |\n| `phone.phone` | Não | Telefone fixo |\n| `phone.cellPhone` | Não | Celular |\n| `phone.cellPhoneHasWhatsapp` | Não | Indica se o celular possui WhatsApp |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica sucesso da chamada |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.peopleAddressId` | number | Sempre `0` — não utilizado neste endpoint |\n| `response.message` | string | Mensagem de confirmação |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Corpo da requisição não enviado | \"Valores não repassados ao controlador.\" |\n| `id` da URL diferente do `id` do corpo | \"Registro não confere com o valor enviado no modelo.\" |\n| Pessoa não encontrada | \"Registro não encontrado.\" |\n| Pessoa excluída | \"Este registro já foi excluído.\" |\n| `email.email` em formato inválido | \"O e-mail informado é inválido.\" |\n| `email.email` acima de 255 caracteres | \"O e-mail informado não deve exceder 255 caracteres.\" |\n| `email.emailNfe` em formato inválido | \"O e-mail NFE informado é inválido.\" |\n| `email.emailNfe` acima de 255 caracteres | \"O e-mail NFE informado não deve exceder 255 caracteres.\" |\n| `phone.phone` em formato inválido | \"O telefone informado é inválido.\" |\n| `phone.cellPhone` em formato inválido | \"O celular informado é inválido.\" |\n| Nenhum campo alterado | \"Nenhuma informação a ser atualizada.\" (sucesso, sem log) |\n\nTodos os cenários acima retornam HTTP 200."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\n    {\n      \"message\": \"Registro não encontrado.\",\n      \"code\": 404,\n      \"type\": \"Error\"\n    }\n  ],\n  \"response\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"30077d5b-2ce9-4b89-b50a-48d254f4fa07"},{"name":"Atualiza endereço do cliente","id":"aba7f972-0f6e-4e84-ae08-dc50341e9b37","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0, // Identificador do cliente que se deseja atualizar o endereço\n    \"city\": \"Cidade\", // Cidade Ex: Santa Maria\n    \"complement\": \"Complemento\", // Complemento\n    \"ibgeCode\": \"123\", // Código da cidade\n    \"neighborhood\": \"Bairro\", // Bairro\n    \"number\": \"01\", // Numero do endereço\n    \"peopleAddressId\": 1, // Será atualizado o endereço do com ID informado, caso não for informado, será realizado o cadastro de um novo endereço\n    \"publicPlace\": \"Rua Teste\", // Endereço\n    \"reference\": \"Referência\", // Referencia\n    \"state\": \"Estado\", // Estado Ex: RS\n    \"zipCode\": \"97000000\", // CEP\n    \"propertyType\": null, // Tipo de residência. 1 = Casa de Madeira / 2 = Casa de Alvenaria / 3 = Casa Mista / 4 = Apartamento\n    \"lat\": \"\", // Latitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a latitude\n    \"lng\": \"\" // Longitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a longitude\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/updateaddress/{{IdCliente}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Atualiza o endereço de uma pessoa/cliente já cadastrada, ou cadastra um novo endereço para ela.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>O cliente informado na URL (<code>{{IdCliente}}</code>) deve existir.</li>\n<li>Ao atualizar um endereço existente (<code>peopleAddressId</code> informado), o endereço precisa pertencer ao cliente informado.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Se <code>peopleAddressId</code> for informado, o endereço com esse Id é atualizado — desde que pertença ao cliente informado na URL.</li>\n<li>A validação de que o <code>peopleAddressId</code> pertence ao cliente informado (e não está excluído) ocorre antes de qualquer outra consulta ao endereço — por isso tanto um <code>peopleAddressId</code> inexistente quanto um pertencente a outro cliente retornam exatamente a mesma mensagem de erro (ver \"Erros comuns\").</li>\n<li>Se <code>peopleAddressId</code> não for informado (ou vier <code>null</code>/<code>0</code>), é cadastrado um novo endereço do tipo \"Principal\" para o cliente, e o endereço principal do cliente passa a ser este novo registro.</li>\n<li><code>ibgeCode</code>, quando informado, é usado para preencher automaticamente cidade e estado do endereço a partir da tabela de códigos de cidade do IBGE — tem prioridade sobre os campos <code>city</code>/<code>state</code> informados manualmente.</li>\n<li><code>city</code> e <code>state</code> são validados contra a base de cidades/estados do ERP: se informados e não localizados, a atualização é rejeitada.</li>\n<li><code>lat</code>/<code>lng</code>, quando informados, são gravados diretamente. Se não informados e o ERP tiver a chave de integração do Google Maps configurada, a API consulta automaticamente as coordenadas a partir do endereço informado.</li>\n<li>Ao atualizar um endereço já existente vinculado a contrato(s) de autenticação (ex.: portal do assinante), os dados de endereço desses contratos também são atualizados automaticamente.</li>\n<li>Os campos de texto (<code>publicPlace</code>, <code>number</code>, <code>neighborhood</code>, <code>complement</code>, <code>reference</code>, <code>city</code>, <code>state</code>, <code>ibgeCode</code>) não podem conter espaços em branco no início/fim nem espaços duplicados entre caracteres.</li>\n<li><code>state</code> deve ser uma sigla de UF válida.</li>\n<li><code>propertyType</code>, quando informado, deve ser um dos valores válidos (1 a 4).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Valores aceitos</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code></td>\n<td>Sim</td>\n<td>Id do cliente (deve corresponder ao <code>{{IdCliente}}</code> da URL)</td>\n</tr>\n<tr>\n<td><code>peopleAddressId</code></td>\n<td>Não</td>\n<td>Id do endereço a atualizar; se omitido, cadastra um novo endereço</td>\n</tr>\n<tr>\n<td><code>publicPlace</code></td>\n<td>Não</td>\n<td>Logradouro, sem espaços duplicados/nas pontas</td>\n</tr>\n<tr>\n<td><code>number</code></td>\n<td>Não</td>\n<td>Número, sem espaços duplicados/nas pontas</td>\n</tr>\n<tr>\n<td><code>neighborhood</code></td>\n<td>Não</td>\n<td>Bairro, sem espaços duplicados/nas pontas</td>\n</tr>\n<tr>\n<td><code>complement</code></td>\n<td>Não</td>\n<td>Complemento, sem espaços duplicados/nas pontas</td>\n</tr>\n<tr>\n<td><code>reference</code></td>\n<td>Não</td>\n<td>Ponto de referência, sem espaços duplicados/nas pontas</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>Não</td>\n<td>Nome da cidade (validado contra a base do ERP)</td>\n</tr>\n<tr>\n<td><code>state</code></td>\n<td>Não</td>\n<td>Sigla de UF válida</td>\n</tr>\n<tr>\n<td><code>ibgeCode</code></td>\n<td>Não</td>\n<td>Código IBGE da cidade — quando informado, tem prioridade sobre <code>city</code>/<code>state</code></td>\n</tr>\n<tr>\n<td><code>zipCode</code></td>\n<td>Não</td>\n<td>CEP no formato válido</td>\n</tr>\n<tr>\n<td><code>propertyType</code></td>\n<td>Não</td>\n<td><code>1</code> = Casa de Madeira, <code>2</code> = Casa de Alvenaria, <code>3</code> = Casa Mista, <code>4</code> = Apartamento</td>\n</tr>\n<tr>\n<td><code>lat</code> / <code>lng</code></td>\n<td>Não</td>\n<td>Latitude/Longitude; se omitidos, calculados automaticamente quando há integração com Google Maps configurada</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.peopleAddressId</code></td>\n<td>number</td>\n<td>Id do endereço atualizado/criado — <code>0</code> quando o endereço foi criado sem retorno explícito do Id</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Mensagem de confirmação</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem retornada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code> da URL diferente do <code>id</code> do corpo</td>\n<td>\"Registro não confere com o valor enviado no modelo.\"</td>\n</tr>\n<tr>\n<td><code>peopleAddressId</code> informado não encontrado, excluído ou pertencente a outro cliente</td>\n<td>\"O identificador do PeopleAddressId deve pentercer ao cliente.\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"pentercer\")</td>\n</tr>\n<tr>\n<td><code>city</code> informada mas não localizada na base</td>\n<td>\"Cidade não encontrada. Verifique o nome da cidade.\"</td>\n</tr>\n<tr>\n<td><code>state</code> informado mas não localizado na base</td>\n<td>\"Estado não encontrado. Verifique a sigla do estado\"</td>\n</tr>\n<tr>\n<td><code>zipCode</code> em formato inválido</td>\n<td>\"Código CEP Inválido\"</td>\n</tr>\n<tr>\n<td><code>state</code> com espaços/sigla inválida</td>\n<td>\"O campo Estado digitado é inválido. Verifique se a sigla está correta ou se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\"</td>\n</tr>\n<tr>\n<td><code>publicPlace</code>/<code>number</code>/<code>neighborhood</code>/<code>complement</code>/<code>reference</code>/<code>city</code>/<code>ibgeCode</code> com espaços no início/fim ou duplicados</td>\n<td>\"O campo {Nome do campo} digitado é inválido. Verifique se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\"</td>\n</tr>\n<tr>\n<td><code>propertyType</code> fora de 1–4</td>\n<td>\"O campo Tipo de Propriedade digitado é inválido. Verifique os tipos de propriedades existentes.\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Atualização de Pessoa\" — atualiza e-mail/telefone da pessoa (não endereço).</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","updateaddress","{{IdCliente}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"2de2cf1a-8036-422f-910a-4f4193aa5d0b","name":"Sucesso","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0, // Identificador do cliente que se deseja atualizar o endereço\n    \"city\": \"Cidade\", // Cidade Ex: Santa Maria\n    \"complement\": \"Complemento\", // Complemento\n    \"ibgeCode\": \"123\", // Código da cidade\n    \"neighborhood\": \"Bairro\", // Bairro\n    \"number\": \"01\", // Numero do endereço\n    \"peopleAddressId\": 1, // Será atualizado o endereço do com ID informado, caso não for informado, será realizado o cadastro de um novo endereço\n    \"publicPlace\": \"Rua Teste\", // Endereço\n    \"reference\": \"Referência\", // Referencia\n    \"state\": \"Estado\", // Estado Ex: RS\n    \"zipCode\": \"97000000\", // CEP\n    \"propertyType\": null, // Tipo de residência. 1 = Casa de Madeira / 2 = Casa de Alvenaria / 3 = Casa Mista / 4 = Apartamento\n    \"lat\": \"\", // Latitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a latitude\n    \"lng\": \"\" // Longitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a longitude\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/updateaddress/123"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"peopleAddressId\": 0,\n        \"message\": \"Informações do endereço do cliente atualizados com sucesso!\"\n    },\n    \"dataResponseType\": \"ReturnAddressInfo\",\n    \"elapsedTime\": null\n}"},{"id":"d350a93f-59f6-47ca-89ba-f4498ccd343b","name":"Erro — endereço não pertence ao cliente","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0, // Identificador do cliente que se deseja atualizar o endereço\n    \"city\": \"Cidade\", // Cidade Ex: Santa Maria\n    \"complement\": \"Complemento\", // Complemento\n    \"ibgeCode\": \"123\", // Código da cidade\n    \"neighborhood\": \"Bairro\", // Bairro\n    \"number\": \"01\", // Numero do endereço\n    \"peopleAddressId\": 1, // Será atualizado o endereço do com ID informado, caso não for informado, será realizado o cadastro de um novo endereço\n    \"publicPlace\": \"Rua Teste\", // Endereço\n    \"reference\": \"Referência\", // Referencia\n    \"state\": \"Estado\", // Estado Ex: RS\n    \"zipCode\": \"97000000\", // CEP\n    \"propertyType\": null, // Tipo de residência. 1 = Casa de Madeira / 2 = Casa de Alvenaria / 3 = Casa Mista / 4 = Apartamento\n    \"lat\": \"\", // Latitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a latitude\n    \"lng\": \"\" // Longitude, se informado, será utilizado, caso contrário será feito consulta para descobrir a longitude\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/updateaddress/{{IdCliente}}","description":"## Propósito\n\nAtualiza o endereço de uma pessoa/cliente já cadastrada, ou cadastra um novo endereço para ela.\n\n## Pré-requisitos\n\n- O cliente informado na URL (`{{IdCliente}}`) deve existir.\n- Ao atualizar um endereço existente (`peopleAddressId` informado), o endereço precisa pertencer ao cliente informado.\n\n## Regras de negócio\n\n- Se `peopleAddressId` for informado, o endereço com esse Id é atualizado — desde que pertença ao cliente informado na URL.\n- A validação de que o `peopleAddressId` pertence ao cliente informado (e não está excluído) ocorre antes de qualquer outra consulta ao endereço — por isso tanto um `peopleAddressId` inexistente quanto um pertencente a outro cliente retornam exatamente a mesma mensagem de erro (ver \"Erros comuns\").\n- Se `peopleAddressId` não for informado (ou vier `null`/`0`), é cadastrado um novo endereço do tipo \"Principal\" para o cliente, e o endereço principal do cliente passa a ser este novo registro.\n- `ibgeCode`, quando informado, é usado para preencher automaticamente cidade e estado do endereço a partir da tabela de códigos de cidade do IBGE — tem prioridade sobre os campos `city`/`state` informados manualmente.\n- `city` e `state` são validados contra a base de cidades/estados do ERP: se informados e não localizados, a atualização é rejeitada.\n- `lat`/`lng`, quando informados, são gravados diretamente. Se não informados e o ERP tiver a chave de integração do Google Maps configurada, a API consulta automaticamente as coordenadas a partir do endereço informado.\n- Ao atualizar um endereço já existente vinculado a contrato(s) de autenticação (ex.: portal do assinante), os dados de endereço desses contratos também são atualizados automaticamente.\n- Os campos de texto (`publicPlace`, `number`, `neighborhood`, `complement`, `reference`, `city`, `state`, `ibgeCode`) não podem conter espaços em branco no início/fim nem espaços duplicados entre caracteres.\n- `state` deve ser uma sigla de UF válida.\n- `propertyType`, quando informado, deve ser um dos valores válidos (1 a 4).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `id` | Sim | Id do cliente (deve corresponder ao `{{IdCliente}}` da URL) |\n| `peopleAddressId` | Não | Id do endereço a atualizar; se omitido, cadastra um novo endereço |\n| `publicPlace` | Não | Logradouro, sem espaços duplicados/nas pontas |\n| `number` | Não | Número, sem espaços duplicados/nas pontas |\n| `neighborhood` | Não | Bairro, sem espaços duplicados/nas pontas |\n| `complement` | Não | Complemento, sem espaços duplicados/nas pontas |\n| `reference` | Não | Ponto de referência, sem espaços duplicados/nas pontas |\n| `city` | Não | Nome da cidade (validado contra a base do ERP) |\n| `state` | Não | Sigla de UF válida |\n| `ibgeCode` | Não | Código IBGE da cidade — quando informado, tem prioridade sobre `city`/`state` |\n| `zipCode` | Não | CEP no formato válido |\n| `propertyType` | Não | `1` = Casa de Madeira, `2` = Casa de Alvenaria, `3` = Casa Mista, `4` = Apartamento |\n| `lat` / `lng` | Não | Latitude/Longitude; se omitidos, calculados automaticamente quando há integração com Google Maps configurada |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica sucesso da chamada |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.peopleAddressId` | number | Id do endereço atualizado/criado — `0` quando o endereço foi criado sem retorno explícito do Id |\n| `response.message` | string | Mensagem de confirmação |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| `id` da URL diferente do `id` do corpo | \"Registro não confere com o valor enviado no modelo.\" |\n| `peopleAddressId` informado não encontrado, excluído ou pertencente a outro cliente | \"O identificador do PeopleAddressId deve pentercer ao cliente.\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"pentercer\") |\n| `city` informada mas não localizada na base | \"Cidade não encontrada. Verifique o nome da cidade.\" |\n| `state` informado mas não localizado na base | \"Estado não encontrado. Verifique a sigla do estado\" |\n| `zipCode` em formato inválido | \"Código CEP Inválido\" |\n| `state` com espaços/sigla inválida | \"O campo Estado digitado é inválido. Verifique se a sigla está correta ou se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\" |\n| `publicPlace`/`number`/`neighborhood`/`complement`/`reference`/`city`/`ibgeCode` com espaços no início/fim ou duplicados | \"O campo {Nome do campo} digitado é inválido. Verifique se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\" |\n| `propertyType` fora de 1–4 | \"O campo Tipo de Propriedade digitado é inválido. Verifique os tipos de propriedades existentes.\" |\n\nTodos os cenários acima retornam HTTP 200.\n\n## Fluxo relacionado\n\n- \"Atualização de Pessoa\" — atualiza e-mail/telefone da pessoa (não endereço)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"O identificador do PeopleAddressId deve pentercer ao cliente.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"aba7f972-0f6e-4e84-ae08-dc50341e9b37"},{"name":"Criar Contatos para uma Pessoa","id":"ef938d46-79f0-1e71-06ae-20822a769d57","request":{"method":"POST","header":[{"key":"Authorization","description":"<p>Obtido no método de autenticação</p>\n","value":"Bearer {{access_token}}"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"[\n    {\n        \"name\": \"João Silva\",\n        \"txId\": \"98765432100\",\n        \"email\": \"joao.silva@empresaxyz.com.br\",\n        \"phone\": \"4933221100\",\n        \"cellPhone1\": \"49999887766\",\n        \"openTask\": true,\n        \"keyUser\": true\n    },\n    {\n        \"name\": \"Maria Souza\",\n        \"txId\": \"12345678900\",\n        \"email\": \"maria.souza@empresaxyz.com.br\",\n        \"cellPhone1\": \"49988776655\",\n        \"openTask\": false,\n        \"keyUser\": false\n    }\n]","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/People/{id_pessoa}/Contacts","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria e vincula contatos a uma pessoa já existente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>A pessoa (<code>{id_pessoa}</code> da URL) deve existir e não estar excluída.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>name</code> é obrigatório para cada contato. Se vazio, <strong>apenas aquele item</strong> é marcado como falho (<code>success: false</code> no item da lista <code>response</code>) — não interrompe o processamento dos demais contatos.</li>\n<li>Se <code>txId</code> for informado, deve ser CPF (11 dígitos) ou CNPJ (14 dígitos) válido, e não pode ser igual ao <code>txId</code> da pessoa principal.</li>\n<li>Se já existir uma pessoa com esse <code>txId</code> no sistema, ela é reaproveitada como contato (vínculo criado sem duplicar o cadastro).</li>\n<li>Vínculo já existente entre a pessoa e o contato é ignorado (marcado como falho no item, sem duplicar).</li>\n<li>A resposta (<code>response</code>) é uma lista com um item por contato enviado, na mesma ordem, contendo <code>index</code>, <code>contactName</code>, <code>success</code> e <code>message</code> (motivo do sucesso/falha daquele contato específico).</li>\n<li>O envelope de nível superior (<code>success</code>) só vem <code>false</code> quando a chamada inteira é abortada: lista de contatos vazia/nula ou <code>personId</code> inexistente/deletado.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Valores aceitos</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>name</code></td>\n<td>Sim (por contato)</td>\n<td>Nome do contato</td>\n</tr>\n<tr>\n<td><code>txId</code></td>\n<td>Não</td>\n<td>CPF (11 dígitos) ou CNPJ (14 dígitos) válido; diferente do <code>txId</code> da pessoa principal</td>\n</tr>\n<tr>\n<td><code>identity</code></td>\n<td>Não</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>email</code></td>\n<td>Não</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>phone</code></td>\n<td>Não</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>cellPhone1</code></td>\n<td>Não</td>\n<td>—</td>\n</tr>\n<tr>\n<td><code>openTask</code></td>\n<td>Não</td>\n<td>boolean</td>\n</tr>\n<tr>\n<td><code>keyUser</code></td>\n<td>Não</td>\n<td>boolean</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>false</code> apenas quando a chamada inteira é abortada (ver \"Erros comuns\")</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].index</code></td>\n<td>int</td>\n<td>Posição do contato na lista enviada (começando em 0), na mesma ordem da requisição</td>\n</tr>\n<tr>\n<td><code>response[].contactName</code></td>\n<td>string|null</td>\n<td>Nome do contato, como enviado na requisição; <code>null</code> quando o próprio <code>name</code> não foi informado</td>\n</tr>\n<tr>\n<td><code>response[].success</code></td>\n<td>boolean</td>\n<td>Indica se aquele contato específico foi criado/vinculado com sucesso</td>\n</tr>\n<tr>\n<td><code>response[].message</code></td>\n<td>string</td>\n<td>Motivo do sucesso ou da falha daquele contato específico</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> quando a chamada inteira é abortada (ver \"Erros comuns\").</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Pessoa não encontrada</td>\n<td><code>success: false</code>, <code>messages: [{message: \"Pessoa não encontrada.\", code: 404, type: \"Error\"}]</code>, HTTP 200</td>\n</tr>\n<tr>\n<td>Lista de contatos vazia ou nula</td>\n<td><code>success: false</code>, <code>messages: [{message: \"Nenhum contato informado.\", code: 300, type: \"Error\"}]</code>, HTTP 200</td>\n</tr>\n<tr>\n<td>Contato sem <code>name</code></td>\n<td>Item da lista <code>response</code> com <code>success: false</code> e <code>message: \"O campo nome é obrigatório.\"</code> — não afeta os demais itens nem o <code>success</code> do envelope</td>\n</tr>\n<tr>\n<td><code>txId</code> inválido (CPF/CNPJ)</td>\n<td>Item da lista <code>response</code> com <code>success: false</code> e <code>message: \"CPF/CNPJ inválido.\"</code></td>\n</tr>\n<tr>\n<td><code>txId</code> igual ao da pessoa principal</td>\n<td>Item com <code>success: false</code> e <code>message: \"O contato não pode ter o mesmo CPF/CNPJ da pessoa principal.\"</code></td>\n</tr>\n<tr>\n<td>Vínculo já existente</td>\n<td>Item com <code>success: false</code> e <code>message: \"Vínculo já existente.\"</code> (ou, se o CPF já pertence a outra pessoa cadastrada, <code>\"CPF já cadastrado para '{nome}'. Vínculo já existente.\"</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200 — o controller sempre responde com <code>Ok()</code>, mesmo em erro de negócio.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Cadastrar Pessoa\" — permite criar os mesmos contatos já na criação da pessoa, com as mesmas regras de validação.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","People","{id_pessoa}","Contacts"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"8330015b-1b34-0f74-5226-e413ff1bb007","name":"Sucesso","originalRequest":{"header":[]},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"index\": 0,\n            \"contactName\": \"João Silva\",\n            \"success\": true,\n            \"message\": \"Contato criado e vinculado com sucesso.\"\n        },\n        {\n            \"index\": 1,\n            \"contactName\": \"Maria Souza\",\n            \"success\": true,\n            \"message\": \"Contato criado e vinculado com sucesso.\"\n        }\n    ],\n    \"dataResponseType\": \"List<PersonContactResultDTO>\",\n    \"elapsedTime\": null\n}"},{"id":"e79b8d4a-aab6-6b0f-0dbd-2a3825e291a0","name":"Erro — pessoa não encontrada","originalRequest":{"header":[]},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Pessoa não encontrada.\",\n            \"code\": 404,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"5bff1c66-dc3d-b572-abd3-1bf83b5c3ac4","name":"Erro — nenhum contato informado","originalRequest":{"header":[]},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Nenhum contato informado.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"58e560a6-c11d-5324-44ad-f5f047469448","name":"Sucesso — contato sem nome","originalRequest":{"header":[]},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"index\": 0,\n            \"contactName\": \"João Silva\",\n            \"success\": true,\n            \"message\": \"Contato criado e vinculado com sucesso.\"\n        },\n        {\n            \"index\": 1,\n            \"contactName\": null,\n            \"success\": false,\n            \"message\": \"O campo nome é obrigatório.\"\n        }\n    ],\n    \"dataResponseType\": \"List<PersonContactResultDTO>\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"ef938d46-79f0-1e71-06ae-20822a769d57"},{"name":"Lista Clientes","id":"d54cc3f7-9085-4fa6-831b-b3981b1fea00","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":""},"url":"{{URL}}:45715/external/integrations/thirdparty/getclient?page={{page}}&pageSize={{pageSize}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos clientes cadastrados no ERP.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas pessoas marcadas como cliente (<code>client = true</code>) e não excluídas.</li>\n<li>Este endpoint <strong>não</strong> aceita filtro (<code>Filter</code>) nem ordenação (<code>OrderBy</code>) dinâmicos — apenas <code>page</code> e <code>pageSize</code> são suportados. A listagem sai na ordem padrão do banco de dados (sem <code>ORDER BY</code> explícito), portanto a ordem pode variar entre chamadas.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>page</code></td>\n<td>Query param</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>Query param</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>int</td>\n<td>Id da pessoa</td>\n</tr>\n<tr>\n<td><code>response.data[].name</code> / <code>response.data[].name2</code></td>\n<td>string</td>\n<td>Nome e nome alternativo/fantasia</td>\n</tr>\n<tr>\n<td><code>response.data[].txId</code> / <code>response.data[].txIdFormated</code></td>\n<td>string</td>\n<td>CPF/CNPJ, sem e com máscara</td>\n</tr>\n<tr>\n<td><code>response.data[].typeTxId</code></td>\n<td>int</td>\n<td>Tipo de documento (ver tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].client</code></td>\n<td>boolean</td>\n<td>Sempre <code>true</code> nesta listagem (filtro do próprio endpoint)</td>\n</tr>\n<tr>\n<td><code>response.data[].situation</code></td>\n<td>int</td>\n<td>Situação do cadastro (ver tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].status</code></td>\n<td>int</td>\n<td>Código interno de status do cadastro (ver nota na tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].email</code> / <code>response.data[].emailNfe</code></td>\n<td>string</td>\n<td>E-mail principal e e-mail para NF-e</td>\n</tr>\n<tr>\n<td><code>response.data[].phone</code> / <code>response.data[].cellPhone1</code> / <code>response.data[].cellPhone2</code></td>\n<td>string|null</td>\n<td>Telefone fixo e celulares</td>\n</tr>\n<tr>\n<td><code>response.data[].birthDate</code></td>\n<td>date|null</td>\n<td>Data de nascimento (Pessoa Física) ou de fundação (Pessoa Jurídica)</td>\n</tr>\n<tr>\n<td><code>response.data[].gender</code></td>\n<td>int|null</td>\n<td>Gênero (ver tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].civilStatus</code></td>\n<td>int|null</td>\n<td>Estado civil (ver tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].identity</code></td>\n<td>string</td>\n<td>Número do RG</td>\n</tr>\n<tr>\n<td><code>response.data[].parentsName</code></td>\n<td>string</td>\n<td>Nome do(s) pai(s)/responsável</td>\n</tr>\n<tr>\n<td><code>response.data[].stateRegistration</code></td>\n<td>string</td>\n<td>Inscrição estadual</td>\n</tr>\n<tr>\n<td><code>response.data[].stateRegistrationType</code></td>\n<td>int</td>\n<td>Tipo de inscrição estadual (ver tabela de decodificação abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].municipalRegistration</code></td>\n<td>string</td>\n<td>Inscrição municipal</td>\n</tr>\n<tr>\n<td><code>response.data[].codeCountry</code></td>\n<td>string</td>\n<td>Código do país (tabela de países da NT, ver \"Cadastrar Pessoa\")</td>\n</tr>\n<tr>\n<td><code>response.data[].country</code></td>\n<td>string</td>\n<td>Nome do país</td>\n</tr>\n<tr>\n<td><code>response.data[].street</code> / <code>response.data[].streetType</code> / <code>response.data[].number</code> / <code>response.data[].neighborhood</code> / <code>response.data[].addressComplement</code> / <code>response.data[].addressReference</code> / <code>response.data[].city</code> / <code>response.data[].codeCityId</code> / <code>response.data[].state</code> / <code>response.data[].postalCode</code></td>\n<td>string</td>\n<td>Dados do endereço principal</td>\n</tr>\n<tr>\n<td><code>response.data[].peopleAddressMainId</code></td>\n<td>int|null</td>\n<td>Id do endereço principal da pessoa</td>\n</tr>\n<tr>\n<td><code>response.data[].companyPlaceId</code></td>\n<td>int|null</td>\n<td>Id do local/filial vinculado, quando houver</td>\n</tr>\n<tr>\n<td><code>response.data[].userId</code></td>\n<td>int|null</td>\n<td>Id do usuário do sistema vinculado à pessoa, quando houver</td>\n</tr>\n<tr>\n<td><code>response.data[].candidate</code> / <code>response.data[].carrier</code> / <code>response.data[].collaborator</code> / <code>response.data[].competitor</code> / <code>response.data[].expert</code> / <code>response.data[].houseLawyer</code> / <code>response.data[].ruralProducer</code> / <code>response.data[].supervisor</code> / <code>response.data[].supplier</code> / <code>response.data[].syndicate</code> / <code>response.data[].technical</code> / <code>response.data[].unlikeLawyer</code> / <code>response.data[].vendor</code></td>\n<td>boolean</td>\n<td>Indicadores de papel/perfil da pessoa no ERP (candidato, operadora/transportadora, colaborador, concorrente, perito, advogado da própria empresa, produtor rural, supervisor, fornecedor, sindicato, técnico, advogado da parte contrária, vendedor)</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>int</td>\n<td>Total de clientes encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>int</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>int</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>int</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p>Tabela de decodificação dos campos codificados:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Valores</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>typeTxId</code></td>\n<td><code>1</code> = Pessoa Jurídica, <code>2</code> = Pessoa Física, <code>3</code> = Estrangeiro</td>\n</tr>\n<tr>\n<td><code>situation</code></td>\n<td><code>1</code> = Contato, <code>2</code> = Prospect (obsoleto), <code>3</code> = Efetivo, <code>4</code> = Lead, <code>5</code> = Prospect</td>\n</tr>\n<tr>\n<td><code>gender</code></td>\n<td><code>1</code> = Masculino, <code>2</code> = Feminino</td>\n</tr>\n<tr>\n<td><code>civilStatus</code></td>\n<td><code>1</code> = Solteiro(a), <code>2</code> = Casado(a), <code>3</code> = Divorciado(a), <code>4</code> = Viúvo(a), <code>5</code> = União Estável, <code>6</code> = Separado(a)</td>\n</tr>\n<tr>\n<td><code>stateRegistrationType</code></td>\n<td><code>1</code> = Contribuinte, <code>2</code> = Isento, <code>9</code> = Não Contribuinte</td>\n</tr>\n<tr>\n<td><code>status</code></td>\n<td>Código interno de status do cadastro — não foi possível confirmar no repositório <code>Syntesis.SynGW</code> um enum documentado para este campo específico de <code>People.Status</code>; a confirmar com o time de backend o significado exato de cada valor</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Erros inesperados retornam <code>success: false</code> com mensagem técnica da exceção, HTTP 200.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca Cliente por CPF/CNPJ\" — busca um cliente específico com o mesmo recorte de dados de cliente.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getclient"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página</p>\n","type":"text/plain"},"key":"pageSize","value":"{{pageSize}}"}],"variable":[]}},"response":[{"id":"022217f5-93dd-4afb-88c4-f9c4679b9fbb","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getclient?page=1&pageSize=2","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","getclient"],"query":[{"key":"page","value":"1"},{"key":"pageSize","value":"2"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": \"xx\",\n                \"addressComplement\": \"xxxxxxxxxxxxxxxx\",\n                \"addressReference\": \"xxxxxx\",\n                \"birthDate\": \"1984-05-30T00:00:00\",\n                \"candidate\": false,\n                \"carrier\": false,\n                \"cellPhone1\": \"(xx)xxxx-xxxx\",\n                \"cellPhone2\": null,\n                \"city\": \"xxxxxxxxxx\",\n                \"civilStatus\": 1, // 1=Solteiro(a), 2=Casado(a), 3=Divorciado(a), 4=Viúvo(a), 5=União Estável, 6=Separado(a)\n                \"client\": true,\n                \"codeCityId\": 12345,\n                \"codeCountry\": \"123\",\n                \"collaborator\": false,\n                \"companyPlaceId\": null,\n                \"competitor\": false,\n                \"country\": \"Brasil\",\n                \"email\": \"teste@syntesis.com.br\",\n                \"emailNfe\": \"teste@syntesis.com.br\",\n                \"expert\": false,\n                \"gender\": 2, // 1=Masculino, 2=Feminino\n                \"houseLawyer\": false,\n                \"identity\": \"123456\",\n                \"municipalRegistration\": \"\",\n                \"name\": \"xxxxxx xxxxxx\",\n                \"name2\": \"xxxxx xxxxxx\",\n                \"neighborhood\": \"xxxxxx\",\n                \"number\": \"xxxxx\",\n                \"parentsName\": \"xxxxx xxxxxx\",\n                \"peopleAddressMainId\": 5,\n                \"phone\": \"(xx)xxxx-xxxx\",\n                \"postalCode\": \"xxxxx-xxx\",\n                \"ruralProducer\": false,\n                \"situation\": 3, // 1=Contato, 2=Prospect(obsoleto), 3=Efetivo, 4=Lead, 5=Prospect\n                \"state\": \"xx\",\n                \"stateRegistration\": \"\",\n                \"stateRegistrationType\": 9, // 1=Contribuinte, 2=Isento, 9=Não Contribuinte\n                \"status\": 1, // código interno de status do cadastro (a confirmar com o time de backend)\n                \"street\": \"xxxxx xxxxxx\",\n                \"streetType\": \"Rua\",\n                \"supervisor\": false,\n                \"supplier\": false,\n                \"syndicate\": false,\n                \"technical\": false,\n                \"txId\": \"xxxxxxxxxxx\",\n                \"txIdFormated\": \"xxx.xxx.xxx-xx\",\n                \"typeTxId\": 2, // 1=Pessoa Jurídica, 2=Pessoa Física, 3=Estrangeiro\n                \"unlikeLawyer\": false,\n                \"userId\": 4,\n                \"vendor\": false\n            },\n            {\n                \"id\": 17,\n                \"addressComplement\": \"\",\n                \"addressReference\": \"\",\n                \"birthDate\": null,\n                \"candidate\": false,\n                \"carrier\": false,\n                \"cellPhone1\": \"(xx)xxxxx-xxxx\",\n                \"cellPhone2\": null,\n                \"city\": \"xxxxxxxxxx\",\n                \"civilStatus\": null,\n                \"client\": true,\n                \"codeCityId\": 123456,\n                \"codeCountry\": \"xxxx\",\n                \"collaborator\": true,\n                \"companyPlaceId\": null,\n                \"competitor\": false,\n                \"country\": \"Brasil\",\n                \"email\": \"teste@syntesis.com.br\",\n                \"emailNfe\": \"teste@syntesis.com.br\",\n                \"expert\": false,\n                \"gender\": null,\n                \"houseLawyer\": false,\n                \"identity\": \"\",\n                \"municipalRegistration\": \"\",\n                \"name\": \"xxxxxx xxxx xxxxxxx\",\n                \"name2\": \"xxxxxx xxxx xxxxxxx\",\n                \"neighborhood\": \"xxxxx\",\n                \"number\": \"xxxx\",\n                \"parentsName\": \"\",\n                \"peopleAddressMainId\": 8,\n                \"phone\": \"(xx)xxxxx-xxxx\",\n                \"postalCode\": \"xxxxx-xxx\",\n                \"ruralProducer\": false,\n                \"situation\": 3,\n                \"state\": \"xx\",\n                \"stateRegistration\": \"\",\n                \"stateRegistrationType\": 9,\n                \"status\": 1,\n                \"street\": \"xxxxx xxxxxxx\",\n                \"streetType\": \"Rua\",\n                \"supervisor\": true,\n                \"supplier\": true,\n                \"syndicate\": false,\n                \"technical\": true,\n                \"txId\": \"xxxxxxxxxx\",\n                \"txIdFormated\": \"xxx.xxx.xxx-xx\",\n                \"typeTxId\": 2,\n                \"unlikeLawyer\": false,\n                \"userId\": 7,\n                \"vendor\": false\n            }\n        ],\n        \"totalRecords\": 21986,\n        \"page\": 1,\n        \"pageSize\": 2,\n        \"totalizers\": null,\n        \"totalPages\": 10993\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"d54cc3f7-9085-4fa6-831b-b3981b1fea00"},{"name":"Lista Locais","id":"68e31c59-7e06-4826-8d4f-f9b70e08828b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/companiesplacespaged?Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos locais (filiais/unidades da empresa) cadastrados no ERP.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna todos os locais não excluídos, <strong>incluindo os inativos</strong> — não há filtro por <code>Active</code> nesta listagem.</li>\n<li><code>txIdFormated</code> é calculado automaticamente a partir do tipo de documento do local: CNPJ mascarado quando o local é Pessoa Jurídica, CPF mascarado nos demais casos.</li>\n<li><code>Filter</code> e <code>OrderBy</code> aceitam um filtro/ordenação dinâmicos aplicáveis sobre os campos retornados na listagem (<code>id</code>, <code>description</code>, <code>code</code>, <code>txId</code>, <code>city</code>, <code>street</code>).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Page</code></td>\n<td>Query param</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td><code>PageSize</code></td>\n<td>Query param</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>Filter</code></td>\n<td>Query param</td>\n<td>Não</td>\n<td>Filtro dinâmico sobre os campos da listagem</td>\n</tr>\n<tr>\n<td><code>OrderBy</code></td>\n<td>Query param</td>\n<td>Não</td>\n<td>Ordenação dinâmica sobre os campos da listagem</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>int</td>\n<td>Id do local</td>\n</tr>\n<tr>\n<td><code>response.data[].description</code></td>\n<td>string</td>\n<td>Nome/descrição do local</td>\n</tr>\n<tr>\n<td><code>response.data[].code</code></td>\n<td>string</td>\n<td>Código do local</td>\n</tr>\n<tr>\n<td><code>response.data[].txId</code></td>\n<td>string</td>\n<td>CPF/CNPJ do local, sem máscara</td>\n</tr>\n<tr>\n<td><code>response.data[].txIdFormated</code></td>\n<td>string</td>\n<td>CPF/CNPJ do local, já formatado com máscara</td>\n</tr>\n<tr>\n<td><code>response.data[].city</code></td>\n<td>string</td>\n<td>Cidade do local</td>\n</tr>\n<tr>\n<td><code>response.data[].street</code></td>\n<td>string</td>\n<td>Logradouro do local</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>int</td>\n<td>Total de locais encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>int</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>int</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>int</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Falha inesperada ao consultar os locais</td>\n<td><code>success: false</code>, mensagem \"Falha ao listar Locais.\" (<code>code: 300</code>), HTTP 200</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","companiesplacespaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por páginas</p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"}],"variable":[]}},"response":[{"id":"da8dd8b6-af9f-4931-b354-92b6aadf51ed","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/companiesplacespaged?Page=1&PageSize=2&Filter={{filter}}&OrderBy={{order_by}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","companiesplacespaged"],"query":[{"key":"Page","value":"1"},{"key":"PageSize","value":"2"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": 1,\n                \"description\": \"Local 1\",\n                \"code\": \"01\",\n                \"txId\": \"0000000000000000\",\n                \"txIdFormated\": \"00.111.222/0001-00\", // CNPJ mascarado (local Pessoa Jurídica)\n                \"city\": \"Cidade\",\n                \"street\": \"Rua\"\n            },\n            {\n                \"id\": 2,\n                \"description\": \"Local 2\",\n                \"code\": \"02\",\n                \"txId\": \"00000000000000\",\n                \"txIdFormated\": \"00.000.444/0001-00\",\n                \"city\": \"Cidade\",\n                \"street\": \"Avenida\"\n            }\n        ],\n        \"totalRecords\": 2,\n        \"page\": 1,\n        \"pageSize\": 2,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"68e31c59-7e06-4826-8d4f-f9b70e08828b"},{"name":"Busca Cliente por CPF/CNPJ","id":"2a029f58-f20d-45cf-b8e0-862cfba60779","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/people/txid/{{txId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca uma pessoa pelo documento (CPF/CNPJ), retornando dados cadastrais, endereço principal e títulos a receber em aberto.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Por padrão, são retornados apenas registros com atributo <strong>cliente</strong> (<code>client = true</code>) marcado. É possível ampliar a busca para qualquer pessoa (cliente ou não) usando o parâmetro opcional <code>includeNonClients=true</code> na query string.</li>\n<li><code>birthDate</code> só é retornado quando a pessoa é Pessoa Física (<code>typeTxId = 2</code>); para CNPJ, vem <code>null</code>.</li>\n<li><code>titles</code> traz os títulos a receber (boletos/faturas) em aberto da pessoa — apenas quando ela é cliente. Cobrança do tipo boleto, sem baixa/perda e com o tipo de cobrança configurado para emissão de boleto.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code></td>\n<td>Path param</td>\n<td>Sim</td>\n<td>CPF ou CNPJ da pessoa</td>\n</tr>\n<tr>\n<td><code>includeNonClients</code></td>\n<td>Query param</td>\n<td>Não</td>\n<td><code>true</code> para incluir pessoas que não são clientes (leads, prospects etc.) na busca — padrão <code>false</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.id</code></td>\n<td>int</td>\n<td>Id da pessoa</td>\n</tr>\n<tr>\n<td><code>response.name</code> / <code>response.name2</code></td>\n<td>string</td>\n<td>Nome e nome alternativo/fantasia</td>\n</tr>\n<tr>\n<td><code>response.txId</code></td>\n<td>string</td>\n<td>CPF/CNPJ</td>\n</tr>\n<tr>\n<td><code>response.email</code></td>\n<td>string</td>\n<td>E-mail</td>\n</tr>\n<tr>\n<td><code>response.status</code></td>\n<td>int</td>\n<td>Código interno de status do cadastro (mesmo campo documentado em \"Lista Clientes\" — valor não confirmado no código-fonte)</td>\n</tr>\n<tr>\n<td><code>response.phone</code> / <code>response.cellPhone</code></td>\n<td>string</td>\n<td>Telefone fixo e celular</td>\n</tr>\n<tr>\n<td><code>response.birthDate</code></td>\n<td>date|null</td>\n<td>Data de nascimento — só preenchida quando a pessoa é Pessoa Física; <code>null</code> para CNPJ</td>\n</tr>\n<tr>\n<td><code>response.mainAddress</code></td>\n<td>object</td>\n<td>Endereço principal: <code>streetType</code>, <code>street</code>, <code>number</code>, <code>addressComplement</code>, <code>neighborhood</code>, <code>city</code>, <code>codeCityId</code>, <code>addressReference</code>, <code>state</code>, <code>postalCode</code>, <code>longitude</code>, <code>latitude</code></td>\n</tr>\n<tr>\n<td><code>response.titles[]</code></td>\n<td>array</td>\n<td>Títulos a receber em aberto da pessoa, apenas quando ela é cliente. Cada item: <code>id</code>, <code>billet</code> (<code>bankTitleNumber</code>, <code>balance</code>, <code>title</code>, <code>issueDate</code>, <code>expirationDate</code>, <code>processingDate</code>, <code>amount</code> com <code>value</code>/<code>finalValue</code>/<code>discount</code>/<code>fine</code>/<code>interest</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro (pessoa não encontrada).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhuma pessoa encontrada com o <code>txId</code> informado (respeitando o filtro de cliente)</td>\n<td><code>success: false</code>, mensagem \"Registro não encontrado.\" (<code>code: 404</code>), HTTP 200</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","people","txid","{{txId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"2f34ac59-6d55-4df0-bdfe-62e5abc5f793","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/people/txid/00000000000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"id\": 123456,\n        \"name\": \"xxxxx xxx xxxxxxx \",\n        \"name2\": \"\",\n        \"txId\": \"0000000000\",\n        \"email\": \"teste@syntesis.com.br\",\n        \"status\": 1,\n        \"phone\": \"(55) 3220-1350\",\n        \"birthDate\": \"2021-07-07\", // Quando CPF (Pessoa Física), irá retornar a data de nascimento. Quando CNPJ, irá retornar null.\n        \"cellPhone\": \"(55) 3220-1350\",\n        \"mainAddress\": {\n            \"streetType\": \"Rua\",\n            \"street\": \"Rua das laranjeiras\",\n            \"number\": \"123\",\n            \"addressComplement\": \"ap 01\",\n            \"neighborhood\": \"Centro\",\n            \"city\": \"Santa Maria\",\n            \"codeCityId\": 4316907,\n            \"addressReference\": \"Portão verde\",\n            \"state\": \"RS\",\n            \"postalCode\": \"00000-000\",\n            \"longitude\": \"00.0000\",\n            \"latitude\": \"00.0000\"\n        },\n        \"titles\": [\n            {\n                \"id\": 123456,\n                \"billet\": {\n                    \"bankTitleNumber\": null,\n                    \"balance\": 0.00,\n                    \"title\": \"FAT00000000000000\",\n                    \"issueDate\": \"2019-07-19\",\n                    \"expirationDate\": \"2019-08-15\",\n                    \"processingDate\": \"2021-07-07\",\n                    \"amount\": {\n                        \"value\": 0.00,\n                        \"finalValue\": 0.00,\n                        \"discount\": 0,\n                        \"fine\": 0,\n                        \"interest\": 0\n                    }\n                }\n            },\n            {\n                \"id\": 654321,\n                \"billet\": {\n                    \"bankTitleNumber\": null,\n                    \"balance\": 0.00,\n                    \"title\": \"FAT00000000000000\",\n                    \"issueDate\": \"2019-08-20\",\n                    \"expirationDate\": \"2019-09-15\",\n                    \"processingDate\": \"2021-07-07\",\n                    \"amount\": {\n                        \"value\": 0.00,\n                        \"finalValue\": 0.00,\n                        \"discount\": 0,\n                        \"fine\": 0,\n                        \"interest\": 0\n                    }\n                }\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"},{"id":"23acf11d-10c8-4457-b805-29a3b5b859e1","name":"Erro — pessoa não encontrada","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"Obtido no método de autenticação"}],"url":"{{URL}}:45715/external/integrations/thirdparty/people/txid/{{txId}}","description":"## Propósito\n\nBusca uma pessoa pelo documento (CPF/CNPJ), retornando dados cadastrais, endereço principal e títulos a receber em aberto.\n\n## Regras de negócio\n\n- Por padrão, são retornados apenas registros com atributo **cliente** (`client = true`) marcado. É possível ampliar a busca para qualquer pessoa (cliente ou não) usando o parâmetro opcional `includeNonClients=true` na query string.\n- `birthDate` só é retornado quando a pessoa é Pessoa Física (`typeTxId = 2`); para CNPJ, vem `null`.\n- `titles` traz os títulos a receber (boletos/faturas) em aberto da pessoa — apenas quando ela é cliente. Cobrança do tipo boleto, sem baixa/perda e com o tipo de cobrança configurado para emissão de boleto.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `txId` | Path param | Sim | CPF ou CNPJ da pessoa |\n| `includeNonClients` | Query param | Não | `true` para incluir pessoas que não são clientes (leads, prospects etc.) na busca — padrão `false` |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica sucesso da chamada |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.id` | int | Id da pessoa |\n| `response.name` / `response.name2` | string | Nome e nome alternativo/fantasia |\n| `response.txId` | string | CPF/CNPJ |\n| `response.email` | string | E-mail |\n| `response.status` | int | Código interno de status do cadastro (mesmo campo documentado em \"Lista Clientes\" — valor não confirmado no código-fonte) |\n| `response.phone` / `response.cellPhone` | string | Telefone fixo e celular |\n| `response.birthDate` | date\\|null | Data de nascimento — só preenchida quando a pessoa é Pessoa Física; `null` para CNPJ |\n| `response.mainAddress` | object | Endereço principal: `streetType`, `street`, `number`, `addressComplement`, `neighborhood`, `city`, `codeCityId`, `addressReference`, `state`, `postalCode`, `longitude`, `latitude` |\n| `response.titles[]` | array | Títulos a receber em aberto da pessoa, apenas quando ela é cliente. Cada item: `id`, `billet` (`bankTitleNumber`, `balance`, `title`, `issueDate`, `expirationDate`, `processingDate`, `amount` com `value`/`finalValue`/`discount`/`fine`/`interest`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro (pessoa não encontrada). |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Nenhuma pessoa encontrada com o `txId` informado (respeitando o filtro de cliente) | `success: false`, mensagem \"Registro não encontrado.\" (`code: 404`), HTTP 200 |"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Registro não encontrado.\",\n            \"code\": 404,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"2a029f58-f20d-45cf-b8e0-862cfba60779"},{"name":"Lista Tipos de Documentos","id":"ecedb2d1-1880-4ee8-bb67-629408169ec3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/getdocumentationtypes?Filter={{filter}}&OrderBy={{orderBy}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada de todos os tipos de documento cadastrados no ERP.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna todos os tipos de documento não excluídos, sem restrição de uso (inclui tipos padrão e tipos de Base de Conhecimento).</li>\n<li>Suporta filtro dinâmico (<code>Filter</code>) e ordenação dinâmica (<code>OrderBy</code>) sobre os campos retornados na listagem.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>Query param</td>\n<td>Não</td>\n<td>Filtro dinâmico sobre os campos da listagem</td>\n</tr>\n<tr>\n<td><code>OrderBy</code></td>\n<td>Query param</td>\n<td>Não</td>\n<td>Ordenação dinâmica sobre os campos da listagem</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>int</td>\n<td>Id do tipo de documento</td>\n</tr>\n<tr>\n<td><code>response.data[].code</code></td>\n<td>string</td>\n<td>Código do tipo de documento</td>\n</tr>\n<tr>\n<td><code>response.data[].title</code></td>\n<td>string</td>\n<td>Título do tipo de documento</td>\n</tr>\n<tr>\n<td><code>response.data[].description</code></td>\n<td>string</td>\n<td>Descrição do tipo de documento</td>\n</tr>\n<tr>\n<td><code>response.data[].active</code></td>\n<td>boolean</td>\n<td>Indica se o tipo de documento está ativo</td>\n</tr>\n<tr>\n<td><code>response.data[].allowAttachment</code></td>\n<td>boolean</td>\n<td>Indica se o tipo de documento permite anexo</td>\n</tr>\n<tr>\n<td><code>response.data[].allowMultimedia</code></td>\n<td>boolean</td>\n<td>Indica se o tipo de documento permite multimídia</td>\n</tr>\n<tr>\n<td><code>response.data[].defaultText</code></td>\n<td>string|null</td>\n<td>Texto padrão associado ao tipo de documento</td>\n</tr>\n<tr>\n<td><code>response.data[].useType.value</code> / <code>response.data[].useType.label</code></td>\n<td>int / string</td>\n<td>Uso do tipo de documento (ver tabela abaixo)</td>\n</tr>\n<tr>\n<td><code>response.data[].synsuiteCode</code></td>\n<td>int|null</td>\n<td>Código de integração com o Synsuite, quando houver</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>int</td>\n<td>Total de tipos de documento encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>int</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>int</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>int</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p>Tabela de <code>useType.value</code>:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Label</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Padrão</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Base de Conhecimento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Erros inesperados retornam <code>success: false</code> com mensagem técnica da exceção, HTTP 200.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getdocumentationtypes"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Opcional</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Opcional</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{orderBy}}"}],"variable":[]}},"response":[{"id":"fca44f66-c29b-410a-8afc-f1a4f4b79701","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getdocumentationtypes?Filter={{FILTER}}&OrderBy={{ORDERBY}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","getdocumentationtypes"],"query":[{"key":"Filter","value":"{{FILTER}}"},{"key":"OrderBy","value":"{{ORDERBY}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"active\": true,\n                \"code\": \"1.01\",\n                \"id\": 1,\n                \"title\": \"Documentos Adminsitrativos\",\n                \"description\": \"Documentos Adminsitrativos\",\n                \"defaultText\": \"\",\n                \"useType\": {\n                    \"value\": 1, // 1=Padrão, 2=Base de Conhecimento\n                    \"label\": \"Padrão\"\n                },\n                \"synsuiteCode\": null\n            },\n            {\n                \"active\": true,\n                \"code\": \"2.01\",\n                \"id\": 2,\n                \"title\": \"Documentos Técnicos\",\n                \"description\": \"Documentos Técnicos\",\n                \"defaultText\": \"\",\n                \"useType\": {\n                    \"value\": 1,\n                    \"label\": \"Padrão\"\n                },\n                \"synsuiteCode\": null\n            },\n            {\n                \"active\": true,\n                \"code\": \"1.02\",\n                \"id\": 3,\n                \"title\": \"Contrato\",\n                \"description\": \"\",\n                \"defaultText\": \"\",\n                \"useType\": {\n                    \"value\": 1,\n                    \"label\": \"Padrão\"\n                },\n                \"synsuiteCode\": null\n            },\n            {\n                \"active\": true,\n                \"code\": \"001\",\n                \"id\": 4,\n                \"title\": \"IP de Gerência\",\n                \"description\": \"IP de Gerência\",\n                \"defaultText\": null,\n                \"useType\": {\n                    \"value\": 1,\n                    \"label\": \"Padrão\"\n                },\n                \"synsuiteCode\": 1\n            },\n            {\n                \"active\": true,\n                \"code\": \"002.1\",\n                \"id\": 5,\n                \"title\": \"CPA - Documentos\",\n                \"description\": \"Anexos relacionados a Títulos à Pagar\",\n                \"defaultText\": null,\n                \"useType\": {\n                    \"value\": 1,\n                    \"label\": \"Padrão\"\n                },\n                \"synsuiteCode\": 2\n            }\n        ],\n        \"totalRecords\": 5,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"ecedb2d1-1880-4ee8-bb67-629408169ec3"},{"name":"Busca um documento de assinatura eletrônica","id":"a79815e8-3757-44b7-8a44-1cbc15480447","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/getdocumentlinktosignbycontract/123456","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os documentos de assinatura eletrônica vinculados a um contrato, incluindo o link para assinatura de cada documento (quando disponível na integradora).</p>\n<p><strong>Atenção:</strong> este endpoint NÃO lista tipos de documentos (essa é a rota <code>GetDocumentationTypes</code>, documentada em outro request desta coleção). Ele busca o(s) documento(s) de assinatura eletrônica associados a um contrato.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>O contrato informado deve existir no ERP (não precisa estar em nenhum estágio/status específico).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Busca o contrato pelo <code>contractId</code> informado na URL. Não há filtro por status/estágio do contrato — contratos cancelados, finalizados etc. também retornam documentos normalmente.</li>\n<li>Retorna <strong>todos</strong> os documentos de assinatura eletrônica vinculados ao contrato que possuam código de integração preenchido, independentemente do status da assinatura (aguardando assinatura, assinado, cancelado, expirado etc.) — este endpoint não filtra por status.</li>\n<li>Um documento é considerado vinculado ao contrato quando: (a) o campo de contrato da assinatura aponta diretamente para o contrato informado, OU (b) a assinatura está vinculada a uma etapa comercial (CRM) cujo contrato gerado é o contrato informado.</li>\n<li>Para cada documento retornado, o link de assinatura (<code>linkToSign</code>) é buscado em tempo real junto à integradora (ClickSign, D4Sign, Asten ou V-DS), localizando o signatário pelo e-mail do cliente do contrato.</li>\n<li>Os documentos são ordenados do mais recente para o mais antigo.</li>\n<li>Se o contrato não tiver nenhum documento de assinatura eletrônica com código de integração, a resposta é bem-sucedida e <code>response</code> vem como objeto vazio (<code>{}</code>), não como lista vazia — ver seção \"Estrutura da resposta\".</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractId</code></td>\n<td>Path param</td>\n<td>Sim</td>\n<td>Identificador (Id) do contrato no ERP</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> mesmo quando não há documentos vinculados; <code>false</code> apenas em erro de negócio (ex.: contrato não encontrado)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>array|object</td>\n<td>Lista de documentos encontrados (ver campos de cada item abaixo). Quando <strong>nenhum</strong> documento é encontrado, vem como objeto vazio <code>{}</code> em vez de lista vazia <code>[]</code> — trate os dois casos ao consumir a API</td>\n</tr>\n<tr>\n<td><code>response[].signatureId</code></td>\n<td>int</td>\n<td>Id da assinatura</td>\n</tr>\n<tr>\n<td><code>response[].description</code></td>\n<td>string</td>\n<td>Descrição do documento</td>\n</tr>\n<tr>\n<td><code>response[].contractId</code></td>\n<td>int</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>response[].assignmentId</code></td>\n<td>int|null</td>\n<td>Id da etapa comercial (CRM) vinculada, quando houver</td>\n</tr>\n<tr>\n<td><code>response[].integrationCode</code></td>\n<td>string</td>\n<td>Código de integração com a integradora de assinatura</td>\n</tr>\n<tr>\n<td><code>response[].personId</code></td>\n<td>int</td>\n<td>Id da pessoa signatária</td>\n</tr>\n<tr>\n<td><code>response[].personName</code></td>\n<td>string</td>\n<td>Nome da pessoa signatária</td>\n</tr>\n<tr>\n<td><code>response[].integrationType</code></td>\n<td>int</td>\n<td>Código da integradora (ver tabela abaixo)</td>\n</tr>\n<tr>\n<td><code>response[].integrationTypeDescription</code></td>\n<td>string</td>\n<td>Descrição da integradora</td>\n</tr>\n<tr>\n<td><code>response[].status</code></td>\n<td>string</td>\n<td>Status da assinatura (texto)</td>\n</tr>\n<tr>\n<td><code>response[].created</code></td>\n<td>datetime</td>\n<td>Data de criação do documento</td>\n</tr>\n<tr>\n<td><code>response[].expirationDate</code></td>\n<td>datetime|null</td>\n<td>Data de expiração da assinatura</td>\n</tr>\n<tr>\n<td><code>response[].linkToSign</code></td>\n<td>string</td>\n<td>Link para assinatura, buscado em tempo real na integradora; pode vir vazio se a integradora não retornar link para esse signatário</td>\n</tr>\n</tbody>\n</table>\n</div><p>Tabela de <code>integrationType</code>:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Integradora</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>V-DS (Voalle Document Signature)</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Asten</td>\n</tr>\n<tr>\n<td>2</td>\n<td>ClickSign</td>\n</tr>\n<tr>\n<td>3</td>\n<td>D4Sign</td>\n</tr>\n<tr>\n<td>99</td>\n<td>Não possui integração</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato não encontrado (Id inexistente ou excluído)</td>\n<td><code>success: false</code>, mensagem \"Não foi possível encontrar o contrato\" (<code>code: 300</code>), HTTP 200</td>\n</tr>\n<tr>\n<td>Nenhum documento de assinatura vinculado ao contrato</td>\n<td><code>success: true</code>, <code>response: {}</code> (não é erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Reenvia um documento de assinatura eletrônica\" — usa o <code>signatureId</code> retornado aqui para reenviar o link de assinatura por e-mail, SMS ou WhatsApp.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","suite","electronicsignatures","getdocumentlinktosignbycontract","123456"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"5745d263-9bcd-4b5a-a679-4f9e52dc0741","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/getdocumentlinktosignbycontract/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"signatureId\": 1,\n            \"description\": \"Documento gerado para assinatura eletronica\",\n            \"contractId\": 1234,\n            \"assignmentId\": null,\n            \"integrationCode\": \"5432ae4d-4e32-4e2a-9036-49d226dfa8f2\",\n            \"personId\": 1234,\n            \"personName\": \"JOAO DA SILVA\",\n            \"integrationType\": 0, // 0=V-DS, 1=Asten, 2=ClickSign, 3=D4Sign, 99=Sem integração\n            \"integrationTypeDescription\": \"V-DS\",\n            \"status\": \"Aguardando Assinaturas\",\n            \"created\": \"2025-05-21T17:26:38.641107\",\n            \"expirationDate\": null,\n            \"linkToSign\": \"\" // buscado em tempo real na integradora; pode vir vazio se a integradora não retornar link para esse signatário\n        }\n    ],\n    \"elapsedTime\": null\n}"},{"id":"25ea262f-79e8-4461-b514-ea5da1967efd","name":"Erro — Contrato não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/getdocumentlinktosignbycontract/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não foi possível encontrar o contrato\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"2a09c42f-84a6-4970-b0d2-c1975cd7103f","name":"Sucesso — nenhum documento vinculado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/getdocumentlinktosignbycontract/123456","description":"## Propósito\n\nRetorna os documentos de assinatura eletrônica vinculados a um contrato, incluindo o link para assinatura de cada documento (quando disponível na integradora).\n\n**Atenção:** este endpoint NÃO lista tipos de documentos (essa é a rota `GetDocumentationTypes`, documentada em outro request desta coleção). Ele busca o(s) documento(s) de assinatura eletrônica associados a um contrato.\n\n## Pré-requisitos\n\n- O contrato informado deve existir no ERP (não precisa estar em nenhum estágio/status específico).\n\n## Regras de negócio\n\n- Busca o contrato pelo `contractId` informado na URL. Não há filtro por status/estágio do contrato — contratos cancelados, finalizados etc. também retornam documentos normalmente.\n- Retorna **todos** os documentos de assinatura eletrônica vinculados ao contrato que possuam código de integração preenchido, independentemente do status da assinatura (aguardando assinatura, assinado, cancelado, expirado etc.) — este endpoint não filtra por status.\n- Um documento é considerado vinculado ao contrato quando: (a) o campo de contrato da assinatura aponta diretamente para o contrato informado, OU (b) a assinatura está vinculada a uma etapa comercial (CRM) cujo contrato gerado é o contrato informado.\n- Para cada documento retornado, o link de assinatura (`linkToSign`) é buscado em tempo real junto à integradora (ClickSign, D4Sign, Asten ou V-DS), localizando o signatário pelo e-mail do cliente do contrato.\n- Os documentos são ordenados do mais recente para o mais antigo.\n- Se o contrato não tiver nenhum documento de assinatura eletrônica com código de integração, a resposta é bem-sucedida e `response` vem como objeto vazio (`{}`), não como lista vazia — ver seção \"Estrutura da resposta\".\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `contractId` | Path param | Sim | Identificador (Id) do contrato no ERP |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` mesmo quando não há documentos vinculados; `false` apenas em erro de negócio (ex.: contrato não encontrado) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | array\\|object | Lista de documentos encontrados (ver campos de cada item abaixo). Quando **nenhum** documento é encontrado, vem como objeto vazio `{}` em vez de lista vazia `[]` — trate os dois casos ao consumir a API |\n| `response[].signatureId` | int | Id da assinatura |\n| `response[].description` | string | Descrição do documento |\n| `response[].contractId` | int | Id do contrato |\n| `response[].assignmentId` | int\\|null | Id da etapa comercial (CRM) vinculada, quando houver |\n| `response[].integrationCode` | string | Código de integração com a integradora de assinatura |\n| `response[].personId` | int | Id da pessoa signatária |\n| `response[].personName` | string | Nome da pessoa signatária |\n| `response[].integrationType` | int | Código da integradora (ver tabela abaixo) |\n| `response[].integrationTypeDescription` | string | Descrição da integradora |\n| `response[].status` | string | Status da assinatura (texto) |\n| `response[].created` | datetime | Data de criação do documento |\n| `response[].expirationDate` | datetime\\|null | Data de expiração da assinatura |\n| `response[].linkToSign` | string | Link para assinatura, buscado em tempo real na integradora; pode vir vazio se a integradora não retornar link para esse signatário |\n\nTabela de `integrationType`:\n\n| Valor | Integradora |\n| --- | --- |\n| 0 | V-DS (Voalle Document Signature) |\n| 1 | Asten |\n| 2 | ClickSign |\n| 3 | D4Sign |\n| 99 | Não possui integração |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Contrato não encontrado (Id inexistente ou excluído) | `success: false`, mensagem \"Não foi possível encontrar o contrato\" (`code: 300`), HTTP 200 |\n| Nenhum documento de assinatura vinculado ao contrato | `success: true`, `response: {}` (não é erro) |\n\n## Fluxo relacionado\n\n- \"Reenvia um documento de assinatura eletrônica\" — usa o `signatureId` retornado aqui para reenviar o link de assinatura por e-mail, SMS ou WhatsApp."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {}, // objeto vazio, não lista vazia, quando o contrato não possui documento de assinatura eletrônica integrado\n    \"elapsedTime\": null\n}"}],"_postman_id":"a79815e8-3757-44b7-8a44-1cbc15480447"},{"name":"Reenvia um documento de assinatura eletrônica","id":"fff0eb4a-12fe-4fb1-a3c8-7d28e46a89a3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Reenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>É obrigatório informar <code>assignmentId</code> OU <code>signatureId</code> (pelo menos um dos dois).</li>\n<li><code>dispatchType</code> deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.</li>\n<li>A assinatura eletrônica é localizada por <code>signatureId</code> (se informado) ou por <code>assignmentId</code> (caso contrário), desconsiderando registros excluídos.</li>\n<li>A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.</li>\n<li>Compatibilidade entre <code>dispatchType</code> e a integradora do documento:<ul>\n<li><code>dispatchType = 0</code> (Email): disponível apenas para as integradoras ClickSign e D4Sign.</li>\n<li><code>dispatchType = 1</code> (Sms) ou <code>2</code> (WhatsApp): disponível apenas para a integradora ClickSign.</li>\n<li>Qualquer outra combinação retorna erro de método de envio indisponível.</li>\n</ul>\n</li>\n<li>São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.</li>\n<li>⚠ <strong>Comportamento a observar:</strong> se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com <code>response: {}</code> — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.</li>\n<li>Se <strong>todos</strong> os reenvios falharem na integradora, a API retorna erro. Se <strong>pelo menos um</strong> for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (<code>success: true</code>). Se todos forem enviados com sucesso, retorna sucesso simples.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Valores aceitos</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code></td>\n<td>Um dos dois (<code>assignmentId</code> ou <code>signatureId</code>)</td>\n<td>Id da solicitação vinculada à assinatura</td>\n</tr>\n<tr>\n<td><code>signatureId</code></td>\n<td>Um dos dois (<code>assignmentId</code> ou <code>signatureId</code>)</td>\n<td>Id do documento/processo de assinatura eletrônica</td>\n</tr>\n<tr>\n<td><code>dispatchType</code></td>\n<td>Sim</td>\n<td><code>0</code> = Email, <code>1</code> = Sms, <code>2</code> = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>false</code> apenas em erro de negócio; permanece <code>true</code> mesmo quando parte dos documentos falha no reenvio (aviso)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null|object</td>\n<td>Mesma estrutura em sucesso e erro. Sempre <code>null</code>, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio <code>{}</code> mesmo em cenário de sucesso.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem retornada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum <code>assignmentId</code> nem <code>signatureId</code> informado</td>\n<td>\"Valores não repassados ao controlador\"</td>\n</tr>\n<tr>\n<td><code>dispatchType</code> fora do enum válido</td>\n<td>\"Tipo de reenvio não encontrado!\"</td>\n</tr>\n<tr>\n<td>Assinatura/documento não encontrado</td>\n<td>\"Não foi possível encontrar o documento.\"</td>\n</tr>\n<tr>\n<td>Status diferente de \"Aguardando Assinaturas\"</td>\n<td>\"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\"</td>\n</tr>\n<tr>\n<td><code>dispatchType</code> incompatível com a integradora do documento</td>\n<td>\"Método de envio não disponível para essa integradora de assinatura eletrônica\"</td>\n</tr>\n<tr>\n<td>Falha no reenvio de todos os documentos vinculados</td>\n<td>\"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\")</td>\n</tr>\n<tr>\n<td>Falha no reenvio de parte dos documentos vinculados</td>\n<td>\"Alguns documentos falharam no momento do envio!\" (aviso — <code>success: true</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo <code>success</code> e pelo <code>type</code> da mensagem.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca um documento de assinatura eletrônica\" — usada para obter o <code>signatureId</code> do documento antes do reenvio.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","suite","electronicsignatures","resend"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"8edaad70-9a6a-42e6-8006-a7ca12bbf303","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"## Propósito\n\nReenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.\n\n## Pré-requisitos\n\n- O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".\n\n## Regras de negócio\n\n- É obrigatório informar `assignmentId` OU `signatureId` (pelo menos um dos dois).\n- `dispatchType` deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.\n- A assinatura eletrônica é localizada por `signatureId` (se informado) ou por `assignmentId` (caso contrário), desconsiderando registros excluídos.\n- A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.\n- Compatibilidade entre `dispatchType` e a integradora do documento:\n  - `dispatchType = 0` (Email): disponível apenas para as integradoras ClickSign e D4Sign.\n  - `dispatchType = 1` (Sms) ou `2` (WhatsApp): disponível apenas para a integradora ClickSign.\n  - Qualquer outra combinação retorna erro de método de envio indisponível.\n- São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.\n- ⚠ **Comportamento a observar:** se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com `response: {}` — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.\n- Se **todos** os reenvios falharem na integradora, a API retorna erro. Se **pelo menos um** for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (`success: true`). Se todos forem enviados com sucesso, retorna sucesso simples.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `assignmentId` | Um dos dois (`assignmentId` ou `signatureId`) | Id da solicitação vinculada à assinatura |\n| `signatureId` | Um dos dois (`assignmentId` ou `signatureId`) | Id do documento/processo de assinatura eletrônica |\n| `dispatchType` | Sim | `0` = Email, `1` = Sms, `2` = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas em erro de negócio; permanece `true` mesmo quando parte dos documentos falha no reenvio (aviso) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null\\|object | Mesma estrutura em sucesso e erro. Sempre `null`, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio `{}` mesmo em cenário de sucesso. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Nenhum `assignmentId` nem `signatureId` informado | \"Valores não repassados ao controlador\" |\n| `dispatchType` fora do enum válido | \"Tipo de reenvio não encontrado!\" |\n| Assinatura/documento não encontrado | \"Não foi possível encontrar o documento.\" |\n| Status diferente de \"Aguardando Assinaturas\" | \"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\" |\n| `dispatchType` incompatível com a integradora do documento | \"Método de envio não disponível para essa integradora de assinatura eletrônica\" |\n| Falha no reenvio de todos os documentos vinculados | \"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\") |\n| Falha no reenvio de parte dos documentos vinculados | \"Alguns documentos falharam no momento do envio!\" (aviso — `success: true`) |\n\nTodos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo `success` e pelo `type` da mensagem.\n\n## Fluxo relacionado\n\n- \"Busca um documento de assinatura eletrônica\" — usada para obter o `signatureId` do documento antes do reenvio."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Documento(s) reenviado(s) com sucesso!\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"407a284a-1db3-4253-afa9-68cd75e94710","name":"Alerta — falha parcial no envio","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"## Propósito\n\nReenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.\n\n## Pré-requisitos\n\n- O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".\n\n## Regras de negócio\n\n- É obrigatório informar `assignmentId` OU `signatureId` (pelo menos um dos dois).\n- `dispatchType` deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.\n- A assinatura eletrônica é localizada por `signatureId` (se informado) ou por `assignmentId` (caso contrário), desconsiderando registros excluídos.\n- A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.\n- Compatibilidade entre `dispatchType` e a integradora do documento:\n  - `dispatchType = 0` (Email): disponível apenas para as integradoras ClickSign e D4Sign.\n  - `dispatchType = 1` (Sms) ou `2` (WhatsApp): disponível apenas para a integradora ClickSign.\n  - Qualquer outra combinação retorna erro de método de envio indisponível.\n- São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.\n- ⚠ **Comportamento a observar:** se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com `response: {}` — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.\n- Se **todos** os reenvios falharem na integradora, a API retorna erro. Se **pelo menos um** for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (`success: true`). Se todos forem enviados com sucesso, retorna sucesso simples.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `assignmentId` | Um dos dois (`assignmentId` ou `signatureId`) | Id da solicitação vinculada à assinatura |\n| `signatureId` | Um dos dois (`assignmentId` ou `signatureId`) | Id do documento/processo de assinatura eletrônica |\n| `dispatchType` | Sim | `0` = Email, `1` = Sms, `2` = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas em erro de negócio; permanece `true` mesmo quando parte dos documentos falha no reenvio (aviso) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null\\|object | Mesma estrutura em sucesso e erro. Sempre `null`, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio `{}` mesmo em cenário de sucesso. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Nenhum `assignmentId` nem `signatureId` informado | \"Valores não repassados ao controlador\" |\n| `dispatchType` fora do enum válido | \"Tipo de reenvio não encontrado!\" |\n| Assinatura/documento não encontrado | \"Não foi possível encontrar o documento.\" |\n| Status diferente de \"Aguardando Assinaturas\" | \"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\" |\n| `dispatchType` incompatível com a integradora do documento | \"Método de envio não disponível para essa integradora de assinatura eletrônica\" |\n| Falha no reenvio de todos os documentos vinculados | \"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\") |\n| Falha no reenvio de parte dos documentos vinculados | \"Alguns documentos falharam no momento do envio!\" (aviso — `success: true`) |\n\nTodos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo `success` e pelo `type` da mensagem.\n\n## Fluxo relacionado\n\n- \"Busca um documento de assinatura eletrônica\" — usada para obter o `signatureId` do documento antes do reenvio."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Alguns documentos falharam no momento do envio!\",\n            \"code\": null,\n            \"type\": \"Warn\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"b1ec5c33-6d16-4395-a2ce-2b2bb92c5890","name":"Erro — falha no envio de todos os documentos","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"## Propósito\n\nReenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.\n\n## Pré-requisitos\n\n- O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".\n\n## Regras de negócio\n\n- É obrigatório informar `assignmentId` OU `signatureId` (pelo menos um dos dois).\n- `dispatchType` deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.\n- A assinatura eletrônica é localizada por `signatureId` (se informado) ou por `assignmentId` (caso contrário), desconsiderando registros excluídos.\n- A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.\n- Compatibilidade entre `dispatchType` e a integradora do documento:\n  - `dispatchType = 0` (Email): disponível apenas para as integradoras ClickSign e D4Sign.\n  - `dispatchType = 1` (Sms) ou `2` (WhatsApp): disponível apenas para a integradora ClickSign.\n  - Qualquer outra combinação retorna erro de método de envio indisponível.\n- São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.\n- ⚠ **Comportamento a observar:** se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com `response: {}` — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.\n- Se **todos** os reenvios falharem na integradora, a API retorna erro. Se **pelo menos um** for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (`success: true`). Se todos forem enviados com sucesso, retorna sucesso simples.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `assignmentId` | Um dos dois (`assignmentId` ou `signatureId`) | Id da solicitação vinculada à assinatura |\n| `signatureId` | Um dos dois (`assignmentId` ou `signatureId`) | Id do documento/processo de assinatura eletrônica |\n| `dispatchType` | Sim | `0` = Email, `1` = Sms, `2` = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas em erro de negócio; permanece `true` mesmo quando parte dos documentos falha no reenvio (aviso) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null\\|object | Mesma estrutura em sucesso e erro. Sempre `null`, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio `{}` mesmo em cenário de sucesso. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Nenhum `assignmentId` nem `signatureId` informado | \"Valores não repassados ao controlador\" |\n| `dispatchType` fora do enum válido | \"Tipo de reenvio não encontrado!\" |\n| Assinatura/documento não encontrado | \"Não foi possível encontrar o documento.\" |\n| Status diferente de \"Aguardando Assinaturas\" | \"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\" |\n| `dispatchType` incompatível com a integradora do documento | \"Método de envio não disponível para essa integradora de assinatura eletrônica\" |\n| Falha no reenvio de todos os documentos vinculados | \"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\") |\n| Falha no reenvio de parte dos documentos vinculados | \"Alguns documentos falharam no momento do envio!\" (aviso — `success: true`) |\n\nTodos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo `success` e pelo `type` da mensagem.\n\n## Fluxo relacionado\n\n- \"Busca um documento de assinatura eletrônica\" — usada para obter o `signatureId` do documento antes do reenvio."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não foi possível envia o(s) documento(s)!\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"b151f1cf-a053-4c7c-a2db-1db1c3fd9221","name":"Erro — documento não encontrado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"## Propósito\n\nReenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.\n\n## Pré-requisitos\n\n- O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".\n\n## Regras de negócio\n\n- É obrigatório informar `assignmentId` OU `signatureId` (pelo menos um dos dois).\n- `dispatchType` deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.\n- A assinatura eletrônica é localizada por `signatureId` (se informado) ou por `assignmentId` (caso contrário), desconsiderando registros excluídos.\n- A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.\n- Compatibilidade entre `dispatchType` e a integradora do documento:\n  - `dispatchType = 0` (Email): disponível apenas para as integradoras ClickSign e D4Sign.\n  - `dispatchType = 1` (Sms) ou `2` (WhatsApp): disponível apenas para a integradora ClickSign.\n  - Qualquer outra combinação retorna erro de método de envio indisponível.\n- São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.\n- ⚠ **Comportamento a observar:** se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com `response: {}` — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.\n- Se **todos** os reenvios falharem na integradora, a API retorna erro. Se **pelo menos um** for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (`success: true`). Se todos forem enviados com sucesso, retorna sucesso simples.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `assignmentId` | Um dos dois (`assignmentId` ou `signatureId`) | Id da solicitação vinculada à assinatura |\n| `signatureId` | Um dos dois (`assignmentId` ou `signatureId`) | Id do documento/processo de assinatura eletrônica |\n| `dispatchType` | Sim | `0` = Email, `1` = Sms, `2` = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas em erro de negócio; permanece `true` mesmo quando parte dos documentos falha no reenvio (aviso) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null\\|object | Mesma estrutura em sucesso e erro. Sempre `null`, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio `{}` mesmo em cenário de sucesso. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Nenhum `assignmentId` nem `signatureId` informado | \"Valores não repassados ao controlador\" |\n| `dispatchType` fora do enum válido | \"Tipo de reenvio não encontrado!\" |\n| Assinatura/documento não encontrado | \"Não foi possível encontrar o documento.\" |\n| Status diferente de \"Aguardando Assinaturas\" | \"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\" |\n| `dispatchType` incompatível com a integradora do documento | \"Método de envio não disponível para essa integradora de assinatura eletrônica\" |\n| Falha no reenvio de todos os documentos vinculados | \"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\") |\n| Falha no reenvio de parte dos documentos vinculados | \"Alguns documentos falharam no momento do envio!\" (aviso — `success: true`) |\n\nTodos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo `success` e pelo `type` da mensagem.\n\n## Fluxo relacionado\n\n- \"Busca um documento de assinatura eletrônica\" — usada para obter o `signatureId` do documento antes do reenvio."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não foi possível encontrar o documento.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"8b6c4932-9d83-418e-9530-988952d1bb39","name":"Erro — método de envio não disponível para a integradora","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"assignmentId\": null, //Id da solicitação vinculada\n  \"signatureId\": null, //Id do documento de assinatura eletrônica. É obrigatório preencher o assignmentId ou signatureId.\n  \"dispatchType\": 0 //Tipo de reenvio, pode variar conforme a integradora de assinatura eletrônica. 0 = Email, 1 = Sms, 2 = WhatsApp (conforme integrador)\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/suite/electronicsignatures/resend","description":"## Propósito\n\nReenvia o link de assinatura eletrônica de um documento (ou de todos os documentos vinculados a um processo de assinatura/solicitação) via e-mail, SMS ou WhatsApp, dependendo da integradora utilizada. Disponível para ClickSign e D4Sign.\n\n## Pré-requisitos\n\n- O processo de assinatura precisa estar com status \"Aguardando Assinaturas\".\n\n## Regras de negócio\n\n- É obrigatório informar `assignmentId` OU `signatureId` (pelo menos um dos dois).\n- `dispatchType` deve ser um dos valores válidos do enum (0 = Email, 1 = Sms, 2 = WhatsApp); um valor fora dessa faixa retorna erro.\n- A assinatura eletrônica é localizada por `signatureId` (se informado) ou por `assignmentId` (caso contrário), desconsiderando registros excluídos.\n- A assinatura precisa estar com status \"Aguardando Assinaturas\"; qualquer outro status bloqueia o reenvio.\n- Compatibilidade entre `dispatchType` e a integradora do documento:\n  - `dispatchType = 0` (Email): disponível apenas para as integradoras ClickSign e D4Sign.\n  - `dispatchType = 1` (Sms) ou `2` (WhatsApp): disponível apenas para a integradora ClickSign.\n  - Qualquer outra combinação retorna erro de método de envio indisponível.\n- São reenviados todos os documentos vinculados à assinatura, um a um, do mais recente para o mais antigo.\n- ⚠ **Comportamento a observar:** se o documento mais recente da lista não tiver código de integração preenchido (ex.: ainda em construção), o reenvio é interrompido imediatamente e a API retorna sucesso com `response: {}` — sem tentar os demais documentos da lista, mesmo que eles tenham código de integração válido.\n- Se **todos** os reenvios falharem na integradora, a API retorna erro. Se **pelo menos um** for enviado com sucesso e algum falhar, retorna um aviso, mas a operação é considerada bem-sucedida (`success: true`). Se todos forem enviados com sucesso, retorna sucesso simples.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Valores aceitos |\n| --- | --- | --- |\n| `assignmentId` | Um dos dois (`assignmentId` ou `signatureId`) | Id da solicitação vinculada à assinatura |\n| `signatureId` | Um dos dois (`assignmentId` ou `signatureId`) | Id do documento/processo de assinatura eletrônica |\n| `dispatchType` | Sim | `0` = Email, `1` = Sms, `2` = WhatsApp (disponibilidade depende da integradora — ver Regras de negócio) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas em erro de negócio; permanece `true` mesmo quando parte dos documentos falha no reenvio (aviso) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null\\|object | Mesma estrutura em sucesso e erro. Sempre `null`, exceto quando o documento mais recente não tem código de integração (ver \"Regras de negócio\"), caso em que vem como objeto vazio `{}` mesmo em cenário de sucesso. |\n\n## Erros comuns\n\n| Situação | Mensagem retornada |\n| --- | --- |\n| Nenhum `assignmentId` nem `signatureId` informado | \"Valores não repassados ao controlador\" |\n| `dispatchType` fora do enum válido | \"Tipo de reenvio não encontrado!\" |\n| Assinatura/documento não encontrado | \"Não foi possível encontrar o documento.\" |\n| Status diferente de \"Aguardando Assinaturas\" | \"Não é possível realizar o reenvio do documento pois está com Status de {status atual}\" |\n| `dispatchType` incompatível com a integradora do documento | \"Método de envio não disponível para essa integradora de assinatura eletrônica\" |\n| Falha no reenvio de todos os documentos vinculados | \"Não foi possível envia o(s) documento(s)!\" (mensagem reproduzida tal como retornada pela API, com o erro de digitação em \"envia\") |\n| Falha no reenvio de parte dos documentos vinculados | \"Alguns documentos falharam no momento do envio!\" (aviso — `success: true`) |\n\nTodos os cenários acima retornam HTTP 200; a distinção de sucesso/erro é feita pelo campo `success` e pelo `type` da mensagem.\n\n## Fluxo relacionado\n\n- \"Busca um documento de assinatura eletrônica\" — usada para obter o `signatureId` do documento antes do reenvio."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Método de envio não disponível para essa integradora de assinatura eletrônica\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"fff0eb4a-12fe-4fb1-a3c8-7d28e46a89a3"},{"name":"Validar se data é feriado","id":"e8990e90-6bf1-48f3-a7e0-f54debda8430","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"date\":\"AAAA-MM-DD\",\n    \"UF\":\"RS\",\n    \"city\":\"string\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/isholiday","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Verifica se uma data é feriado (nacional, estadual ou municipal), consultando a tabela de feriados cadastrada no próprio ERP.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>date</code></td>\n<td>Não</td>\n<td>Data a verificar, formato <code>AAAA-MM-DD</code>. Se omitida, usa a data atual.</td>\n</tr>\n<tr>\n<td><code>UF</code></td>\n<td>Não</td>\n<td>Sigla do estado (ex.: \"SP\"), 2 letras. Passa a ser obrigatória se <code>city</code> for informado.</td>\n</tr>\n<tr>\n<td><code>city</code></td>\n<td>Não</td>\n<td>Nome do município. Se informado, exige <code>UF</code> junto. Se omitido, considera apenas feriados estaduais/nacionais/internacionais.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Os feriados vêm de uma tabela própria do ERP (cadastro manual/administrativo, módulo Suite) — não há integração com nenhuma API externa de feriados.</li>\n<li><code>UF</code> só aceita a sigla de 2 letras; nome completo do estado não é reconhecido.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.isHoliday</code></td>\n<td>boolean</td>\n<td>Indica se a data é feriado</td>\n</tr>\n<tr>\n<td><code>response.name</code></td>\n<td>string</td>\n<td>Nome do feriado, quando aplicável</td>\n</tr>\n<tr>\n<td><code>response.date</code></td>\n<td>string</td>\n<td>Data verificada</td>\n</tr>\n<tr>\n<td><code>response.city</code></td>\n<td>string</td>\n<td>Preenchido apenas quando o feriado é municipal</td>\n</tr>\n<tr>\n<td><code>response.scope</code></td>\n<td>string</td>\n<td>Abrangência do feriado: <code>Municipal</code>, <code>Estadual</code>, <code>Nacional</code> ou <code>Internacional</code></td>\n</tr>\n<tr>\n<td><code>response.uf</code></td>\n<td>string</td>\n<td>UF do feriado, quando aplicável</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>city</code> informado sem <code>UF</code></td>\n<td>\"Quando informada a Cidade é obrigatório especificar a UF\"</td>\n</tr>\n<tr>\n<td><code>UF</code> inválida ou inexistente</td>\n<td>\"O estado informado é inválido ou não existe no sistema.\"</td>\n</tr>\n<tr>\n<td><code>date</code> em formato inválido</td>\n<td>\"Data informada é inválida ou não está num formato correto. Informe a data desejada no formato AAAA-MM-DD.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima. Verifique sempre o campo de sucesso no corpo da resposta.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","isholiday"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"cdab20d9-d502-43c8-bd7f-5b018723cbe7","name":"É feriado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"date\":\"2023-12-31\",\n    \"UF\":\"RS\",\n    \"city\":\"Santa Maria\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}:45715//external/integrations/thirdparty/isholiday"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":""}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"isHoliday\": true,\n        \"name\": \"Feriado em Santa Maria\",\n        \"date\": \"2024-05-13\",\n        \"city\": \"Santa Maria\",\n        \"scope\": \"Municipal\",\n        \"uf\": \"RS\"\n    },\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"e58ce032-63bc-4714-9f09-3ef5d60ca8ee","name":"Não é feriado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"date\":\"2023-12-31\",\n    \"UF\":\"RS\",\n    \"city\":\"Santa Maria\"\n}","options":{"raw":{"language":"json"}}},"url":"{{url}}:45715//external/integrations/thirdparty/isholiday"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":""}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"isHoliday\": false,\n        \"name\": \"\",\n        \"date\": \"2024-05-13\",\n        \"city\": \"\",\n        \"scope\": \"\",\n        \"uf\": \"\"\n    },\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"e8990e90-6bf1-48f3-a7e0-f54debda8430"},{"name":"Lista Contatos de uma Pessoa por CNPJ","id":"be2707a0-390d-4762-c1a2-9e759856e8a8","request":{"method":"GET","header":[{"value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/People/Contacts/{txId}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista os contatos vinculados a uma pessoa (empresa), identificada pelo CNPJ.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>txId</code> informado é normalizado (apenas dígitos/letras maiúsculas) e buscado apenas entre pessoas do tipo Pessoa Jurídica (CNPJ) — este endpoint não localiza pessoa por CPF.</li>\n<li>Retorna a lista de contatos ativos (não excluídos) vinculados à empresa informada. Se não houver contatos vinculados, retorna uma lista vazia (<code>success: true</code>, <code>response: []</code>).</li>\n<li>Cada contato pode opcionalmente ter uma função de CRM associada (<code>crmFunctionName</code>), indicadores de tarefa em aberto (<code>openTask</code>), usuário-chave (<code>keyUser</code>) e se já foi revisado (<code>revisedContact</code>).</li>\n<li>Se o CNPJ informado não corresponder a nenhuma pessoa cadastrada, a chamada retorna erro de negócio (ver \"Erros comuns\").</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code></td>\n<td>Path param</td>\n<td>Sim</td>\n<td>CNPJ da empresa</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica sucesso da chamada</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].contactId</code></td>\n<td>int</td>\n<td>Id do contato</td>\n</tr>\n<tr>\n<td><code>response[].name</code></td>\n<td>string</td>\n<td>Nome do contato</td>\n</tr>\n<tr>\n<td><code>response[].txId</code></td>\n<td>string|null</td>\n<td>CPF/CNPJ do contato, quando cadastrado</td>\n</tr>\n<tr>\n<td><code>response[].email</code></td>\n<td>string|null</td>\n<td>E-mail do contato</td>\n</tr>\n<tr>\n<td><code>response[].phone</code></td>\n<td>string|null</td>\n<td>Telefone fixo do contato</td>\n</tr>\n<tr>\n<td><code>response[].cellPhone1</code></td>\n<td>string|null</td>\n<td>Celular principal do contato</td>\n</tr>\n<tr>\n<td><code>response[].cellPhone2</code></td>\n<td>string|null</td>\n<td>Celular secundário do contato</td>\n</tr>\n<tr>\n<td><code>response[].crmFunctionId</code> / <code>response[].crmFunctionName</code></td>\n<td>int|null / string|null</td>\n<td>Função de CRM associada ao contato, quando houver</td>\n</tr>\n<tr>\n<td><code>response[].openTask</code></td>\n<td>boolean</td>\n<td>Indica se há tarefa em aberto vinculada ao contato</td>\n</tr>\n<tr>\n<td><code>response[].keyUser</code></td>\n<td>boolean</td>\n<td>Indica se o contato é usuário-chave</td>\n</tr>\n<tr>\n<td><code>response[].revisedContact</code></td>\n<td>boolean</td>\n<td>Indica se o contato já foi revisado</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>response</code> vem como lista vazia (<code>[]</code>) quando a empresa não tem nenhum contato vinculado.</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CNPJ não corresponde a nenhuma pessoa cadastrada</td>\n<td><code>success: false</code>, mensagem \"Pessoa não encontrada pelo CNPJ informado\" (<code>code: 404</code>), HTTP 200</td>\n</tr>\n<tr>\n<td><code>txId</code> não informado (path vazio)</td>\n<td><code>success: false</code>, mensagem \"CNPJ não informado\" (<code>code: 300</code>), HTTP 200</td>\n</tr>\n</tbody>\n</table>\n</div>","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","People","Contacts","{txId}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"3872a700-0570-e846-1795-2748a5ae209d","name":"Sucesso","originalRequest":{"method":"GET","header":[{"value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/People/Contacts/{txId}","description":"## Propósito\n\nLista os contatos vinculados a uma pessoa (empresa), identificada pelo CNPJ.\n\n## Regras de negócio\n\n- O `txId` informado é normalizado (apenas dígitos/letras maiúsculas) e buscado apenas entre pessoas do tipo Pessoa Jurídica (CNPJ) — este endpoint não localiza pessoa por CPF.\n- Retorna a lista de contatos ativos (não excluídos) vinculados à empresa informada. Se não houver contatos vinculados, retorna uma lista vazia (`success: true`, `response: []`).\n- Cada contato pode opcionalmente ter uma função de CRM associada (`crmFunctionName`), indicadores de tarefa em aberto (`openTask`), usuário-chave (`keyUser`) e se já foi revisado (`revisedContact`).\n- Se o CNPJ informado não corresponder a nenhuma pessoa cadastrada, a chamada retorna erro de negócio (ver \"Erros comuns\").\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `txId` | Path param | Sim | CNPJ da empresa |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica sucesso da chamada |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].contactId` | int | Id do contato |\n| `response[].name` | string | Nome do contato |\n| `response[].txId` | string\\|null | CPF/CNPJ do contato, quando cadastrado |\n| `response[].email` | string\\|null | E-mail do contato |\n| `response[].phone` | string\\|null | Telefone fixo do contato |\n| `response[].cellPhone1` | string\\|null | Celular principal do contato |\n| `response[].cellPhone2` | string\\|null | Celular secundário do contato |\n| `response[].crmFunctionId` / `response[].crmFunctionName` | int\\|null / string\\|null | Função de CRM associada ao contato, quando houver |\n| `response[].openTask` | boolean | Indica se há tarefa em aberto vinculada ao contato |\n| `response[].keyUser` | boolean | Indica se o contato é usuário-chave |\n| `response[].revisedContact` | boolean | Indica se o contato já foi revisado |\n\n`response` vem como lista vazia (`[]`) quando a empresa não tem nenhum contato vinculado.\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| CNPJ não corresponde a nenhuma pessoa cadastrada | `success: false`, mensagem \"Pessoa não encontrada pelo CNPJ informado\" (`code: 404`), HTTP 200 |\n| `txId` não informado (path vazio) | `success: false`, mensagem \"CNPJ não informado\" (`code: 300`), HTTP 200 |"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": [\n    {\n      \"contactId\": 5501,\n      \"name\": \"Carlos Eduardo Lima\",\n      \"txId\": \"45678912300\",\n      \"email\": \"carlos.lima@empresaexemplo.com.br\",\n      \"phone\": \"4933451122\",\n      \"cellPhone1\": \"49988112233\",\n      \"cellPhone2\": null,\n      \"crmFunctionId\": 3,\n      \"crmFunctionName\": \"Financeiro\",\n      \"openTask\": true,\n      \"keyUser\": false,\n      \"revisedContact\": true\n    },\n    {\n      \"contactId\": 5502,\n      \"name\": \"Fernanda Alves Costa\",\n      \"txId\": null,\n      \"email\": \"fernanda.costa@empresaexemplo.com.br\",\n      \"phone\": null,\n      \"cellPhone1\": \"49999223344\",\n      \"cellPhone2\": null,\n      \"crmFunctionId\": null,\n      \"crmFunctionName\": null,\n      \"openTask\": false,\n      \"keyUser\": true,\n      \"revisedContact\": false\n    }\n  ],\n  \"elapsedTime\": null\n}"},{"id":"725e3e05-38fa-bdf4-4f0c-074319ab7979","name":"Erro — CNPJ não encontrado","originalRequest":{"method":"GET","header":[{"value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/People/Contacts/{txId}","description":"## Propósito\n\nLista os contatos vinculados a uma pessoa (empresa), identificada pelo CNPJ.\n\n## Regras de negócio\n\n- O `txId` informado é normalizado (apenas dígitos/letras maiúsculas) e buscado apenas entre pessoas do tipo Pessoa Jurídica (CNPJ) — este endpoint não localiza pessoa por CPF.\n- Retorna a lista de contatos ativos (não excluídos) vinculados à empresa informada. Se não houver contatos vinculados, retorna uma lista vazia (`success: true`, `response: []`).\n- Cada contato pode opcionalmente ter uma função de CRM associada (`crmFunctionName`), indicadores de tarefa em aberto (`openTask`), usuário-chave (`keyUser`) e se já foi revisado (`revisedContact`).\n- Se o CNPJ informado não corresponder a nenhuma pessoa cadastrada, a chamada retorna erro de negócio (ver \"Erros comuns\").\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `txId` | Path param | Sim | CNPJ da empresa |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica sucesso da chamada |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].contactId` | int | Id do contato |\n| `response[].name` | string | Nome do contato |\n| `response[].txId` | string\\|null | CPF/CNPJ do contato, quando cadastrado |\n| `response[].email` | string\\|null | E-mail do contato |\n| `response[].phone` | string\\|null | Telefone fixo do contato |\n| `response[].cellPhone1` | string\\|null | Celular principal do contato |\n| `response[].cellPhone2` | string\\|null | Celular secundário do contato |\n| `response[].crmFunctionId` / `response[].crmFunctionName` | int\\|null / string\\|null | Função de CRM associada ao contato, quando houver |\n| `response[].openTask` | boolean | Indica se há tarefa em aberto vinculada ao contato |\n| `response[].keyUser` | boolean | Indica se o contato é usuário-chave |\n| `response[].revisedContact` | boolean | Indica se o contato já foi revisado |\n\n`response` vem como lista vazia (`[]`) quando a empresa não tem nenhum contato vinculado.\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| CNPJ não corresponde a nenhuma pessoa cadastrada | `success: false`, mensagem \"Pessoa não encontrada pelo CNPJ informado\" (`code: 404`), HTTP 200 |\n| `txId` não informado (path vazio) | `success: false`, mensagem \"CNPJ não informado\" (`code: 300`), HTTP 200 |"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\n    { \"message\": \"Pessoa não encontrada pelo CNPJ informado\", \"code\": 404, \"type\": \"Error\" }\n  ],\n  \"response\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"be2707a0-390d-4762-c1a2-9e759856e8a8"}],"id":"c7032a6d-cb31-4c43-a8ec-fb84c91c902f","_postman_id":"c7032a6d-cb31-4c43-a8ec-fb84c91c902f","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"CRM Voalle","item":[{"name":"Criar lead","id":"451f499c-e3e2-4157-b184-2c9c7262717f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n  \"personalData\": {\n    \"name\": \"string\",\n    \"name2\": \"string\",\n    \"typeTxId\": 0,\n    \"txId\": \"string\",\n    \"birthDate\": \"2022-06-13T17:01:08.158Z\",\n    \"identity\": \"string\",\n    \"civilStatus\": null,\n    \"gender\": null,\n    \"parentsName\": \"string\",\n    \"observations\": \"string\"\n  },\n  \"contact\": {\n    \"phone\": \"string\",\n    \"cellPhone\": \"string\",\n    \"cellPhoneHasWhatsApp\": true,\n    \"cellPhoneHasTelegram\": true,\n    \"email\": \"string\",\n    \"website\": \"string\"\n  },\n  \"address\": {\n    \"postalCode\": \"string\",\n    \"street\": \"string\",\n    \"streetType\": \"string\",\n    \"number\": \"string\",\n    \"neighborhood\": \"string\",\n    \"addressComplement\": \"string\",\n    \"addressReference\": \"string\",\n    \"codeCityId\": 0,\n    \"city\": \"string\",\n    \"state\": \"string\",\n    \"country\": \"string\"\n  },\n  \"integratorData\": {\n    \"crmContactOriginCode\": \"string\",\n    \"crmFormCode\": \"string\",\n    \"integratorAlias\": \"string\",\n    \"integrationCode\": \"string\",\n    \"integrationTeamCode\": \"string\",\n    \"integrationSellerTxId\": \"string\"\n  }\n}","options":{"raw":{"language":"text"}}},"url":"{{URL}}:45715/external/crm/leads/create","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria um novo lead no CRM Voalle a partir de um sistema terceiro (ex.: ferramentas de marketing, formulários externos, landing pages).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Vínculo da Equipe e do Vendedor para Geração de Leads por Sistema de Terceiros deve estar parametrizado em CRM Voalle / Operações / Dashboard – Parâmetros do CRM, menu Parâmetros Gerais. Os leads criados pela API são atribuídos à equipe e ao vendedor definidos nesse parâmetro quando não for possível usar os valores enviados na requisição.</li>\n<li>É necessário ter cadastrado no ERP: a Origem de Contato (<code>crmContactOriginCode</code>) e o Integrador (<code>integratorAlias</code>, cadastrado em Manutenção / Integração / Integradores).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>crmContactOriginCode</code>, <code>integratorAlias</code> e <code>integrationCode</code> são obrigatórios.</li>\n<li>A Origem de Contato e o Integrador informados precisam existir, estar ativos e não excluídos no ERP.</li>\n<li>Se <code>crmFormCode</code> for informado, também precisa existir e estar ativo.</li>\n<li>Se <code>integrationTeamCode</code> for informado mas não for encontrado, o lead é criado normalmente e vinculado à equipe padrão do parâmetro (aviso não bloqueante).</li>\n<li>Se <code>integrationSellerTxId</code> for informado, mas o vendedor não for encontrado, ou não pertencer à equipe informada em <code>integrationTeamCode</code>, o lead é criado e vinculado à equipe padrão, sem o vendedor (aviso não bloqueante).</li>\n<li>Dados de endereço (<code>address</code>) são opcionais e, quando inconsistentes (CEP inválido, cidade não localizada, cidade divergente do CEP, etc.), <strong>não bloqueiam</strong> a criação do lead — o endereço é apenas ignorado e um aviso é retornado em <code>messages</code>.</li>\n<li>Dados de contato (e-mail, telefone, celular, site) <strong>são bloqueantes</strong>: se algum formato for inválido, o lead não é criado.</li>\n<li>Caso o CPF/CNPJ informado (<code>personalData.txId</code>) já exista cadastrado no ERP, a criação do lead falha. ⚠ A resposta retorna apenas a mensagem genérica \"Não foi possível criar o lead.\" — o motivo específico (\"Este CPF/CNPJ já existe no sistema.\") não é exposto ao integrador nesse cenário.</li>\n<li>O nome (<code>personalData.name</code>) não pode ultrapassar 60 caracteres.</li>\n<li>A data de nascimento/fundação (<code>personalData.birthDate</code>) não pode ser futura.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>personalData.name</code></td>\n<td>Sim</td>\n<td>Nome do lead (pessoa física) ou razão social (pessoa jurídica). Máx. 60 caracteres.</td>\n</tr>\n<tr>\n<td><code>personalData.typeTxId</code></td>\n<td>Não*</td>\n<td>1 - Pessoa Jurídica, 2 - Pessoa Física, 3 - Estrangeiro. Obrigatório se <code>txId</code> for informado.</td>\n</tr>\n<tr>\n<td><code>personalData.txId</code></td>\n<td>Não</td>\n<td>CPF/CNPJ. Validado conforme <code>typeTxId</code>.</td>\n</tr>\n<tr>\n<td><code>personalData.birthDate</code></td>\n<td>Não</td>\n<td>Data de nascimento (PF) ou de abertura (PJ). Não pode ser data futura.</td>\n</tr>\n<tr>\n<td><code>personalData.civilStatus</code></td>\n<td>Não</td>\n<td>1 - Solteiro(a), 2 - Casado(a), 3 - Divorciado(a), 4 - Viúvo(a), 5 - União estável, 6 - Separado(a).</td>\n</tr>\n<tr>\n<td><code>personalData.gender</code></td>\n<td>Não</td>\n<td>1 - Masculino, 2 - Feminino.</td>\n</tr>\n<tr>\n<td><code>contact.email</code></td>\n<td>Não</td>\n<td>Formato de e-mail válido.</td>\n</tr>\n<tr>\n<td><code>contact.phone</code> / <code>contact.cellPhone</code></td>\n<td>Não</td>\n<td>Formato de telefone/celular válido.</td>\n</tr>\n<tr>\n<td><code>contact.website</code></td>\n<td>Não</td>\n<td>Formato de URL válido.</td>\n</tr>\n<tr>\n<td><code>address.postalCode</code></td>\n<td>Não</td>\n<td>CEP sem máscara. Quando informado incorretamente, gera apenas aviso.</td>\n</tr>\n<tr>\n<td><code>integratorData.crmContactOriginCode</code></td>\n<td>Sim</td>\n<td>Código da Origem de Contato cadastrada no ERP.</td>\n</tr>\n<tr>\n<td><code>integratorData.integratorAlias</code></td>\n<td>Sim</td>\n<td>Alias do Integrador cadastrado em Manutenção / Integração / Integradores.</td>\n</tr>\n<tr>\n<td><code>integratorData.integrationCode</code></td>\n<td>Sim</td>\n<td>Código de referência do lead na empresa integradora.</td>\n</tr>\n<tr>\n<td><code>integratorData.crmFormCode</code></td>\n<td>Não</td>\n<td>Código da forma de contato, se cadastrada.</td>\n</tr>\n<tr>\n<td><code>integratorData.integrationTeamCode</code></td>\n<td>Não</td>\n<td>Equipe a ser atribuída ao lead.</td>\n</tr>\n<tr>\n<td><code>integratorData.integrationSellerTxId</code></td>\n<td>Não</td>\n<td>CPF do vendedor responsável pelo lead.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o lead foi criado.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.messages</code></td>\n<td>array</td>\n<td>Avisos não bloqueantes coletados durante a validação (ex.: CEP inválido, time não encontrado, vendedor não encontrado etc.), vazio quando não há avisos.</td>\n</tr>\n<tr>\n<td><code>response.Response.PersonId</code></td>\n<td>integer</td>\n<td>Id do cadastro (pessoa/lead) criado no ERP.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem / retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>crmContactOriginCode</code> não informado</td>\n<td>\"O campo Código da Origem de contato é obrigatório.\"</td>\n</tr>\n<tr>\n<td><code>integratorAlias</code> não informado</td>\n<td>\"O campo Código do integrador é obrigatório.\"</td>\n</tr>\n<tr>\n<td><code>integrationCode</code> não informado</td>\n<td>\"O campo Código de integração é obrigatório.\"</td>\n</tr>\n<tr>\n<td>Origem de contato não encontrada/inativa</td>\n<td>\"Origem de contato inválida.\"</td>\n</tr>\n<tr>\n<td>Integrador não encontrado/inativo</td>\n<td>\"Integrador inválido.\"</td>\n</tr>\n<tr>\n<td><code>crmFormCode</code> inválido</td>\n<td>\"Forma de contato inválida.\"</td>\n</tr>\n<tr>\n<td>Nome não informado</td>\n<td>\"O campo Nome é obrigatório.\"</td>\n</tr>\n<tr>\n<td>CPF/CNPJ com <code>typeTxId</code> inválido</td>\n<td>\"Tipo de Documento inválido.\"</td>\n</tr>\n<tr>\n<td>CNPJ/CPF inválido para o tipo informado</td>\n<td>\"CNPJ inválido.\" / \"CPF inválido.\"</td>\n</tr>\n<tr>\n<td>E-mail em formato inválido</td>\n<td>\"E-mail inválido.\"</td>\n</tr>\n<tr>\n<td>Telefone em formato inválido</td>\n<td>\"Telefone inválido.\"</td>\n</tr>\n<tr>\n<td>Celular em formato inválido</td>\n<td>\"Celular inválido.\"</td>\n</tr>\n<tr>\n<td>Site em formato inválido</td>\n<td>\"Site inválido.\"</td>\n</tr>\n<tr>\n<td>CPF/CNPJ já cadastrado no ERP</td>\n<td>\"Não foi possível criar o lead.\" (mensagem genérica; motivo específico não é exposto)</td>\n</tr>\n<tr>\n<td>Nome maior que 60 caracteres</td>\n<td>Falha na criação (mensagem genérica \"Não foi possível criar o lead.\")</td>\n</tr>\n<tr>\n<td>Data de nascimento/fundação futura</td>\n<td>Falha na criação com a mensagem específica de data inválida</td>\n</tr>\n<tr>\n<td>Equipe informada não encontrada</td>\n<td>Aviso: \"Não foi possível encontrar o time informado, lead adicionado ao time padrão.\" (lead é criado)</td>\n</tr>\n<tr>\n<td>Vendedor informado não encontrado</td>\n<td>Aviso: \"Não foi possível encontrar o vendedor informado, lead adicionado ao time padrão.\" (lead é criado)</td>\n</tr>\n<tr>\n<td>Vendedor não pertence à equipe informada</td>\n<td>Aviso: \"O vendedor informado não pertence ao time informado, lead adicionado ao time padrão.\" (lead é criado)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200 — o campo <code>success</code> é que indica se houve falha ou sucesso.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Após a criação do lead, ele pode ser convertido em negociação através do método \"Nova negociação\" (<code>crm/startsale</code>), que localiza o cadastro pelo CPF/CNPJ.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","crm","leads","create"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"cebf0824-be7a-442c-b4d4-51962091ea8c","name":"Erro — origem de contato e integrador inválidos","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"personalData\": {\n        \"name\": \"string\", //Obrigatório, nome do lead, nome da pessoa, quando pessoa física ou a razão social quando pessoa jurídica\n        \"name2\": \"string\", // Nome 2, apelido do lead, quando pessoa física ou o nome fantasia, quando pessoa jurídica\n        \"typeTxId\": 0, // Tipo de lead,  1 p/ pessoa jurídica e 2 p/ pessoa física\n        \"txId\": \"string\", // CPF/CNPJ\n        \"birthDate\": \"2022-06-13\", //Data de nascimento da pessoa ou data de abertura da empresa\n        \"identity\": \"string\", // RG dp Lead, apenas usado em pessoa física\n        \"civilStatus\": null, // Estado civil do Lead, apenas para pessoa física, campo opcional onde 1 solteiro(a), 2 casado(a), 3 divorciado(a), 4 viúvo(a), 5 união estável e 6 separado(a)\n        \"gender\": null, // Gênero do lead, apenas quando pessoa física, campo opcional onde 1 masculino e 2 feminino\n        \"parentsName\": \"string\", // Nome da mãe do lead, apenas quando pessoa física\n        \"observations\": \"string\" //observações do lead\n    },\n    \"contact\": {\n        \"phone\": \"string\", // preferencia p/ o número de telefone fixo do lead, apenas números entre 10 e 11 caracteres sendo 2 para o DDD e 8 para um telefone fixo ou 9 caracteres para um telefone celular\n        \"cellPhone\": \"string\", //Celular do lead, 11 caracteres, sendo os 2 primeiros caracteres para o DDD e 9 restante para o número\n        \"cellPhoneHasWhatsApp\": true, // Define se o cellPhone informado possui WhatsApp, 0 para Não e 1 para Sim\n        \"cellPhoneHasTelegram\": true, // Define se o cellPhone informado possui Telegram, 0 para Não e 1 para Sim\n        \"email\": \"string\", // E-mail principal do lead, é possível informar um único e-mail no formato “nome@email.com.br”\n        \"website\": \"string\" // Website principal do lead, é possível informar um único website no formato “www.siteempresa.com” (exemplo)\n    },\n    \"address\": {\n        \"postalCode\": \"string\", // CEP do endereço do lead, informar apenas números sem a máscara\n        \"street\": \"string\", // Logradouro do endereço do lead (será preenchido automaticamente a partir do CEP, caso seja um CEP específico)\n        \"streetType\": \"string\", // Tipo de Logradouro do endereço do lead, exemplo: Rua, Avenida, Travessa, etc\n        \"number\": \"string\", // Número do endereço do lead, ou seja, o número da casa, prédio, condomínio, ou outros\n        \"neighborhood\": \"string\", // Bairro do endereço do lead (será preenchido automaticamente a partir do CEP, caso seja um CEP específico)\n        \"addressComplement\": \"string\", // complemento do endereço do lead, utilize este campo para informar o bloco, apartamento e etc\n        \"addressReference\": \"string\", // Referência do endereço do lead, utilize este campo para informar algo referente ao endereço ou às proximidades\n        \"codeCityId\": 0, // Código do IBGE para o município do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"city\": \"string\", // Município do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"state\": \"string\", // Estado do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"country\": \"string\" // País do endereço do lead (deve ser preenchido a partir do CEP informado)\n    },\n    \"integratorData\": {\n        \"crmContactOriginCode\": \"string\", // Obrigatório, código da Origem de Contato cadastrado no ERP\n        \"integratorAlias\": \"string\", // Obrigatório, aliás do Integrador cadastrado no ERP em Manutenção / Integração / Integradores\n        \"integrationCode\": \"string\", // Obrigatório, código de referência do Lead na empresa integradora\n        \"integrationTeamCode\": \"string\", //Opcional, equipe que será atribuído o Lead no ERP.\n        \"integrationSellerTxId\": \"string\" //Opcional, vendedor que será responsável pelo Lead no ERP.\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL_ERP}}:45715/external/crm/leads/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Origem de contato inválida.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        },\n        {\n            \"message\": \"Integrador inválido.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"2ec818df-7e13-487b-b371-a868dba30ec4","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"personalData\": {\n        \"name\": \"string\", //Obrigatório, nome do lead, nome da pessoa, quando pessoa física ou a razão social quando pessoa jurídica\n        \"name2\": \"string\", // Nome 2, apelido do lead, quando pessoa física ou o nome fantasia, quando pessoa jurídica\n        \"typeTxId\": 0, // Tipo de lead,  1 p/ pessoa jurídica e 2 p/ pessoa física\n        \"txId\": \"string\", // CPF/CNPJ\n        \"birthDate\": \"2022-06-13\", //Data de nascimento da pessoa ou data de abertura da empresa\n        \"identity\": \"string\", // RG dp Lead, apenas usado em pessoa física\n        \"civilStatus\": null, // Estado civil do Lead, apenas para pessoa física, campo opcional onde 1 solteiro(a), 2 casado(a), 3 divorciado(a), 4 viúvo(a), 5 união estável e 6 separado(a)\n        \"gender\": null, // Gênero do lead, apenas quando pessoa física, campo opcional onde 1 masculino e 2 feminino\n        \"parentsName\": \"string\", // Nome da mãe do lead, apenas quando pessoa física\n        \"observations\": \"string\" //observações do lead\n    },\n    \"contact\": {\n        \"phone\": \"string\", // preferencia p/ o número de telefone fixo do lead, apenas números entre 10 e 11 caracteres sendo 2 para o DDD e 8 para um telefone fixo ou 9 caracteres para um telefone celular\n        \"cellPhone\": \"string\", //Celular do lead, 11 caracteres, sendo os 2 primeiros caracteres para o DDD e 9 restante para o número\n        \"cellPhoneHasWhatsApp\": true, // Define se o cellPhone informado possui WhatsApp, 0 para Não e 1 para Sim\n        \"cellPhoneHasTelegram\": true, // Define se o cellPhone informado possui Telegram, 0 para Não e 1 para Sim\n        \"email\": \"string\", // E-mail principal do lead, é possível informar um único e-mail no formato “nome@email.com.br”\n        \"website\": \"string\" // Website principal do lead, é possível informar um único website no formato “www.siteempresa.com” (exemplo)\n    },\n    \"address\": {\n        \"postalCode\": \"string\", // CEP do endereço do lead, informar apenas números sem a máscara\n        \"street\": \"string\", // Logradouro do endereço do lead (será preenchido automaticamente a partir do CEP, caso seja um CEP específico)\n        \"streetType\": \"string\", // Tipo de Logradouro do endereço do lead, exemplo: Rua, Avenida, Travessa, etc\n        \"number\": \"string\", // Número do endereço do lead, ou seja, o número da casa, prédio, condomínio, ou outros\n        \"neighborhood\": \"string\", // Bairro do endereço do lead (será preenchido automaticamente a partir do CEP, caso seja um CEP específico)\n        \"addressComplement\": \"string\", // complemento do endereço do lead, utilize este campo para informar o bloco, apartamento e etc\n        \"addressReference\": \"string\", // Referência do endereço do lead, utilize este campo para informar algo referente ao endereço ou às proximidades\n        \"codeCityId\": 0, // Código do IBGE para o município do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"city\": \"string\", // Município do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"state\": \"string\", // Estado do endereço do lead (deve ser preenchido a partir do CEP informado)\n        \"country\": \"string\" // País do endereço do lead (deve ser preenchido a partir do CEP informado)\n    },\n    \"integratorData\": {\n        \"crmContactOriginCode\": \"string\", // Obrigatório, código da Origem de Contato cadastrado no ERP\n        \"integratorAlias\": \"string\", // Obrigatório, aliás do Integrador cadastrado no ERP em Manutenção / Integração / Integradores\n        \"integrationCode\": \"string\", // Obrigatório, código de referência do Lead na empresa integradora\n        \"integrationTeamCode\": \"string\", //Opcional, equipe que será atribuído o Lead no ERP.\n        \"integrationSellerTxId\": \"string\" //Opcional, vendedor que será responsável pelo Lead no ERP.\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL_ERP}}:45715/external/crm/leads/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"message\": \"Lead criado com sucesso.\",\n      \"code\": null,\n      \"type\": \"Success\"\n    }\n  ],\n  \"response\": {\n    \"messages\": [], // avisos não bloqueantes coletados na validação (ex.: CEP inválido, time não encontrado etc.), vazio quando não há avisos\n    \"Response\": {\n      \"PersonId\": 12345 // Id do cadastro (pessoa/lead) criado no ERP\n    }\n  },\n  \"dataResponseType\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"451f499c-e3e2-4157-b184-2c9c7262717f"},{"name":"Nova negociação","id":"a1f669c1-a913-4c20-8f56-7d0e9abaeca0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\r\n    \"txId\": \"string\", // CPF/CNPJ do lead\r\n    \"companyPlaceTxId\": \"string\", // CNPJ do local de venda\r\n    \"thirdSellerTxId\": \"string\", // CPF do vendedor terceiro (ganho) da negociação\r\n    \"responsibleSellerTxId\": \"string\", // CPF do vendedor proprietário da negociação\r\n    \"TeamCode\": \"string\", // Código da equipe para a negociação\r\n    \"contractType\": \"string\", // Código do tipo de contrato - obtido no método contracttypesandservices\r\n    \"crmCampaignCode\": \"string\", // Código da campanha - obtido no método campaignsandpricelistservices\r\n    \"crmPriceListCode\": \"string\", // Código da lista de preço - obtido no método campaignsandpricelistservices\r\n    \"contractPaymentFormCode\": \"string\", // Código da forma de pagamento\r\n    \"contractFinancialCollectionTypeCode\": \"string\", // Código do tipo de cobrança\r\n    \"contractDateManagementCode\": \"string\", // Código do ciclo de faturamento\r\n    \"contractCollectionDay\": \"string\", // Data de vencimento\r\n    \"activationIncidentTypeCode\": \"string\", // Código da solicitação de ativação\r\n    \"activationGroupInMonthlyFee\": true, // Agrupar os títulos na fatura mensal\r\n    \"activationFirstParcelDate\": \"2025-12-12\", // Data da primeira parcela\r\n    \"activationPaymentFormCode\": \"string\", // Forma de pagamento\r\n    \"activationFinancialCollectionTypeCode\": \"string\", // Tipo de cobrança\r\n    \"activationPaymentConditionCode\": \"string\", // Condição de pagamento\r\n    \"serviceProducts\": [\r\n        {\r\n            \"code\": \"string\", // Código do serviço - obtido no método contracttypesandservices\r\n            \"quantity\": 0, // Quantidade\r\n            \"amount\": 0.0, // Valor do serviço\r\n            \"paymentFormCode\": \"string\", //  Código da forma de pagamento\r\n            \"phoneGroupId\": \"string\", // Id publico do grupo de telefone\r\n            \"PhoneNumberInformations\": [\r\n                {\r\n                    \"PhoneNumber\": \"55999999999\", // Número a ser vinculado ao item de contrato\r\n                    \"PhoneNumberType\": \"0\", // Tipo de número 0 - Fixo, 1 - Celular, 2 - Outro\r\n                    \"IsPortability\": false // Identifica se é uma portabilidade ou não\r\n                }\r\n            ]\r\n        }\r\n    ],\r\n    \"clientSaleInfo\": { // Dados do cliente/lead\r\n        \"name\": \"string\", // Nome\r\n        \"typeTxId\": 0, // Tipo de pessoa sendo: 1 - jurídica; 2 - física; 3 - estrangeiro\r\n        \"phone\": \"string\", // Número do Telefone sendo 10 caracateres para DDD+telefone e 11 caracteres para DDD+celular\r\n        \"cellPhone1\": \"string\", // Número do Celular sendo 11 caracteres para DDD+celular\r\n        \"email\": \"string\", // E-mail\r\n        \"emailNfe\": \"string\", // E-mail de faturamento\r\n        \"birthDate\": \"2021-09-16\", // Data de nascimento para Pessoa Física ou data de fundação para Pessoa Jurídica - formato AAAA-MM-DD\r\n        \"gender\": 0, // Genêro sendo: 1 - masculino; 2 - feminino\r\n        \"civilStatus\": 0, // Estado civil sendo: 1 - solteiro; 2 - casado; 3 - divorciado; 4 - viuvo; 5 - união estável; 6 - separado\r\n        \"identity\": \"string\", // Número do RG\r\n        \"parentsName\": \"string\", // Nome da mãe\r\n        \"stateRegistration\": \"string\", // Número da Inscrição estadual\r\n        \"municipalRegistration\": \"string\", // Número da Inscrição municipal\r\n        \"stateRegistrationType\": 0, // Tipo de inscrição estadual sendo: 1 - Contribuinte; 2 - Isento; 3 - Não contribuinte\r\n        \"isSigner\": true, // (Opcional) Indica se o cliente deve ser inserido como assinador do termo do contrato\r\n        \"addressSaleInfo\": {\r\n            \"postalCode\": \"string\", // CEP do endereço\r\n            \"street\": \"string\", // Loradouro do endereço\r\n            \"streetType\": 0, // Tipo de logradouro sendo: 0 - Não Informado, 1 - Alameda, 2 - Aeroporto, 3 - Área, 4 - Avenida, 5 - Campo, 6 - Chácara, 7 - Colônia, 8 - Condomínio, 9 - Conjunto, 10 - Distrito, 11 - Esplanada, 12 - Estação, 13 - Estrada, 14 - Favela, 15 - Fazenda, 16 - Feira, 17 - Jardim, 18 - Ladeira, 19 - Lago, 20 - Lagoa, 21 - Largo, 22 - Loteamento, 23 - Morro, 24 - Núcleo, 25 - Parque, 26 - Passarela, 27 - Pátio, 28 - Praça, 29 - Quadra, 30 - Recanto, 31 - Residencial, 32 - Rua, 33 - Rodovia, 34 - Setor, 35 - Sítio, 36 - Travessa, 37 - Trecho, 38 - Trevo, 39 - Vale, 40 - Vereda, 41 - Via, 42 - Viaduto, 43 - Beco, 44 - Vila, \r\n            \"number\": \"string\", // Numero da residência\r\n            \"neighborhood\": \"string\", // Bairro do endereço\r\n            \"state\": \"string\", // Sigla do estado (UF)\r\n            \"city\": \"string\", // Nome da Cidade\r\n            \"addressComplement\": \"string\", // Complemento para o endereço\r\n            \"addressReference\": \"string\", // Ponto de referência do endereço\r\n            \"propertyType\": 0,  // (Opcional; condicional ao parâmetro \"Tipo de Residência\") Tipo da propriedade: 1 - Casa de Madeira; 2 - Casa de Alvenaria; 3 - Casa Mista; 4 - Apartamento\r\n            \"residenceTypeCode\": \"string\" // Tipo de propriedade, sendo: 01 - casa madeira; 02 - casa alvenaria; 03 - casa mista; 04 - apartamento\r\n        }\r\n    },\r\n    \"activationInformation\": { // Dados da solicitação de ativação\r\n        \"teamCode\": \"string\", // Código da Equipe de ativação\r\n        \"description\": \"string\", // Descrição da solicitação de ativação\r\n        \"catalogServiceCode\": \"string\", // Código do catálogo de serviços\r\n        \"categoryMatrixCode\": \"string\" // Código da aatriz de categoria\r\n    },\r\n    \"integratorInformation\": { // Dados do integrador origem da requisição\r\n        \"integratorIdentification\": \"string\", // Identificação do Integrador\r\n        \"negotiationId\": \"string\", // Identificação da negociação\r\n        \"viabilityId\": 0 // Identificação da viabilidade técnica realizada\r\n    },\r\n    \"gainInformation\": { // Dados do ganho da negociação\r\n        \"crmOpportunityReasonCode\": \"string\", // Código do motivo do ganho\r\n        \"contactForm\": \"string\", // Código da forma de contato\r\n        \"reportDescription\": 0, // Descrição do ganho\r\n        \"automatic\": true // informação se o ganho da negociação deve ocorrer automaticamente (true) ou não (false)\r\n    },\r\n    \"contacts\": [ // Possibilidade de enviar um ou mais contatos a serem vinculados ao cliente\r\n        {\r\n            \"name\": \"string\", // Nome do contato\r\n            \"typeTxId\": 0, // Tipo de pessoa sendo: 1 - juridica; 2 - fisica; 3 - estrangeiro\r\n            \"txId\": \"string\", // CPF do contato caso seja pessoa física ou CNPJ do contato caso seja pessoa jurídica\r\n            \"email\": \"string\", // E-mail do contato\r\n            \"phone\": \"string\", // Telefone do contato\r\n            \"crmFunctionCode\": \"string\", // Código do cargo ocupacional do contato\r\n            \"classification\": 10, // Código da classificação do contato (assinador), sendo: 1 - Responsável Legal; 2 - Procurador; 3 - Representante; 4 - Testemunha; 5 - Decisor Geral; 6 - Responsável Financeiro; 7 - Diretor; 8 - Validado por; 9 - Gerente de Contas; 10 - Cliente\r\n            \"order\": 1, // Ordem de assinatura do contato (assinador),\r\n            \"isSigner\": true // Flag para indicar que  o conato é assinador (para assinatura ANTERIOR ao ganho)\r\n        }\r\n    ],\r\n    \"observations\": \"string\" // Campo de texto para inserir informações extras sobre a negociação\r\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/crm/startsale","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Inicia uma venda/negociação via API, criando (ou atualizando) o cadastro do cliente/lead, os serviços vendidos e, opcionalmente, encaminhando o ganho automático da negociação.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Para negociação através do CRM Voalle, é necessário que o módulo CRM Voalle esteja habilitado no ERP. Quando o módulo não está habilitado, a API segue o fluxo simplificado de start de venda (sem campanha/funil/etapas do CRM).</li>\n<li>É possível apenas vincular serviços mensais e de ativação ao contrato criado.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Caso o cliente não tenha cadastro (busca por CPF/CNPJ), é criado um cadastro novo com os dados enviados, e o endereço enviado em <code>clientSaleInfo.addressSaleInfo</code> é cadastrado como o <strong>endereço principal</strong> do cliente. Caso o cliente já exista, os dados do cadastro são atualizados e <strong>o endereço principal já cadastrado do cliente é sobrescrito</strong> pelos dados enviados em <code>clientSaleInfo.addressSaleInfo</code> — nenhum endereço novo é criado, e nenhum outro endereço do cliente (ex.: de cobrança) é afetado.</li>\n<li>⚠ Diferente de \"Incluir serviço no contrato\" e \"Alterar serviço do contrato\", este método <strong>não verifica inadimplência do cliente</strong>: a negociação é criada independentemente de o cliente possuir faturas em aberto/vencidas, e independentemente do parâmetro \"Permite realizar venda para clientes inadimplentes\" (<code>debitClientActiveSale</code>, geral ou do CRM) estar habilitado ou não.</li>\n<li><strong>contractType</strong>: aceita os mesmos Tipos de Contrato disponíveis em tela no CRM Voalle.</li>\n<li><strong>crmCampaignCode / crmPriceListCode</strong>: valores obtidos no método \"Consulta Campanhas e Serviços\".</li>\n<li><strong>contractPaymentFormCode</strong>, <strong>contractFinancialCollectionTypeCode</strong>, <strong>contractDateManagementCode</strong>: seguem as mesmas regras/opções disponíveis em tela. O ciclo de faturamento (<code>contractDateManagementCode</code>), quando informado, tem prioridade sobre <code>contractCollectionDay</code> para definir o vencimento.</li>\n<li><strong>residenceTypeCode</strong>: obrigatório apenas se parametrizado como obrigatório no CRM.</li>\n<li><strong>paymentFormCode</strong> (por serviço): se não enviado, é usado o primeiro serviço encontrado na lista de preço.</li>\n<li><strong>amount</strong> (por serviço): se não enviado, usa-se o valor padrão da lista de preço; se enviado, deve ser maior ou igual ao valor mínimo da lista de preço. Se o serviço tiver fidelização, o valor da fidelização prevalece e este campo é ignorado.</li>\n<li><strong>Serviço STFC</strong>: exige um número de telefone vinculado ao item de contrato. O número deve existir no Grupo de Telefone identificado por <code>phoneGroupId</code> (seu Id Público); em caso de portabilidade, se o número não existir, ele é cadastrado nesse grupo.</li>\n<li>Quando <code>gainInformation.automatic = true</code>, o ganho da negociação ocorre automaticamente ao final do processamento (gera o contrato); nesse caso, e também quando o tipo de contrato exige assinatura anterior ao ganho, valem as regras de assinantes abaixo.</li>\n<li>Assinantes do termo de adesão: se houver contatos com <code>isSigner = true</code>, eles assinam; caso contrário, o próprio cliente assina. Cadastro de pessoa jurídica deve sempre ter contatos informados.</li>\n<li><code>viabilityId</code> (em <code>integratorInformation</code>), quando informado, precisa ser um Id de registro de viabilidade técnica válido (retornado por \"Consulta viabilidade\"); a negociação fica vinculada a essa consulta.</li>\n</ul>\n<p><strong>streetType</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Tipo</th>\n<th>Valor</th>\n<th>Tipo</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Não Informado</td>\n<td>22</td>\n<td>Loteamento</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Alameda</td>\n<td>23</td>\n<td>Morro</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Aeroporto</td>\n<td>24</td>\n<td>Núcleo</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Área</td>\n<td>25</td>\n<td>Parque</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Avenida</td>\n<td>26</td>\n<td>Passarela</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Campo</td>\n<td>27</td>\n<td>Pátio</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Chácara</td>\n<td>28</td>\n<td>Praça</td>\n</tr>\n<tr>\n<td>7</td>\n<td>Colônia</td>\n<td>29</td>\n<td>Quadra</td>\n</tr>\n<tr>\n<td>8</td>\n<td>Condomínio</td>\n<td>30</td>\n<td>Recanto</td>\n</tr>\n<tr>\n<td>9</td>\n<td>Conjunto</td>\n<td>31</td>\n<td>Residencial</td>\n</tr>\n<tr>\n<td>10</td>\n<td>Distrito</td>\n<td>32</td>\n<td>Rua</td>\n</tr>\n<tr>\n<td>11</td>\n<td>Esplanada</td>\n<td>33</td>\n<td>Rodovia</td>\n</tr>\n<tr>\n<td>12</td>\n<td>Estação</td>\n<td>34</td>\n<td>Setor</td>\n</tr>\n<tr>\n<td>13</td>\n<td>Estrada</td>\n<td>35</td>\n<td>Sítio</td>\n</tr>\n<tr>\n<td>14</td>\n<td>Favela</td>\n<td>36</td>\n<td>Travessa</td>\n</tr>\n<tr>\n<td>15</td>\n<td>Fazenda</td>\n<td>37</td>\n<td>Trecho</td>\n</tr>\n<tr>\n<td>16</td>\n<td>Feira</td>\n<td>38</td>\n<td>Trevo</td>\n</tr>\n<tr>\n<td>17</td>\n<td>Jardim</td>\n<td>39</td>\n<td>Vale</td>\n</tr>\n<tr>\n<td>18</td>\n<td>Ladeira</td>\n<td>40</td>\n<td>Vereda</td>\n</tr>\n<tr>\n<td>19</td>\n<td>Lago</td>\n<td>41</td>\n<td>Via</td>\n</tr>\n<tr>\n<td>20</td>\n<td>Lagoa</td>\n<td>42</td>\n<td>Viaduto</td>\n</tr>\n<tr>\n<td>21</td>\n<td>Largo</td>\n<td>43</td>\n<td>Beco</td>\n</tr>\n<tr>\n<td></td>\n<td></td>\n<td>44</td>\n<td>Vila</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>phoneNumberType</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Tipo de telefone</th>\n<th>Descrição</th>\n<th>Regra</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Fixo</td>\n<td>DDD + 8 dígitos</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Celular</td>\n<td>DDD + 9 dígitos</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Outro</td>\n<td>11 dígitos</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code></td>\n<td>Sim</td>\n<td>CPF/CNPJ do lead/cliente.</td>\n</tr>\n<tr>\n<td><code>companyPlaceTxId</code></td>\n<td>Sim</td>\n<td>CNPJ do local de venda (empresa).</td>\n</tr>\n<tr>\n<td><code>contractType</code></td>\n<td>Sim</td>\n<td>Código do Tipo de Contrato.</td>\n</tr>\n<tr>\n<td><code>crmCampaignCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da campanha.</td>\n</tr>\n<tr>\n<td><code>crmPriceListCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da lista de preço.</td>\n</tr>\n<tr>\n<td><code>thirdSellerTxId</code></td>\n<td>Não</td>\n<td>CPF/CNPJ do vendedor terceiro (ganho) da negociação. Deve pertencer a um usuário ativo com atividade de vendedor.</td>\n</tr>\n<tr>\n<td><code>responsibleSellerTxId</code></td>\n<td>Não</td>\n<td>CPF/CNPJ do vendedor proprietário. Deve ser um vendedor ativo, efetivo, com usuário ativo no sistema.</td>\n</tr>\n<tr>\n<td><code>teamCode</code></td>\n<td>Não</td>\n<td>Código da equipe; deve estar ativa.</td>\n</tr>\n<tr>\n<td><code>serviceProducts[]</code></td>\n<td>Sim</td>\n<td>Serviços da negociação (ver campos abaixo).</td>\n</tr>\n<tr>\n<td><code>clientSaleInfo</code></td>\n<td>Sim</td>\n<td>Dados do cliente/lead.</td>\n</tr>\n<tr>\n<td><code>clientSaleInfo.addressSaleInfo</code></td>\n<td>Sim</td>\n<td>Endereço do cliente.</td>\n</tr>\n<tr>\n<td><code>integratorInformation.integratorIdentification</code></td>\n<td>Sim</td>\n<td>Identificação do integrador; sem caracteres especiais, máx. 255 caracteres.</td>\n</tr>\n<tr>\n<td><code>integratorInformation.negotiationId</code></td>\n<td>Sim</td>\n<td>Identificação da negociação; sem caracteres especiais, máx. 255 caracteres.</td>\n</tr>\n<tr>\n<td><code>integratorInformation.viabilityId</code></td>\n<td>Não</td>\n<td>Id da consulta de viabilidade vinculada, se houver; deve ser maior que 0 e existir.</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].code</code></td>\n<td>Sim</td>\n<td>Código do serviço, obtido em \"Consulta Tipo de Contratos e Serviços\".</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].quantity</code></td>\n<td>Sim</td>\n<td>Quantidade (serviços fidelizados são limitados a 1).</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].amount</code></td>\n<td>Não</td>\n<td>Valor do serviço.</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].paymentFormCode</code></td>\n<td>Não</td>\n<td>Código da forma de pagamento.</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].phoneGroupId</code></td>\n<td>Condicional</td>\n<td>Obrigatório para serviços STFC.</td>\n</tr>\n<tr>\n<td><code>serviceProducts[].PhoneNumberInformations</code></td>\n<td>Condicional</td>\n<td>Números a vincular, para serviços STFC.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a negociação foi iniciada.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.protocolId</code></td>\n<td>integer</td>\n<td>Id do protocolo/negociação criado, usado em \"Cancela Negociação\" e demais consultas.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request (apenas um exemplo de sucesso está salvo).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code> inválido</td>\n<td>\"Campo CPF/CNPJ do cliente é inválido.\"</td>\n</tr>\n<tr>\n<td><code>companyPlaceTxId</code> inválido ou inexistente</td>\n<td>\"Campo CPF/CNPJ da companhia local é inválido.\" / \"Campo CPF/CNPJ da companhia local não existente.\"</td>\n</tr>\n<tr>\n<td><code>thirdSellerTxId</code> inválido, não encontrado ou sem atividade de vendedor</td>\n<td>\"Campo CPF/CNPJ do vendedor é inválido.\", \"O usuário do CPF/CNPJ {doc} não foi encontrado.\", \"O usuário do CPF/CNPJ {doc} não possui atividade comercial de vendedor.\"</td>\n</tr>\n<tr>\n<td><code>responsibleSellerTxId</code> inválido, não encontrado ou sem usuário ativo</td>\n<td>\"O documento informado para o vendedor (ResponsibleSellerTxId) é inválido.\", \"Não foi identificado um vendedor para o documento informado...\", \"...não possui um usuário do sistema ativo.\"</td>\n</tr>\n<tr>\n<td><code>teamCode</code> não encontrado/inativo</td>\n<td>\"Equipe não identificada ou inativa, verifique o código informado para o campo Team.\"</td>\n</tr>\n<tr>\n<td><code>integratorInformation</code> incompleto ou com caracteres especiais</td>\n<td>\"Campo 'integrationIdentification'/'negotiationId' do bloco de informações 'integratorInformation' não deve ser vazio ou nulo.\", \"...possuí caracteres especiais.\", \"...deve possuir no máximo 255 caracteres\"</td>\n</tr>\n<tr>\n<td><code>viabilityId</code> inválido</td>\n<td>\"Campo 'viabilityId' deve conter o valor maior que 0 se informado\", \"Campo 'viabilityId' com valor {id} é inválido\"</td>\n</tr>\n<tr>\n<td><code>contractType</code> inválido (sem CRM Voalle)</td>\n<td>\"O Tipo de Contrato é inválido. Verifique se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\"</td>\n</tr>\n<tr>\n<td><code>crmCampaignCode</code> inválido (com CRM Voalle)</td>\n<td>\"O código da Campanha é inválido. Verifique se há espaços em branco no início e no final do campo ou espaços duplicados entre os caracteres.\"</td>\n</tr>\n<tr>\n<td>Lead não encontrado (fluxo CRM Voalle)</td>\n<td>\"Lead não encontrado\"</td>\n</tr>\n<tr>\n<td>Endereço do lead não encontrado</td>\n<td>\"Endereço do Lead não encontrado\"</td>\n</tr>\n<tr>\n<td>Funil de vendas/fase não configurados</td>\n<td>\"Funil de vendas não encontrado\", \"Fase do funil de vendas não encontrado\"</td>\n</tr>\n<tr>\n<td>Campanha não encontrada para uso E-commerce</td>\n<td>\"Campanha de vendas não encontrada ou não é de uso Integração E-commerce.\"</td>\n</tr>\n<tr>\n<td>Região não encontrada para o endereço do lead</td>\n<td>\"Nenhuma região encontrada para o endereço do Lead\"</td>\n</tr>\n<tr>\n<td>Região do lead não vinculada à campanha</td>\n<td>\"Região do endereço do Lead não vinculada com a campanha\"</td>\n</tr>\n<tr>\n<td>Equipe de negociação não definida nos parâmetros</td>\n<td>\"Equipe para negociações geradas a partir de sistemas de terceiros não definida nos parâmetros do CRM.\"</td>\n</tr>\n<tr>\n<td>Vendedor responsável fora da equipe da negociação</td>\n<td>\"O vendedor informado (ResponsibleSellerTxId) não pertence a equipe informada.\"</td>\n</tr>\n<tr>\n<td>Lista de preço não encontrada/inativa</td>\n<td>\"Lista de preço não encontrada, verifique se o registro não foi deletado ou inativo.\"</td>\n</tr>\n<tr>\n<td>Equipe não vinculada à campanha de uso E-commerce</td>\n<td>\"Equipe para negociação não vinculada com a campanha de uso Integração E-commerce.\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200 — o campo <code>success</code> indica o resultado real da operação.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Os códigos de tipo de contrato/serviço podem ser obtidos em \"Consulta Tipo de Contratos e Serviços\".</li>\n<li>Os códigos de campanha/lista de preço podem ser obtidos em \"Consulta Campanhas e Serviços\".</li>\n<li>O <code>viabilityId</code> pode ser obtido em \"Consulta viabilidade - via integração com mapas\".</li>\n<li>O <code>protocolId</code> retornado é usado em \"Cancela Negociação\".</li>\n<li>Serviços adicionais podem ser incluídos posteriormente com \"Incluir serviço no contrato\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","crm","startsale"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"7a098346-c352-4817-96a9-d6538432a467","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/x-www-form-urlencoded","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"txId\": \"string\",\r\n    \"companyPlaceTxId\": \"string\",\r\n    \"thirdSellerTxId\": \"string\",\r\n    \"contractType\": \"string\",\r\n    \"crmCampaignCode\": \"string\",\r\n    \"crmPriceListCode\": \"string\",\r\n    \"contractPaymentFormCode\": \"string\",\r\n    \"contractFinancialCollectionTypeCode\": \"string\",\r\n    \"contractDateManagementCode\": \"string\",\r\n    \"contractCollectionDay\": \"string\",\r\n    \"activationIncidentTypeCode\": \"string\",\r\n    \"activationGroupInMonthlyFee\": true,\r\n    \"activationFirstParcelDate\": \"2025-12-12\",\r\n    \"activationPaymentFormCode\": \"string\",\r\n    \"activationFinancialCollectionTypeCode\": \"string\",\r\n    \"activationPaymentConditionCode\": \"string\",\r\n    \"serviceProducts\": [\r\n        {\r\n            \"code\": \"string\",\r\n            \"quantity\": 0,\r\n            \"amount\": 0.0,\r\n            \"paymentFormCode\": \"string\"\r\n        }\r\n    ],\r\n    \"clientSaleInfo\": {\r\n        \"name\": \"string\",\r\n        \"typeTxId\": 0,\r\n        \"phone\": \"string\",\r\n        \"cellPhone1\": \"string\",\r\n        \"email\": \"string\",\r\n        \"emailNfe\": \"string\",\r\n        \"birthDate\": \"2024-02-09\",\r\n        \"gender\": null,\r\n        \"civilStatus\": null,\r\n        \"identity\": \"string\",\r\n        \"parentsName\": \"string\",\r\n        \"stateRegistration\": \"string\",\r\n        \"municipalRegistration\": \"string\",\r\n        \"stateRegistrationType\": 0,\r\n        \"isSigner\": false,\r\n        \"addressSaleInfo\": {\r\n            \"postalCode\": \"string\",\r\n            \"street\": \"string\",\r\n            \"streetType\": 0,\r\n            \"number\": \"string\",\r\n            \"neighborhood\": \"string\",\r\n            \"state\": \"string\",\r\n            \"city\": \"string\",\r\n            \"addressComplement\": \"string\",\r\n            \"addressReference\": \"string\",\r\n            \"propertyType\": 0,\r\n            \"residenceTypeCode\": \"string\"\r\n        }\r\n    },\r\n    \"observations\": \"string\",\r\n    \"gainInformation\": {\r\n        \"crmOpportunityReasonCode\": \"string\",\r\n        \"contactForm\": \"string\",\r\n        \"reportDescription\": \"string\",\r\n        \"automatic\": true\r\n    },\r\n    \"activationInformation\": {\r\n        \"teamCode\": \"string\",\r\n        \"description\": \"string\",\r\n        \"catalogServiceCode\": \"string\",\r\n        \"categoryMatrixCode\": \"string\"\r\n    },\r\n    \"integratorInformation\": {\r\n        \"integratorIdentification\": \"string\",\r\n        \"negotiationId\": \"string\",\r\n        \"viabilityId\": 0,\r\n        \"contacts\": [\r\n            {\r\n                \"name\": \"string\",\r\n                \"typeTxId\": 0,\r\n                \"txId\": \"string\",\r\n                \"email\": \"string\",\r\n                \"phone\": \"string\",\r\n                \"crmFunctionCode\": \"string\",\r\n                \"classification\": \"string\",\r\n                \"order\": \"string\",\r\n                \"isSigner\": true\r\n            }\r\n        ]\r\n    }\r\n}","options":{"raw":{"language":"json"}}},"url":"htps://erp.cliente.com.br:45715/external/integrations/thirdparty/crm/startsale"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":""}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocolId\": 123456 // Id do protocolo/negociação criado, usado em \"Cancela Negociação\"\n    },\n    \"dataResponseType\": \"ReturnMessageInfo\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"a1f669c1-a913-4c20-8f56-7d0e9abaeca0"},{"name":"Incluir serviço no contrato","id":"904d5e0b-4619-4961-befe-4074af662b96","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"string\", // Número do contrato\n    \"crmCampaignCode\": \"string\", // Código da campanha. Obrigatório para quem utiliza CRM Voalle\n    \"crmPriceListCode\": \"string\", // Código da lista de preço. Obrigatório para quem utiliza CRM Voalle\n    \"generateProportionality\": false, // Gera valor promocional. true - Sim, false = Não\n    \"newServices\": [\n        {\n            \"code\": \"string\", // Código do serviço\n            \"quantity\": 0, // Quantidade do serviço\n            \"price\": 10.0, // Preço de venda\n            \"paymentFormCode\": \"string\", // Código da forma de pagamento\n            \"serviceTagOption\": 0, // Opção de gerar etiqueta\n            \"contractServiceTag\": \"string\", // Etiqueta existente\n            \"contractServiceTagDescription\": \"string\", // Nova etiqueta\n            \"phoneGroupId\": \"string\", // Id publico do grupo de telefone\n            \"phoneNumberInformations\": [\n                {\n                    \"phoneNumber\": \"55999999999\", // Número a ser vinculado ao item de contrato\n                    \"phoneNumberType\": 0, // Tipo de número 0 - Fixo, 1 - Celular, 2 - Outro\n                    \"isPortability\": true // Identifica se é uma portabilidade ou não\n                }\n            ]\n        }\n    ]\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/addcontractservices","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Inclui um ou mais serviços em um contrato já existente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>O contrato informado deve existir no ERP e possuir endereço vinculado.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Se o módulo CRM Voalle estiver ativo, <code>crmCampaignCode</code> e <code>crmPriceListCode</code> são obrigatórios, e os serviços incluídos precisam pertencer à lista de preço/campanha informada, respeitando a região do contrato e a vigência da campanha.</li>\n<li>Se o módulo CRM Voalle <strong>não</strong> estiver ativo, apenas <code>contractNumber</code> é obrigatório e os serviços são buscados diretamente no cadastro de serviços vendáveis (sem uso de campanha/lista de preço).</li>\n<li>Serviços de telefonia móvel e recarga não podem ser incluídos por esta API.</li>\n<li>Serviços de rede neutra têm tratamento específico e restrições próprias de inclusão.</li>\n<li>Se o valor (<code>price</code>) informado for menor que o valor mínimo de venda do serviço (ou o valor padrão quando não houver mínimo definido), a inclusão é bloqueada — exceto para serviços com fidelização, cujo valor é sempre o da fidelização.</li>\n<li><code>serviceTagOption</code> define o tratamento de etiqueta do item de contrato — se <code>1</code> (Gera Nova Etiqueta) ou <code>3</code> (Utiliza Existente e Atualiza Descrição), <code>contractServiceTagDescription</code> é obrigatório; se <code>2</code> (Utiliza Etiqueta Existente) ou <code>3</code>, <code>contractServiceTag</code> é obrigatório e deve pertencer ao contrato.</li>\n<li>Para serviços que exigem número de telefone (ex.: STFC), é obrigatório informar <code>phoneGroupId</code>; a quantidade de números informados não pode ultrapassar o limite do serviço. Se for portabilidade (<code>isPortability: true</code>) e o número ainda não existir, ele é cadastrado no grupo de telefone informado.</li>\n<li>A operação é bloqueada se o cliente do contrato possuir faturas em aberto e vencidas — a menos que os parâmetros \"Permite venda para inadimplente\" (geral e do CRM) estejam habilitados.</li>\n</ul>\n<p><strong>serviceTagOption</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Ação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Não Vincula Etiqueta</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Gera Nova Etiqueta</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Utiliza Etiqueta Existente</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Utiliza Etiqueta Existente e Atualiza Descrição</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>phoneNumberType</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Descrição</th>\n<th>Regra</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Fixo</td>\n<td>DDD + 8 dígitos</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Celular</td>\n<td>DDD + 9 dígitos</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Outro</td>\n<td>11 dígitos</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractNumber</code></td>\n<td>Sim</td>\n<td>Número do contrato.</td>\n</tr>\n<tr>\n<td><code>crmCampaignCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da campanha.</td>\n</tr>\n<tr>\n<td><code>crmPriceListCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da lista de preço.</td>\n</tr>\n<tr>\n<td><code>generateProportionality</code></td>\n<td>Não</td>\n<td>Gera valor promocional/proporcional.</td>\n</tr>\n<tr>\n<td><code>newServices[].code</code></td>\n<td>Sim</td>\n<td>Código do serviço.</td>\n</tr>\n<tr>\n<td><code>newServices[].quantity</code></td>\n<td>Sim</td>\n<td>Quantidade, deve ser maior que zero.</td>\n</tr>\n<tr>\n<td><code>newServices[].price</code></td>\n<td>Não</td>\n<td>Valor de venda; se omitido, usa o padrão da lista de preço.</td>\n</tr>\n<tr>\n<td><code>newServices[].paymentFormCode</code></td>\n<td>Sim</td>\n<td>Código da forma de pagamento.</td>\n</tr>\n<tr>\n<td><code>newServices[].serviceTagOption</code></td>\n<td>Não</td>\n<td>Ver tabela acima.</td>\n</tr>\n<tr>\n<td><code>newServices[].contractServiceTag</code></td>\n<td>Condicional</td>\n<td>Obrigatório se <code>serviceTagOption</code> = 2 ou 3.</td>\n</tr>\n<tr>\n<td><code>newServices[].contractServiceTagDescription</code></td>\n<td>Condicional</td>\n<td>Obrigatório se <code>serviceTagOption</code> = 1 ou 3.</td>\n</tr>\n<tr>\n<td><code>newServices[].phoneGroupId</code></td>\n<td>Condicional</td>\n<td>Obrigatório para serviços que exigem telefone (ex.: STFC).</td>\n</tr>\n<tr>\n<td><code>newServices[].phoneNumberInformations</code></td>\n<td>Condicional</td>\n<td>Lista de números a vincular, obrigatória quando o serviço exige telefone e não é DDR.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a inclusão foi realizada.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> — este endpoint não retorna dados em <code>response</code>, apenas a confirmação via <code>messages</code>. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Os exemplos salvos anteriormente para este método usavam um formato <code>{\"Sucess\": \"...\", \"Message\": \"...\"}</code> que não corresponde ao retorno real da API — o endpoint segue o envelope padrão (<code>success</code>/<code>messages</code>/<code>response</code>) mostrado acima. Os exemplos foram corrigidos.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum serviço informado</td>\n<td>\"Nenhum serviço repassado.\"</td>\n</tr>\n<tr>\n<td>Campo obrigatório ausente</td>\n<td>\"Campo {Nome} é obrigatório.\"</td>\n</tr>\n<tr>\n<td>Quantidade menor que 1</td>\n<td>\"Campo Quantity deve ser maior que zero.\"</td>\n</tr>\n<tr>\n<td>Contrato não encontrado</td>\n<td>\"Contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Contrato sem endereço</td>\n<td>\"Contrato não possui endereço.\"</td>\n</tr>\n<tr>\n<td>Campanha não encontrada/inválida</td>\n<td>\"Campanha não encontrada.\"</td>\n</tr>\n<tr>\n<td>Lista de preços não encontrada</td>\n<td>\"Lista de preços não encontrada.\"</td>\n</tr>\n<tr>\n<td>Região do contrato não encontrada</td>\n<td>\"Região do contrato não encontrada.\"</td>\n</tr>\n<tr>\n<td>Região gerenciada por FSM</td>\n<td>\"Região do contrato gerenciada por FSM.\"</td>\n</tr>\n<tr>\n<td>Lista de preços não vinculada à campanha</td>\n<td>\"Lista de preços não encontrada na campanha.\"</td>\n</tr>\n<tr>\n<td>Campanha fora da vigência</td>\n<td>\"Campanha não é válida para a data atual.\"</td>\n</tr>\n<tr>\n<td>Campanha não atende a região do contrato</td>\n<td>\"Campanha não atende a região do contrato.\"</td>\n</tr>\n<tr>\n<td>Serviço não encontrado na lista de preços</td>\n<td>\"O serviço de código \"{código}\" não foi encontrado.\"</td>\n</tr>\n<tr>\n<td>Combinação serviço + forma de pagamento fora da lista de preço</td>\n<td>\"Serviço com o código {código} e a forma de pagamento com código {código} não faz parte da lista de preços passada.\"</td>\n</tr>\n<tr>\n<td>Valor abaixo do mínimo permitido</td>\n<td>\"Valor passado para o serviço com o código {código} é menor do que o valor mínimo do serviço.\" (ou variação com forma de pagamento)</td>\n</tr>\n<tr>\n<td><code>contractServiceTagDescription</code> ausente quando exigido</td>\n<td>\"'contractServiceTagDescription' é obrigatório no serviço com o código {código}.\"</td>\n</tr>\n<tr>\n<td><code>contractServiceTag</code> ausente quando exigido</td>\n<td>\"'contractServiceTag' é obrigatório para o serviço com o código {código}.\"</td>\n</tr>\n<tr>\n<td>Cliente inadimplente</td>\n<td>\"Cliente possui faturas em aberto e vencidas.\"</td>\n</tr>\n<tr>\n<td>Grupo de telefone não informado (serviço exige telefone)</td>\n<td>\"Não foi informado um grupo de telefone para o serviço \"{código}\" - \"{título}\"\"</td>\n</tr>\n<tr>\n<td>Números de telefone não informados (serviço exige telefone)</td>\n<td>\"Não foram informados números de telefone para o serviço \"{código}\" - \"{título}\"\"</td>\n</tr>\n<tr>\n<td>Quantidade de números maior que o permitido</td>\n<td>\"Foi informada uma quantidade de números maior do que o permitido para o serviço \"{código}\" - \"{título}\"\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200 — o campo <code>success</code> indica o resultado real da operação.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar às APIs \"Alterar serviço do contrato\" e \"Nova negociação\". Os códigos de serviço/campanha/lista de preço podem ser obtidos em \"Consulta Tipo de Contratos e Serviços\" e \"Consulta Campanhas e Serviços\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","addcontractservices"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"a8c2e4c3-8328-424d-8258-0fc38b9a15e1","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"crmCampaignCode\": \"001\",\n    \"crmPriceListCode\": \"555\",\n    \"generateProportionality\": false,\n    \"newServices\": [\n        {\n            \"code\": \"1.1\",\n            \"quantity\": 1,\n            \"paymentFormCode\": \"0076\",\n            \"serviceTagOption\": 1,\n            \"contractServiceTag\": \"\",\n            \"contractServiceTagDescription\": \"\"\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/addcontractservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Inclusão de serviços realizada com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"5a6f693e-8c71-44a6-b4c8-64400561d6b0","name":"Sucesso — serviço STFC (com telefone)","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"crmCampaignCode\": \"001\",\n    \"crmPriceListCode\": \"555\",\n    \"generateProportionality\": false,\n    \"newServices\": [\n        {\n            \"code\": \"1.1\",\n            \"quantity\": 1,\n            \"price\": 100,\n            \"paymentFormCode\": \"0001\",\n            \"serviceTagOption\": 1,\n            \"contractServiceTag\": \"\",\n            \"contractServiceTagDescription\": \"\",\n            \"phoneGroupId\": \"123123123-1234-5678-1231-123123\",\n            \"phoneNumberInformations\": [\n                {\n                    \"phoneNumber\": \"55999999999\",\n                    \"phoneNumberType\": 1,\n                    \"isPortability\": true\n                }\n            ]\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/addcontractservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Inclusão de serviços realizada com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"e41ac9e5-9016-4326-9eac-05ceaf23ab72","name":"Erro — cliente com faturas em aberto e vencidas","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"crmCampaignCode\": \"001\",\n    \"crmPriceListCode\": \"555\",\n    \"generateProportionality\": false,\n    \"newServices\": [\n        {\n            \"code\": \"1.1\",\n            \"quantity\": 1,\n            \"paymentFormCode\": \"0076\",\n            \"serviceTagOption\": 1,\n            \"contractServiceTag\": \"\",\n            \"contractServiceTagDescription\": \"\"\n        }\n    ]\n}\n","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/addcontractservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Cliente possui faturas em aberto e vencidas.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"904d5e0b-4619-4961-befe-4074af662b96"},{"name":"Alterar serviço do contrato","id":"dd7f417c-9b7f-41ed-99b3-bb5411d8d7ed","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"string\", // Número do contrato\n    \"crmCampaignCode\": \"string\", // Código da campanha. Obrigatório para quem utiliza CRM Voalle\n    \"crmPriceListCode\": \"string\", // Código da lista de preço. Obrigatório para quem utiliza CRM Voalle\n    \"generateProportionality\": false, // Gera valor promocional. true - Sim, false = Não\n    \"newServices\": [\n        {\n            \"oldContractItemId\": 0, // Id do item de contrato que será substituido\n            \"code\": \"string\", // Código do serviço\n            \"quantity\": 0, // Quantidade do serviço\n            \"price\": 10.0, // Preço de venda\n            \"paymentFormCode\": \"string\", // Código da forma de pagamento\n            \"serviceTagOption\": 0, // Opção de gerar etiqueta\n            \"contractServiceTag\": \"string\", // Etiqueta existente\n            \"contractServiceTagDescription\": \"string\", // Nova etiqueta\n            \"phoneGroupId\": \"string\", // Id publico do grupo de telefone\n            \"phoneNumberInformations\": [\n                {\n                    \"phoneNumber\": \"55999999999\", // Número a ser vinculado ao item de contrato\n                    \"phoneNumberType\": 0, // Tipo de número 0 - Fixo, 1 - Celular, 2 - Outro\n                    \"isPortability\": true // Identifica se é uma portabilidade ou não\n                }\n            ]\n        }\n    ]\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/changecontractservices","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Substitui um ou mais itens de serviço já existentes em um contrato por novos serviços (troca de serviço).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>O contrato e os itens de contrato a serem substituídos (<code>oldContractItemId</code>) devem existir e pertencer ao contrato informado.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>oldContractItemId</code> é <strong>obrigatório</strong> em cada item de <code>newServices</code> — identifica o item de contrato atual que será substituído. Sem ele, a troca é recusada.</li>\n<li>O item de contrato informado em <code>oldContractItemId</code> precisa pertencer ao contrato informado em <code>contractNumber</code>.</li>\n<li>Se o módulo CRM Voalle estiver ativo, <code>crmCampaignCode</code> e <code>crmPriceListCode</code> são obrigatórios, e o novo serviço precisa pertencer à lista de preço/campanha informada, respeitando região e vigência da campanha.</li>\n<li>Se o módulo CRM Voalle <strong>não</strong> estiver ativo, mas o parâmetro \"Forçar lista de preços na troca de item\" estiver habilitado, <code>servicePriceListPublicId</code> passa a ser obrigatório e o novo serviço deve pertencer a essa lista de preços.</li>\n<li>Serviços de telefonia móvel e recarga não podem ser usados nesta API.</li>\n<li>Se o valor (<code>price</code>) informado for menor que o valor mínimo de venda do serviço, a troca é bloqueada — exceto para serviços com fidelização.</li>\n<li><code>serviceTagOption</code> segue as mesmas regras de \"Incluir serviço no contrato\" (ver tabela abaixo).</li>\n<li>Para serviços que exigem número de telefone (ex.: STFC), é obrigatório informar <code>phoneGroupId</code> e os números correspondentes.</li>\n<li>A operação é bloqueada se o cliente do contrato possuir faturas em aberto e vencidas, salvo se os parâmetros de venda para inadimplente estiverem habilitados.</li>\n</ul>\n<p><strong>serviceTagOption</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Ação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Não Vincula Etiqueta</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Gera Nova Etiqueta</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Utiliza Etiqueta Existente</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Utiliza Etiqueta Existente e Atualiza Descrição</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>phoneNumberType</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Descrição</th>\n<th>Regra</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Fixo</td>\n<td>DDD + 8 dígitos</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Celular</td>\n<td>DDD + 9 dígitos</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Outro</td>\n<td>11 dígitos</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractNumber</code></td>\n<td>Sim</td>\n<td>Número do contrato.</td>\n</tr>\n<tr>\n<td><code>crmCampaignCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da campanha.</td>\n</tr>\n<tr>\n<td><code>crmPriceListCode</code></td>\n<td>Sim, se módulo CRM Voalle ativo</td>\n<td>Código da lista de preço.</td>\n</tr>\n<tr>\n<td><code>generateProportionality</code></td>\n<td>Não</td>\n<td>Gera valor promocional/proporcional.</td>\n</tr>\n<tr>\n<td><code>newServices[].oldContractItemId</code></td>\n<td>Sim</td>\n<td>Id do item de contrato a ser substituído.</td>\n</tr>\n<tr>\n<td><code>newServices[].code</code></td>\n<td>Sim</td>\n<td>Código do novo serviço.</td>\n</tr>\n<tr>\n<td><code>newServices[].quantity</code></td>\n<td>Sim</td>\n<td>Quantidade, deve ser maior que zero.</td>\n</tr>\n<tr>\n<td><code>newServices[].price</code></td>\n<td>Não</td>\n<td>Valor de venda; se omitido, usa o padrão.</td>\n</tr>\n<tr>\n<td><code>newServices[].paymentFormCode</code></td>\n<td>Sim</td>\n<td>Código da forma de pagamento.</td>\n</tr>\n<tr>\n<td><code>newServices[].serviceTagOption</code></td>\n<td>Não</td>\n<td>Ver tabela acima.</td>\n</tr>\n<tr>\n<td><code>newServices[].contractServiceTag</code></td>\n<td>Condicional</td>\n<td>Obrigatório se <code>serviceTagOption</code> = 2 ou 3.</td>\n</tr>\n<tr>\n<td><code>newServices[].contractServiceTagDescription</code></td>\n<td>Condicional</td>\n<td>Obrigatório se <code>serviceTagOption</code> = 1 ou 3.</td>\n</tr>\n<tr>\n<td><code>newServices[].phoneGroupId</code></td>\n<td>Condicional</td>\n<td>Obrigatório para serviços que exigem telefone.</td>\n</tr>\n<tr>\n<td><code>newServices[].phoneNumberInformations</code></td>\n<td>Condicional</td>\n<td>Números a vincular, quando aplicável.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a troca foi realizada.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> — este endpoint não retorna dados em <code>response</code>, apenas a confirmação via <code>messages</code>. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Os exemplos salvos anteriormente para este método usavam um formato <code>{\"Sucess\": \"...\", \"Message\": \"...\"}</code> que não corresponde ao retorno real da API — o endpoint segue o envelope padrão (<code>success</code>/<code>messages</code>/<code>response</code>) mostrado acima. Os exemplos foram corrigidos.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum serviço informado</td>\n<td>\"Nenhum serviço repassado.\"</td>\n</tr>\n<tr>\n<td>Campo obrigatório ausente</td>\n<td>\"Campo {Nome} é obrigatório.\"</td>\n</tr>\n<tr>\n<td>Quantidade menor que 1</td>\n<td>\"Campo Quantity deve ser maior que zero.\"</td>\n</tr>\n<tr>\n<td><code>oldContractItemId</code> não informado</td>\n<td>\"O campo 'oldContractItemId' é obrigatório para o serviço com o código {código}.\"</td>\n</tr>\n<tr>\n<td>Item de contrato não pertence ao contrato</td>\n<td>\"O item de contrato {id} não faz parte do contrato passado.\"</td>\n</tr>\n<tr>\n<td>Contrato não encontrado</td>\n<td>\"Contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Contrato sem endereço</td>\n<td>\"Contrato não possui endereço.\"</td>\n</tr>\n<tr>\n<td>Campanha não encontrada/inválida</td>\n<td>\"Campanha não encontrada.\"</td>\n</tr>\n<tr>\n<td>Lista de preços não encontrada</td>\n<td>\"Lista de preços não encontrada.\"</td>\n</tr>\n<tr>\n<td>Região do contrato não encontrada</td>\n<td>\"Região do contrato não encontrada.\"</td>\n</tr>\n<tr>\n<td>Região gerenciada por FSM</td>\n<td>\"Região do contrato gerenciada por FSM.\"</td>\n</tr>\n<tr>\n<td>Lista de preços não vinculada à campanha</td>\n<td>\"Lista de preços não encontrada na campanha.\"</td>\n</tr>\n<tr>\n<td>Campanha fora da vigência</td>\n<td>\"Campanha não é válida para a data atual.\"</td>\n</tr>\n<tr>\n<td>Campanha não atende a região do contrato</td>\n<td>\"Campanha não atende a região do contrato.\"</td>\n</tr>\n<tr>\n<td>Serviço não encontrado na lista de preços</td>\n<td>\"O serviço de código \"{código}\" não foi encontrado.\"</td>\n</tr>\n<tr>\n<td>Valor abaixo do mínimo permitido</td>\n<td>\"Valor passado para o serviço com o código {código} é menor do que o valor mínimo do serviço.\"</td>\n</tr>\n<tr>\n<td><code>contractServiceTagDescription</code> ausente quando exigido</td>\n<td>\"'contractServiceTagDescription' é obrigatório no serviço com o código {código}.\"</td>\n</tr>\n<tr>\n<td><code>contractServiceTag</code> ausente quando exigido</td>\n<td>\"'contractServiceTag' é obrigatório para o serviço com o código {código}.\"</td>\n</tr>\n<tr>\n<td>Cliente inadimplente</td>\n<td>\"Cliente possui faturas em aberto e vencidas.\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima retornam HTTP 200 — o campo <code>success</code> indica o resultado real da operação.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar à API \"Incluir serviço no contrato\". Os códigos de serviço/campanha/lista de preço podem ser obtidos em \"Consulta Tipo de Contratos e Serviços\" e \"Consulta Campanhas e Serviços\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","changecontractservices"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"c74578a1-5bc4-4da8-80fc-28265025b9c3","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"crmCampaignCode\": \"001\",\n    \"crmPriceListCode\": \"555\",\n    \"generateProportionality\": false,\n    \"newServices\": [\n        {\n            \"code\": \"1.1\",\n            \"quantity\": 1,\n            \"paymentFormCode\": \"0076\",\n            \"serviceTagOption\": 1,\n            \"contractServiceTag\": \"\",\n            \"contractServiceTagDescription\": \"\",\n            \"oldContractItemId\": 1\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/changecontractservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Alteração de serviços realizada com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"83141267-7f3e-44f7-a10a-f6200b5ac428","name":"Erro — cliente com faturas em aberto e vencidas","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"crmCampaignCode\": \"001\",\n    \"crmPriceListCode\": \"555\",\n    \"generateProportionality\": false,\n    \"newServices\": [\n        {\n            \"code\": \"1.1\",\n            \"quantity\": 1,\n            \"paymentFormCode\": \"0076\",\n            \"serviceTagOption\": 1,\n            \"contractServiceTag\": \"\",\n            \"contractServiceTagDescription\": \"\",\n            \"oldContractItemId\": 1\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/changecontractservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Cliente possui faturas em aberto e vencidas.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"dd7f417c-9b7f-41ed-99b3-bb5411d8d7ed"},{"name":"Remover serviço no contrato","id":"4c467f4f-a89c-471c-ad30-8838471033c8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"string\", //Número do contrato\n    \"removeService\": [\n        {\n            \"contractItem\": 0 // Id do item de contrato\n        }\n    ]\n}","options":{"raw":{"language":"text"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/removecontractitems","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Remove um ou mais itens (serviços) de um contrato já existente no ERP, identificado pelo número do contrato.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractNumber</code></td>\n<td>Sim</td>\n<td>Número do contrato do qual o(s) serviço(s) será(ão) removido(s).</td>\n</tr>\n<tr>\n<td><code>removeService[].contractItem</code></td>\n<td>Sim</td>\n<td>Id do item de contrato (serviço) a remover. Aceita lista, para remover múltiplos itens em uma única chamada.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>É possível remover todos os itens de um contrato por esta API. O contrato pode ficar sem nenhum serviço ativo e <strong>nenhum status é alterado automaticamente</strong> nesse caso. Se a intenção é cancelar o contrato por completo, não use esta API — utilize a jornada de cancelamento de contrato.</li>\n<li>Um item não pode ser removido quando:<ul>\n<li>possui serviços filhos vinculados a ele;</li>\n<li>está vinculado a uma conexão ativa do cliente (é necessário excluir a conexão antes);</li>\n<li>é uma linha de telefonia móvel (MVNO) sem integração ativa no ERP;</li>\n<li>é um item de telefonia móvel com uma ação em execução no momento;</li>\n<li>possui configuração de rede neutra (a remoção de itens de rede neutra não é suportada por este endpoint).</li>\n</ul>\n</li>\n<li>Todos os itens enviados são validados antes de qualquer remoção. Se um único item for inválido, <strong>nenhum item da chamada é removido</strong>.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a remoção foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> — este endpoint não retorna dados em <code>response</code>, apenas a confirmação via <code>messages</code>. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Os exemplos salvos anteriormente para este método usavam um formato <code>{\"Sucess\": true, \"Message\": \"...\"}</code> que não corresponde ao retorno real da API — o endpoint segue o envelope padrão (<code>success</code>/<code>messages</code>/<code>response</code>) mostrado acima. Os exemplos foram corrigidos.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractItem</code> não existe, não pertence ao contrato informado, ou já foi removido anteriormente</td>\n<td>\"O item de contrato {id} não faz parte do contrato passado.\"</td>\n</tr>\n<tr>\n<td>Item possui serviços filhos vinculados</td>\n<td>\"O serviço possui serviços filhos vinculados.\"</td>\n</tr>\n<tr>\n<td>Item vinculado a conexão ativa do cliente</td>\n<td>\"Serviço vinculado a conexão do cliente, impossível excluir. Para prosseguir deve ser excluída a conexão.\"</td>\n</tr>\n<tr>\n<td>Item de telefonia móvel (MVNO) sem integração ativa</td>\n<td>\"Não é possível prosseguir com a remoção de serviço, pois o serviço que se está tentando remover possui linha de MVNO ativa não integrada pelo ERP.\"</td>\n</tr>\n<tr>\n<td>Item de telefonia móvel com ação em andamento</td>\n<td>\"Não é possível excluir o item de telefonia móvel pois uma ação está em execução.\"</td>\n</tr>\n<tr>\n<td>Item com configuração de rede neutra</td>\n<td>\"Não é possível prosseguir com esta ação em serviços que contenham configuração de Rede Neutra.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>As mensagens de erro acima retornam no corpo da resposta (<code>messages</code>); confira sempre esse campo antes de assumir sucesso apenas pelo status HTTP.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar a \"Incluir serviço no contrato\" e \"Alterar serviço do contrato\", do mesmo módulo (CRM Voalle).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","removecontractitems"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"b510d0f2-fd1d-4f25-be07-963dc43d7531","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"removeService\": [\n        {\n            \"contractItem\": 897\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/removecontractitems"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        { \"type\": \"Success\", \"message\": \"Remoção de serviço realizada com sucesso.\", \"code\": null }\n    ],\n    \"response\": null\n}"},{"id":"bbce031f-b999-41a8-b5be-3be66862e573","name":"Erro — item não pertence ao contrato","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"contractNumber\": \"123\",\n    \"removeService\": [\n        {\n            \"contractItem\": 897\n        },\n        {\n            \"contractItem\": 654\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/removecontractitems"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"O item de contrato 897 não faz parte do contrato passado.\", \"code\": null }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"4c467f4f-a89c-471c-ad30-8838471033c8"},{"name":"Consulta viabilidade - via integração com mapas","id":"cddd65da-a6bc-449f-94b1-37d345ef0218","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n  \"fullAddress\": {\n    \"address\": \"string\", //Endereço\n    \"number\": \"string\", //Número\n    \"neighborhood\": \"string\", // Bairro\n    \"city\": \"string\", // Cidade\n    \"state\": \"string\", // Estado\n    \"postalCode\": \"string\" // CEP\n  },\n  \"distance\": \"string\", // Raio para consulta\n    //informações adicionais não obrigatórias\n  \"searchNearestCtoPort\": false, // Se true, busca a CTO/porta livre mais próxima do endereço (dispara chamadas adicionais ao sistema de mapas). Opcional, padrão: false\n  \"lead\": { // Informações do Lead na integradora\n    \"id\": \"string\",\n    \"name\": \"string\", // Nome do cliente\n    \"txIdType\": \"string\", // 1-CPF e 2-CNPJ\n    \"txId\": \"string\", // CPF/CNPJ\n    \"phone\": \"string\" // Telefone\n  },\n  \"seller\": { // Informações do vendedor na integradora\n    \"id\": \"string\", \n    \"name\": \"string\", // Nome do vendedor\n    \"txIdType\": \"string\", // 1-CPF e 2-CNPJ\n    \"txId\": \"string\", // CPF/CNPJ\n    \"phone\": \"string\" // Telefone\n  },\n  \"campaign\": { // Informações da campanha na integradora\n    \"id\": \"string\", // Id da campanha\n    \"description\": \"string\" // Descrição\n  }\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/verifyviability","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza, via integração com um sistema de documentação de redes (mapas), a consulta de viabilidade técnica para um determinado endereço.</p>\n<p>Nesse modelo o ERP atua como ponte entre o sistema terceiro que está realizando a requisição e o sistema de documentação de rede integrado ao ERP Voalle, retornando se há viabilidade técnica e quantas portas estão disponíveis na região.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Integração com sistema de mapas/documentação de rede configurada no ERP.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Opcionalmente, ao informar <code>searchNearestCtoPort: true</code>, o ERP também busca a CTO mais próxima do endereço que possua ao menos uma porta livre (respeitando a ordem de distância retornada pelo sistema de mapas, limitada a 5 tentativas). Quando encontrada, os campos <code>nearestCtoId</code>, <code>nearestCtoFirstFreePortId</code> e <code>nearestCtoFirstFreePortEquipmentId</code> são retornados preenchidos — este último identifica o equipamento/splitter pai da porta e é usado pela API \"Nova negociação\" para reservar a porta automaticamente, sem nova consulta ao sistema de mapas. Por disparar chamadas adicionais ao sistema de mapas, essa busca é opcional (padrão: <code>false</code>) e deve ser habilitada apenas por integrações que efetivamente consomem esses campos.</li>\n<li>Quando nenhuma porta livre é encontrada dentro do limite de tentativas, os três campos acima retornam <code>null</code> e a resposta traz a mensagem \"Não foi possível encontrar porta livre para o endereço\" no campo <code>messages</code> do objeto de dados retornado — o processamento não é interrompido, os demais dados (<code>viability</code>/<code>ctos</code>/<code>ports</code>) continuam sendo retornados normalmente.</li>\n<li>Na API \"Nova negociação\" existe o campo <code>integratorInformation.viabilityId</code>, preenchido com o <code>verifyViabilityId</code> retornado aqui, para vincular a negociação à consulta de viabilidade realizada.</li>\n<li>Os registros de viabilidade são encontrados na rotina CRM Voalle / Operações / Dashboard - Gerente, menu Acompanhamento - Consulta de Viabilidade.</li>\n<li>⚠ A lógica de decisão sobre viabilidade, limite de tentativas e mensagens (acima) está implementada no próprio Gateway. Porém, os dados brutos de estruturas de rede e portas disponíveis (quantidade de CTOs, portas livres) vêm de uma chamada a um sistema externo de mapas/documentação de rede — não foi possível confirmar no repositório do GW o comportamento interno desse sistema externo (ex.: critério de ordenação por distância, precisão geográfica). Isso é uma integração de terceiro genuinamente fora do escopo deste repositório.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fullAddress.address</code></td>\n<td>Sim</td>\n<td>Endereço (logradouro). Entre 3 e 255 caracteres, sem caracteres especiais.</td>\n</tr>\n<tr>\n<td><code>fullAddress.number</code></td>\n<td>Sim</td>\n<td>Número. Máx. 45 caracteres, sem caracteres especiais.</td>\n</tr>\n<tr>\n<td><code>fullAddress.neighborhood</code></td>\n<td>Sim</td>\n<td>Bairro. Máx. 255 caracteres, sem caracteres especiais.</td>\n</tr>\n<tr>\n<td><code>fullAddress.city</code></td>\n<td>Sim</td>\n<td>Cidade. Entre 3 e 255 caracteres, sem caracteres especiais.</td>\n</tr>\n<tr>\n<td><code>fullAddress.state</code></td>\n<td>Sim</td>\n<td>UF. Exatamente 2 caracteres válidos.</td>\n</tr>\n<tr>\n<td><code>fullAddress.postalCode</code></td>\n<td>Sim</td>\n<td>CEP. Exatamente 9 caracteres (com máscara <code>00000-000</code>), formato válido.</td>\n</tr>\n<tr>\n<td><code>distance</code></td>\n<td>Sim</td>\n<td>Raio de busca, em metros. Numérico, entre 1 e 255 caracteres.</td>\n</tr>\n<tr>\n<td><code>searchNearestCtoPort</code></td>\n<td>Não</td>\n<td>Se <code>true</code>, busca a CTO/porta livre mais próxima (chamadas adicionais ao sistema de mapas). Padrão: <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>Não</td>\n<td>Máx. 255 caracteres, sem caracteres especiais.</td>\n</tr>\n<tr>\n<td><code>lead.txIdType</code> / <code>seller.txIdType</code></td>\n<td>Condicional</td>\n<td>1 - CPF, 2 - CNPJ. Obrigatório se o bloco <code>lead</code>/<code>seller</code> for enviado.</td>\n</tr>\n<tr>\n<td><code>lead.txId</code> / <code>seller.txId</code></td>\n<td>Não</td>\n<td>Validado conforme <code>txIdType</code>.</td>\n</tr>\n<tr>\n<td><code>lead.phone</code></td>\n<td>Não</td>\n<td>Formato de telefone válido.</td>\n</tr>\n<tr>\n<td><code>campaign.id</code> / <code>campaign.description</code></td>\n<td>Não</td>\n<td>Id numérico e descrição da campanha na integradora.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi realizada.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.viability</code></td>\n<td>boolean</td>\n<td>Indica se existe viabilidade para o endereço informado dentro da distância enviada.</td>\n</tr>\n<tr>\n<td><code>response.ctos</code></td>\n<td>integer</td>\n<td>Número de CTOs na área.</td>\n</tr>\n<tr>\n<td><code>response.ports</code></td>\n<td>integer</td>\n<td>Número de portas disponíveis.</td>\n</tr>\n<tr>\n<td><code>response.nearestCtoId</code></td>\n<td>string|null</td>\n<td>Id da CTO mais próxima com porta livre. Só é preenchido quando <code>searchNearestCtoPort: true</code> é enviado na requisição e uma porta livre é encontrada; caso contrário, retorna <code>null</code>.</td>\n</tr>\n<tr>\n<td><code>response.nearestCtoFirstFreePortId</code></td>\n<td>string|null</td>\n<td>Id da primeira porta livre da CTO mais próxima (<code>nearestCtoId</code>).</td>\n</tr>\n<tr>\n<td><code>response.nearestCtoFirstFreePortEquipmentId</code></td>\n<td>string|null</td>\n<td>Id do equipamento/splitter pai da porta, usado por \"Nova negociação\" para reservar a porta automaticamente.</td>\n</tr>\n<tr>\n<td><code>response.messages</code></td>\n<td>string|null</td>\n<td>\"Não foi possível encontrar porta livre para o endereço\" quando <code>searchNearestCtoPort: true</code> não encontra nenhuma porta livre dentro do limite de tentativas; <code>null</code> caso contrário.</td>\n</tr>\n<tr>\n<td><code>response.verifyViabilityId</code></td>\n<td>integer</td>\n<td>Id do registro de auditoria da consulta, usado em \"Nova negociação\" (<code>integratorInformation.viabilityId</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code></strong> (envelope padrão, HTTP 200, erro de validação de campos):</p>\n<p>Comportamento de <code>response</code> nesse cenário não confirmado nos exemplos salvos desta request — apenas um exemplo de sucesso e um exemplo de falha HTTP 500 (fora do envelope padrão, ver nota abaixo) estão salvos.</p>\n<p>⚠ <strong>Desvio de padrão</strong>: em caso de exceção não tratada (ex.: falha de comunicação com o sistema de mapas, erro ao gravar o registro de auditoria da consulta), a API retorna <strong>HTTP 500</strong> com um corpo simples, fora do envelope padrão: <code>{\"Type\": ..., \"Message\": \"...\", \"Code\": ...}</code> (sem <code>success</code>/<code>messages</code>/<code>response</code>). Trate qualquer resposta HTTP diferente de 200 como uma falha técnica inesperada.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n<th>HTTP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Campo obrigatório do endereço ausente</td>\n<td>\"O campo '{campo}' é obrigatório\"</td>\n<td>200 (envelope padrão, <code>success: false</code>)</td>\n</tr>\n<tr>\n<td>CEP inválido</td>\n<td>\"CEP é inválido.\"</td>\n<td>200</td>\n</tr>\n<tr>\n<td>UF inválida</td>\n<td>\"UF é inválida.\"</td>\n<td>200</td>\n</tr>\n<tr>\n<td><code>distance</code> não numérico</td>\n<td>\"O campo 'distance' deve ser um número válido.\"</td>\n<td>200</td>\n</tr>\n<tr>\n<td><code>lead</code>/<code>seller</code> com <code>txIdType</code> inválido</td>\n<td>\"Tipo de inscrição do Lead/Seller inválido ou não informado, valores válidos: (1 - CPF / 2 - CNPJ)\"</td>\n<td>200</td>\n</tr>\n<tr>\n<td>CPF/CNPJ do lead/vendedor inválido</td>\n<td>\"CPF do Lead é inválido.\" / \"CNPJ do Lead é inválido.\" (mesmo padrão para Seller)</td>\n<td>200</td>\n</tr>\n<tr>\n<td>Campos com caracteres especiais</td>\n<td>\"O campo '{campo}' possuí caracteres especiais.\"</td>\n<td>200</td>\n</tr>\n<tr>\n<td>Falha inesperada (ex.: sistema de mapas indisponível)</td>\n<td>Objeto simples <code>{Type, Message, Code}</code> — ver nota de desvio de padrão acima</td>\n<td><strong>500</strong></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>O <code>verifyViabilityId</code> retornado é usado no campo <code>integratorInformation.viabilityId</code> da API \"Nova negociação\", e os campos <code>nearestCtoFirstFreePortEquipmentId</code>/<code>nearestCtoId</code> permitem reserva automática de porta nessa mesma API.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","verifyviability"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"8d3df6fd-bc5b-4b3b-a904-58ae4fc405e2","name":"Sucesso — com searchNearestCtoPort","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\r\n    \"fullAddress\": {\r\n        \"address\": \"Rua de teste\",\r\n        \"number\": \"1000\",\r\n        \"neighborhood\": \"Centro\",\r\n        \"city\": \"Santa Maria\",\r\n        \"state\": \"RS\",\r\n        \"postalCode\": \"97050-001\"\r\n    },\r\n    \"distance\": 300,\r\n    \"searchNearestCtoPort\": true,\r\n    \"lead\": {\r\n        \"id\": 11111,\r\n        \"name\": \"Lead de teste\",\r\n        \"txidtype\": \"1\",\r\n        \"txid\": \"999.999.999-99\",\r\n        \"phone\": \"99999999999\"\r\n    },\r\n    \"campaign\": {\r\n        \"id\": \"99999\",\r\n        \"description\": \"Campanha de teste\"\r\n    },\r\n    \"seller\": {\r\n        \"id\": \"123\",\r\n        \"name\": \"Vendedor de teste\",\r\n        \"txidtype\": \"1\",\r\n        \"txid\": \"999.999.999-99\"\r\n    }\r\n}","options":{"raw":{"language":"json"}}},"url":"htps://erp.cliente.com.br:45715/external/integrations/thirdparty/verifyviability"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":""}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Consulta da viabilidade realizada com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"viability\": true, // Indica que existe viabilidade para o endereço informado dentro da distância enviada\n        \"ctos\": 37, // Número de CTO's na área\n        \"ports\": 11, // Número de portas disponíveis\n        \"nearestCtoId\": \"12345\", // Id da CTO mais próxima com porta livre. Só é preenchido quando 'searchNearestCtoPort: true' é enviado na requisição; caso contrário, ou se nenhuma porta livre for encontrada, retorna null\n        \"nearestCtoFirstFreePortId\": \"67890\", // Id da primeira porta livre da CTO mais próxima (nearestCtoId)\n        \"nearestCtoFirstFreePortEquipmentId\": \"54321\", // Id do equipamento/splitter pai da porta, usado pela API de gerar negociação para reservar a porta automaticamente\n        \"messages\": null, // \"Não foi possível encontrar porta livre para o endereço\" quando 'searchNearestCtoPort: true' não encontra nenhuma porta livre dentro do limite de tentativas\n        \"verifyViabilityId\": 999 // Id do registro de auditoria da consulta, usado na API de gerar negociação para vincular a venda à consulta de viabilidade\n    },\n    \"dataResponseType\": \"<>f__AnonymousType760`3\",\n    \"elapsedTime\": null\n}"},{"id":"ad0ebb11-d1dc-4e19-9a95-2708fb38f08a","name":"Erro — falha inesperada (fora do envelope padrão)","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n  \"fullAddress\": {\n    \"address\": \"string\", //Endereço\n    \"number\": \"string\", //Número\n    \"neighborhood\": \"string\", // Bairro\n    \"city\": \"string\", // Cidade\n    \"state\": \"string\", // Estado\n    \"postalCode\": \"string\" // CEP\n  },\n  \"distance\": \"string\", // Raio para consulta\n    //informações adicionais não obrigatórias\n  \"searchNearestCtoPort\": false, // Se true, busca a CTO/porta livre mais próxima do endereço (dispara chamadas adicionais ao sistema de mapas). Opcional, padrão: false\n  \"lead\": { // Informações do Lead na integradora\n    \"id\": \"string\",\n    \"name\": \"string\", // Nome do cliente\n    \"txIdType\": \"string\", // 1-CPF e 2-CNPJ\n    \"txId\": \"string\", // CPF/CNPJ\n    \"phone\": \"string\" // Telefone\n  },\n  \"seller\": { // Informações do vendedor na integradora\n    \"id\": \"string\", \n    \"name\": \"string\", // Nome do vendedor\n    \"txIdType\": \"string\", // 1-CPF e 2-CNPJ\n    \"txId\": \"string\", // CPF/CNPJ\n    \"phone\": \"string\" // Telefone\n  },\n  \"campaign\": { // Informações da campanha na integradora\n    \"id\": \"string\", // Id da campanha\n    \"description\": \"string\" // Descrição\n  }\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/verifyviability","description":"## Propósito\n\nRealiza, via integração com um sistema de documentação de redes (mapas), a consulta de viabilidade técnica para um determinado endereço.\n\nNesse modelo o ERP atua como ponte entre o sistema terceiro que está realizando a requisição e o sistema de documentação de rede integrado ao ERP Voalle, retornando se há viabilidade técnica e quantas portas estão disponíveis na região.\n\n## Pré-requisitos\n\nIntegração com sistema de mapas/documentação de rede configurada no ERP.\n\n## Regras de negócio\n\n- Opcionalmente, ao informar `searchNearestCtoPort: true`, o ERP também busca a CTO mais próxima do endereço que possua ao menos uma porta livre (respeitando a ordem de distância retornada pelo sistema de mapas, limitada a 5 tentativas). Quando encontrada, os campos `nearestCtoId`, `nearestCtoFirstFreePortId` e `nearestCtoFirstFreePortEquipmentId` são retornados preenchidos — este último identifica o equipamento/splitter pai da porta e é usado pela API \"Nova negociação\" para reservar a porta automaticamente, sem nova consulta ao sistema de mapas. Por disparar chamadas adicionais ao sistema de mapas, essa busca é opcional (padrão: `false`) e deve ser habilitada apenas por integrações que efetivamente consomem esses campos.\n- Quando nenhuma porta livre é encontrada dentro do limite de tentativas, os três campos acima retornam `null` e a resposta traz a mensagem \"Não foi possível encontrar porta livre para o endereço\" no campo `messages` do objeto de dados retornado — o processamento não é interrompido, os demais dados (`viability`/`ctos`/`ports`) continuam sendo retornados normalmente.\n- Na API \"Nova negociação\" existe o campo `integratorInformation.viabilityId`, preenchido com o `verifyViabilityId` retornado aqui, para vincular a negociação à consulta de viabilidade realizada.\n- Os registros de viabilidade são encontrados na rotina CRM Voalle / Operações / Dashboard - Gerente, menu Acompanhamento - Consulta de Viabilidade.\n- ⚠ A lógica de decisão sobre viabilidade, limite de tentativas e mensagens (acima) está implementada no próprio Gateway. Porém, os dados brutos de estruturas de rede e portas disponíveis (quantidade de CTOs, portas livres) vêm de uma chamada a um sistema externo de mapas/documentação de rede — não foi possível confirmar no repositório do GW o comportamento interno desse sistema externo (ex.: critério de ordenação por distância, precisão geográfica). Isso é uma integração de terceiro genuinamente fora do escopo deste repositório.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `fullAddress.address` | Sim | Endereço (logradouro). Entre 3 e 255 caracteres, sem caracteres especiais. |\n| `fullAddress.number` | Sim | Número. Máx. 45 caracteres, sem caracteres especiais. |\n| `fullAddress.neighborhood` | Sim | Bairro. Máx. 255 caracteres, sem caracteres especiais. |\n| `fullAddress.city` | Sim | Cidade. Entre 3 e 255 caracteres, sem caracteres especiais. |\n| `fullAddress.state` | Sim | UF. Exatamente 2 caracteres válidos. |\n| `fullAddress.postalCode` | Sim | CEP. Exatamente 9 caracteres (com máscara `00000-000`), formato válido. |\n| `distance` | Sim | Raio de busca, em metros. Numérico, entre 1 e 255 caracteres. |\n| `searchNearestCtoPort` | Não | Se `true`, busca a CTO/porta livre mais próxima (chamadas adicionais ao sistema de mapas). Padrão: `false`. |\n| `description` | Não | Máx. 255 caracteres, sem caracteres especiais. |\n| `lead.txIdType` / `seller.txIdType` | Condicional | 1 - CPF, 2 - CNPJ. Obrigatório se o bloco `lead`/`seller` for enviado. |\n| `lead.txId` / `seller.txId` | Não | Validado conforme `txIdType`. |\n| `lead.phone` | Não | Formato de telefone válido. |\n| `campaign.id` / `campaign.description` | Não | Id numérico e descrição da campanha na integradora. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a consulta foi realizada. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.viability` | boolean | Indica se existe viabilidade para o endereço informado dentro da distância enviada. |\n| `response.ctos` | integer | Número de CTOs na área. |\n| `response.ports` | integer | Número de portas disponíveis. |\n| `response.nearestCtoId` | string\\|null | Id da CTO mais próxima com porta livre. Só é preenchido quando `searchNearestCtoPort: true` é enviado na requisição e uma porta livre é encontrada; caso contrário, retorna `null`. |\n| `response.nearestCtoFirstFreePortId` | string\\|null | Id da primeira porta livre da CTO mais próxima (`nearestCtoId`). |\n| `response.nearestCtoFirstFreePortEquipmentId` | string\\|null | Id do equipamento/splitter pai da porta, usado por \"Nova negociação\" para reservar a porta automaticamente. |\n| `response.messages` | string\\|null | \"Não foi possível encontrar porta livre para o endereço\" quando `searchNearestCtoPort: true` não encontra nenhuma porta livre dentro do limite de tentativas; `null` caso contrário. |\n| `response.verifyViabilityId` | integer | Id do registro de auditoria da consulta, usado em \"Nova negociação\" (`integratorInformation.viabilityId`). |\n\n**Quando `success: false`** (envelope padrão, HTTP 200, erro de validação de campos):\n\nComportamento de `response` nesse cenário não confirmado nos exemplos salvos desta request — apenas um exemplo de sucesso e um exemplo de falha HTTP 500 (fora do envelope padrão, ver nota abaixo) estão salvos.\n\n⚠ **Desvio de padrão**: em caso de exceção não tratada (ex.: falha de comunicação com o sistema de mapas, erro ao gravar o registro de auditoria da consulta), a API retorna **HTTP 500** com um corpo simples, fora do envelope padrão: `{\"Type\": ..., \"Message\": \"...\", \"Code\": ...}` (sem `success`/`messages`/`response`). Trate qualquer resposta HTTP diferente de 200 como uma falha técnica inesperada.\n\n## Erros comuns\n\n| Situação | Mensagem | HTTP |\n| --- | --- | --- |\n| Campo obrigatório do endereço ausente | \"O campo '{campo}' é obrigatório\" | 200 (envelope padrão, `success: false`) |\n| CEP inválido | \"CEP é inválido.\" | 200 |\n| UF inválida | \"UF é inválida.\" | 200 |\n| `distance` não numérico | \"O campo 'distance' deve ser um número válido.\" | 200 |\n| `lead`/`seller` com `txIdType` inválido | \"Tipo de inscrição do Lead/Seller inválido ou não informado, valores válidos: (1 - CPF / 2 - CNPJ)\" | 200 |\n| CPF/CNPJ do lead/vendedor inválido | \"CPF do Lead é inválido.\" / \"CNPJ do Lead é inválido.\" (mesmo padrão para Seller) | 200 |\n| Campos com caracteres especiais | \"O campo '{campo}' possuí caracteres especiais.\" | 200 |\n| Falha inesperada (ex.: sistema de mapas indisponível) | Objeto simples `{Type, Message, Code}` — ver nota de desvio de padrão acima | **500** |\n\n## Fluxo relacionado\n\nO `verifyViabilityId` retornado é usado no campo `integratorInformation.viabilityId` da API \"Nova negociação\", e os campos `nearestCtoFirstFreePortEquipmentId`/`nearestCtoId` permitem reserva automática de porta nessa mesma API."},"status":"Internal Server Error","code":500,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"Type\": 2, // Enum TypeReturnMessage.Error\n    \"Message\": \"Não foi possível concluir a consulta de viabilidade.\", // mensagem da exceção interna\n    \"Code\": 999\n}"}],"_postman_id":"cddd65da-a6bc-449f-94b1-37d345ef0218"},{"name":"Cancela Negociação","id":"63bbd6a1-648c-4947-8f1f-2759e2e57fc8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{ \n    \"protocolId\": 0, \n    \"description\": \"string\"\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/crm/cancelsale","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cancela uma negociação/venda em andamento no CRM Voalle, iniciada previamente pela API \"Nova negociação\".</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>A negociação a ser cancelada deve ter sido criada através de uma API de terceiros (fluxo de venda com etapas — <code>crmSellingSteps</code>/protocolo de venda).</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p>O cancelamento só é permitido quando <strong>todas</strong> as condições abaixo forem verdadeiras:</p>\n<ul>\n<li>A negociação (identificada pelo <code>protocolId</code>) deve ter sido aberta pelo mesmo usuário/integração que está solicitando o cancelamento (validado pelo token de autenticação).</li>\n<li>A negociação não pode já estar apropriada por outro usuário (responsável definido).</li>\n<li>A negociação não pode já estar concluída/finalizada no ERP.</li>\n</ul>\n<p>Se qualquer uma dessas condições não for atendida, o cancelamento é recusado com a respectiva mensagem de erro.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>protocolId</code></td>\n<td>Sim</td>\n<td>Id do protocolo/negociação a ser cancelada, retornado por \"Nova negociação\".</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>Sim</td>\n<td>Descrição/motivo do cancelamento.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o cancelamento foi realizado.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Mensagem de confirmação do cancelamento.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>description</code> não informado</td>\n<td>\"Descrição do cancelamento inválida\"</td>\n</tr>\n<tr>\n<td>Negociação aberta por outro usuário</td>\n<td>\"Não é possível cancelar vendas criadas por outros usuários\"</td>\n</tr>\n<tr>\n<td>Negociação já apropriada por outro usuário</td>\n<td>\"Não é possível cancelar vendas já apropriadas por outros usuários\"</td>\n</tr>\n<tr>\n<td>Negociação já finalizada</td>\n<td>\"Não é possível cancelar vendas já finalizadas\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todos os cenários acima (sucesso e erro) retornam HTTP 200 — o campo <code>success</code> indica o resultado real da operação.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Método complementar à API \"Nova negociação\" (<code>crm/startsale</code>), que retorna o <code>protocolId</code> usado aqui.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","crm","cancelsale"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"e2834091-26aa-4143-a960-5fa9d04b54c5","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{ \n    \"protocolId\": 0, \n    \"description\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/crm/cancelsale"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": \"Venda Cancelada com sucesso!\",\n    \"dataResponseType\": \"String\",\n    \"elapsedTime\": null\n}"},{"id":"dd824963-fd1f-4613-af93-e8b27f2eb198","name":"Erro — negociação já apropriada por outro usuário","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{ \n    \"protocolId\": 0, \n    \"description\": \"string\"\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/crm/cancelsale","description":"## Propósito\n\nCancela uma negociação/venda em andamento no CRM Voalle, iniciada previamente pela API \"Nova negociação\".\n\n## Pré-requisitos\n\nA negociação a ser cancelada deve ter sido criada através de uma API de terceiros (fluxo de venda com etapas — `crmSellingSteps`/protocolo de venda).\n\n## Regras de negócio\n\nO cancelamento só é permitido quando **todas** as condições abaixo forem verdadeiras:\n\n- A negociação (identificada pelo `protocolId`) deve ter sido aberta pelo mesmo usuário/integração que está solicitando o cancelamento (validado pelo token de autenticação).\n- A negociação não pode já estar apropriada por outro usuário (responsável definido).\n- A negociação não pode já estar concluída/finalizada no ERP.\n\nSe qualquer uma dessas condições não for atendida, o cancelamento é recusado com a respectiva mensagem de erro.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `protocolId` | Sim | Id do protocolo/negociação a ser cancelada, retornado por \"Nova negociação\". |\n| `description` | Sim | Descrição/motivo do cancelamento. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o cancelamento foi realizado. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | string\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | string | Mensagem de confirmação do cancelamento. |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Mensagem |\n| --- | --- |\n| `description` não informado | \"Descrição do cancelamento inválida\" |\n| Negociação aberta por outro usuário | \"Não é possível cancelar vendas criadas por outros usuários\" |\n| Negociação já apropriada por outro usuário | \"Não é possível cancelar vendas já apropriadas por outros usuários\" |\n| Negociação já finalizada | \"Não é possível cancelar vendas já finalizadas\" |\n\nTodos os cenários acima (sucesso e erro) retornam HTTP 200 — o campo `success` indica o resultado real da operação.\n\n## Fluxo relacionado\n\nMétodo complementar à API \"Nova negociação\" (`crm/startsale`), que retorna o `protocolId` usado aqui."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não é possível cancelar vendas já apropriadas por outros usuários\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"63bbd6a1-648c-4947-8f1f-2759e2e57fc8"},{"name":"Consulta Tipo de Contratos e Serviços","id":"c62e26a2-19b2-4ba7-95a3-f30dcd94f999","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/crm/contracttypesandservices","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os tipos de contratos habilitados para integração e os respectivos serviços vinculados, para uso na composição da requisição de \"Nova negociação\" ou \"Incluir serviço no contrato\".</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Para que um tipo de contrato seja retornado por este método:</p>\n<ul>\n<li>Em Service Desk / Cadastros / Contratos - Tipos, selecionar o tipo de contrato desejado (ou cadastrar um novo).</li>\n<li>No menu \"Parâmetros\" desse tipo de contrato, habilitar a opção \"Integração\" — isso disponibiliza o tipo de contrato e seus serviços vinculados para vendas realizadas fora do ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p>Para que um serviço apareça vinculado a um tipo de contrato neste método, é necessário que:</p>\n<ul>\n<li>O serviço esteja vinculado ao tipo de contrato informado.</li>\n<li>O serviço não seja de telefonia fixa, telefonia móvel ou recarga.</li>\n<li>Sendo um combo, os filhos do combo também não sejam de telefonia fixa, telefonia móvel ou recarga.</li>\n<li>Entre os serviços do combo, haja pelo menos um serviço mensal.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<p>Não aplicável — este método não recebe parâmetros de entrada (GET sem corpo).</p>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi concluída sem falha interna.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code>.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].code</code></td>\n<td>string</td>\n<td>Código do tipo de contrato.</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome do tipo de contrato.</td>\n</tr>\n<tr>\n<td><code>response[].description</code></td>\n<td>string</td>\n<td>Descrição do tipo de contrato.</td>\n</tr>\n<tr>\n<td><code>response[].collectionDays</code></td>\n<td>array</td>\n<td>Dias de vencimento disponíveis para esse tipo de contrato.</td>\n</tr>\n<tr>\n<td><code>response[].contractTypesServiceProduct[]</code></td>\n<td>array</td>\n<td>Serviços vinculados ao tipo de contrato (<code>code</code>, <code>title</code>, <code>description</code>), elegíveis conforme as regras de negócio acima.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Se nenhum tipo de contrato estiver parametrizado para integração, <code>response</code> retorna lista vazia (<code>[]</code>) — isso não é um erro.</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> nesse cenário.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Esse cenário é uma falha técnica acidental, não uma regra de negócio: se o campo de configuração adicional (<code>AdditionalConfig</code>) de algum tipo de contrato contiver um JSON malformado, a exceção não tratada é capturada e devolvida como <code>success: false</code>, com <code>messages: [{ type: \"Error\", code: 1000, message: &lt;mensagem bruta da exceção .NET, sem texto fixo&gt; }]</code> — sempre com HTTP 200.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem / retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>AdditionalConfig</code> de algum tipo de contrato com JSON malformado</td>\n<td>Falha técnica genérica: <code>messages: [{ type: \"Error\", code: 1000, message: &lt;mensagem da exceção .NET, variável&gt; }]</code> — ver nota acima.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Este método não possui cenários de erro de <strong>negócio</strong> — ele apenas lista os dados já configurados no ERP; a única falha possível é a técnica/acidental descrita acima.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Os códigos <code>code</code> de tipo de contrato e de serviço retornados aqui alimentam os campos <code>contractType</code> e <code>serviceProducts[].code</code> da API \"Nova negociação\", e <code>newServices[].code</code> das APIs \"Incluir serviço no contrato\" e \"Alterar serviço no contrato\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","crm","contracttypesandservices"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"d137ed4f-0132-4992-918f-eb5b0fa9a1f7","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/crm/contracttypesandservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","name":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"code\": \"1\",\n            \"title\": \"PF - Composto\",\n            \"description\": \"\",\n            \"collectionDays\": [\n                5,\n                10,\n                15\n            ],\n            \"contractTypesServiceProduct\": [\n                {\n                    \"code\": \"1.1\",\n                    \"title\": \"Serviço de Configuração de Roteador \",\n                    \"description\": null\n                },\n                {\n                    \"code\": \"1.2\",\n                    \"title\": \"Serviço de Instalação\",\n                    \"description\": \"\"\n                },\n                {\n                    \"code\": \"1.3\",\n                    \"title\": \"Fibra 300 Mb\",\n                    \"description\": null\n                },\n                {\n                    \"code\": \"1.4\",\n                    \"title\": \"Teste\",\n                    \"description\": \"\"\n                },\n                {\n                    \"code\": \"1.5\",\n                    \"title\": \"Teste remoção combo \",\n                    \"description\": null\n                }\n            ]\n        },\n        {\n            \"code\": \"2\",\n            \"title\": \"PF - Composto - Carnê\",\n            \"description\": \"\",\n            \"collectionDays\": [\n                13,\n                18,\n                5\n            ],\n            \"contractTypesServiceProduct\": [\n                {\n                    \"code\": \"2.1\",\n                    \"title\": \"Assistência\",\n                    \"description\": \"\"\n                }\n            ]\n        }\n    ],\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"c62e26a2-19b2-4ba7-95a3-f30dcd94f999"},{"name":"Consulta Campanhas e Serviços","id":"8e7438b2-0418-4331-ad28-f90a5b8b5557","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":""},"url":"{{URL}}:45715/external/integrations/thirdparty/crm/campaignsandpricelistservices","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca as campanhas de negociação disponíveis para integração e os serviços da(s) lista(s) de preço atrelada(s) a cada campanha, para uso na composição da requisição de \"Nova negociação\" ou \"Incluir serviço no contrato\".</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Apenas campanhas marcadas com uso <strong>E-COMMERCE - integração</strong> são retornadas por este método.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Somente campanhas ativas, não excluídas, com uso \"Integração E-commerce\" e com ao menos uma lista de preço ativa vinculada são retornadas.</li>\n<li>Cada campanha retorna as regiões de atuação (<code>campaignRegions</code>) e as listas de preço vinculadas (<code>campaignPriceList</code>), cada uma com seus respectivos serviços (<code>campaignPriceListProductServices</code>).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<p>Não aplicável — este método não recebe parâmetros de entrada (GET sem corpo).</p>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Sempre <code>true</code> em caso de retorno normal — este método não possui cenários de erro de negócio (ver \"Erros comuns\").</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code>; sempre <code>null</code> neste método (não utilizado).</td>\n</tr>\n<tr>\n<td><code>response[].code</code></td>\n<td>string</td>\n<td>Código da campanha, usado em <code>crmCampaignCode</code>.</td>\n</tr>\n<tr>\n<td><code>response[].title</code> / <code>response[].description</code> / <code>response[].objective</code></td>\n<td>string</td>\n<td>Identificação da campanha.</td>\n</tr>\n<tr>\n<td><code>response[].status</code></td>\n<td>string</td>\n<td>Situação da campanha (ex.: \"Em Execução\").</td>\n</tr>\n<tr>\n<td><code>response[].beginningDate</code> / <code>response[].finalDate</code></td>\n<td>string (data)</td>\n<td>Vigência da campanha.</td>\n</tr>\n<tr>\n<td><code>response[].campaignRegions[]</code></td>\n<td>array</td>\n<td>Regiões atendidas pela campanha.</td>\n</tr>\n<tr>\n<td><code>response[].campaignPriceList[].code</code></td>\n<td>string</td>\n<td>Código da lista de preço, usado em <code>crmPriceListCode</code>.</td>\n</tr>\n<tr>\n<td><code>response[].campaignPriceList[].campaignPriceListProductServices[]</code></td>\n<td>array</td>\n<td>Serviços da lista de preço (ver tabelas de valores abaixo).</td>\n</tr>\n</tbody>\n</table>\n</div><p>Este método não possui cenário de <code>success: false</code> documentado — ver \"Erros comuns\".</p>\n<p><strong>Valores de <code>campaignPriceListProductServices.type</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Tipo de serviço</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Prestação de serviço</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Comunicação</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Telefonia Fixa</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Combo</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Telefonia móvel</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Valores de <code>campaignPriceListProductServices.use</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Uso do serviço</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>A</td>\n<td>Avulso</td>\n</tr>\n<tr>\n<td>R</td>\n<td>Recorrente</td>\n</tr>\n<tr>\n<td>P</td>\n<td>Produto</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Valores de <code>campaignPriceListProductServices.priceListUseType</code></strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Uso do serviço</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>V</td>\n<td>Venda para um novo contrato ou para contrato existente</td>\n</tr>\n<tr>\n<td>T</td>\n<td>Troca de serviço</td>\n</tr>\n<tr>\n<td>A</td>\n<td>Venda e troca de serviço</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Não há cenários de erro de negócio para este método — ele apenas lista os dados já configurados no ERP (se nenhuma campanha estiver marcada para uso E-commerce, a lista retorna vazia).</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Os códigos <code>code</code> de campanha e de lista de preço retornados aqui alimentam os campos <code>crmCampaignCode</code>/<code>crmPriceListCode</code> das APIs \"Nova negociação\", \"Incluir serviço no contrato\" e \"Alterar serviço no contrato\". O campo <code>priceListUseType</code> indica se o serviço é elegível para venda (<code>V</code>), troca (<code>T</code>) ou ambos (<code>A</code>).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","crm","campaignsandpricelistservices"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"eedfd0a2-0cc6-4603-bf3b-3dd26050053e","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/crm/campaignsandpricelistservices"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"code\": \"2\",\n            \"title\": \"Campanha Teste API\",\n            \"description\": \"Campanha para testes de venda via API\",\n            \"objective\": \"Testes\",\n            \"status\": \"Em Execução\",\n            \"beginningDate\": \"2022-08-24T00:00:00\",\n            \"finalDate\": \"2025-08-27T00:00:00\",\n            \"campaignRegions\": [\n                {\n                    \"id\": 1,\n                    \"code\": \"1.01\",\n                    \"title\": \"Região Central\",\n                    \"description\": \"Região Central do Estado do RS\",\n                    \"campaignRegionCities\": [\n                        {\n                            \"code\": 4316907,\n                            \"name\": \"Santa Maria\",\n                            \"state\": \"RS\"\n                        }\n                    ]\n                }\n            ],\n            \"campaignPriceList\": [\n                {\n                    \"id\": 1,\n                    \"code\": \"321\",\n                    \"title\": \"L.P. PADRAO \",\n                    \"description\": \"Lista de preço padrão\",\n                    \"campaignPriceListProductServices\": [\n                        {\n                            \"code\": \"00018\",\n                            \"title\": \"Serviço 1\",\n                            \"description\": \"\",\n                            \"sellingPrice\": 5.00,\n                            \"type\": 1, // Prestação de serviço\n                            \"use\": \"A\", // Avulso\n                            \"priceListUseType\": \"V\", // Venda para novo contrato ou contrato existente\n                            \"MinimumPromotionalPrice\": \"\",\n                            \"LoyaltyPrice\": \"\",\n                            \"MonthDurationLoyalty\": 0,\n                            \"IsLoyalty\": 0,\n                            \"PaymentFormCode\": \"\",\n                            \"PaymentFormTitle\": \"\"\n                        },\n                        {\n                            \"code\": \"00014\",\n                            \"title\": \"Serviço 2\",\n                            \"description\": \"\",\n                            \"sellingPrice\": 10.0,\n                            \"type\": 2, // Comunicação\n                            \"use\": \"R\", // Recorrente\n                            \"priceListUseType\": \"T\" // Troca de serviço\n                        },\n                        {\n                            \"code\": \"00028\",\n                            \"title\": \"Serviço 3\",\n                            \"description\": \"\",\n                            \"sellingPrice\": 29.9,\n                            \"type\": 3, // Telefonia Fixa\n                            \"use\": \"P\", // Produto\n                            \"priceListUseType\": \"A\" // Venda e troca de serviço\n                        },\n                        {\n                            \"code\": \"0045\",\n                            \"title\": \"Combo 4\",\n                            \"description\": null,\n                            \"sellingPrice\": 0.02,\n                            \"type\": 4, // Combo\n                            \"use\": \"A\",\n                            \"priceListUseType\": \"A\"\n                        },\n                        {\n                            \"code\": \"00043\",\n                            \"title\": \"Serviço 5\",\n                            \"description\": \"\",\n                            \"sellingPrice\": 0.01,\n                            \"type\": 5, // Telefonia móvel\n                            \"use\": \"P\",\n                            \"priceListUseType\": \"T\"\n                        }\n                    ]\n                }\n            ]\n        }\n    ],\n    \"dataResponseType\": \"List<CampaignDTO>\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"8e7438b2-0418-4331-ad28-f90a5b8b5557"}],"id":"6e42f1f4-48db-431f-857c-8530fbe9950c","description":"<p>API's que possibilitam a criação de Lead e a geração de uma negociação no CRM Voalle.</p>\n<p>Para que a negociação seja aberta corretamente deve-se atentar para as seguintes regras:</p>\n<ul>\n<li>Após inseridas as informações no corpo da requisição, é criado um protocolo de Venda direcionado para a equipe padrão registrada para vendas assistidas, com prazo de atendimento \"dia da venda +1\".</li>\n<li>É possível apenas vincular serviços ao contrato, sendo estes apenas serviços mensais e de ativação para a venda.</li>\n<li>Caso o cliente não tenha cadastro, será usado as informações enviadas na requisição para criar um cadastro e um endereço para esta pessoa;</li>\n<li>Caso cliente já possua cadastro, estas informações serão usadas para atualizar o cadastro e o endereço já existentes da pessoa, preenchendo todos os campos necessários.</li>\n<li>Há diferentes campos obrigatórios para CPF e CNPJ. A validação da obrigatoriedade dos campos é parametrizada conforme a dashboard parâmetros da venda disponível na rotina \"CRM / Operações / Dashboard - Parâmetros da Venda\" menu \"Passos da Venda\".</li>\n<li>Esta API não suporta formulário dinâmico.</li>\n</ul>\n","_postman_id":"6e42f1f4-48db-431f-857c-8530fbe9950c","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Service Desk","item":[{"name":"Consultas","item":[{"name":"Busca detalhes da solicitação","id":"afaeb435-6af5-4f9d-a024-b157e342c943","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/getsolicitationdata?assignmentId={{assignmentId}}&protocol={{protocol}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna as informações gerais de uma solicitação (protocolo) específica do Service Desk: dados de abertura, tipo, status, solicitante, cliente, etiqueta de contrato, catálogo/item/subitem de serviço, equipe, responsável, local, categorização (matriz de categorias) e os stakeholders vinculados à tarefa.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Informar <code>assignmentId</code> (ID interno da tarefa/solicitação) ou <code>protocol</code> (número do protocolo). Pelo menos um dos dois é obrigatório.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Se nenhum dos dois parâmetros for informado, a chamada falha.</li>\n<li>Se ambos forem informados, a busca é feita pelo <code>assignmentId</code> (tem prioridade sobre <code>protocol</code>).</li>\n<li>Se apenas <code>protocol</code> for informado e não existir uma solicitação com esse número, a chamada retorna erro \"Solicitação não encontrada.\".</li>\n<li>Se <code>assignmentId</code> for informado (diretamente ou resolvido a partir do protocolo) e não existir uma solicitação com esse ID, a chamada retorna <strong>sucesso</strong> (<code>success: true</code>) com <code>response: null</code> — isso não é tratado como erro.</li>\n<li>Os campos <code>catalogServiceId</code>, <code>catalogServiceItemId</code>, <code>catalogServiceItemClassId</code>, <code>contractServiceTagId</code>, <code>sectorAreaId</code>, <code>requestorId</code> e seus respectivos objetos vêm nulos quando a solicitação não tiver o respectivo vínculo preenchido.</li>\n<li><code>categories</code> só é retornado quando a solicitação tem uma matriz de categorização configurada; cada nível (1 a 5) só entra na lista quando tiver um <code>id</code> preenchido.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>assignmentId</td>\n<td>query, long</td>\n<td>Condicional</td>\n<td>ID da tarefa/solicitação. Obrigatório se <code>protocol</code> não for informado. Tem prioridade sobre <code>protocol</code> quando ambos são enviados.</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>query, long</td>\n<td>Condicional</td>\n<td>Número do protocolo da solicitação. Obrigatório se <code>assignmentId</code> não for informado.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.protocol</code> / <code>response.assignmentId</code></td>\n<td>number</td>\n<td>Número do protocolo e ID interno da tarefa</td>\n</tr>\n<tr>\n<td><code>response.priority</code> / <code>response.priorityDescription</code></td>\n<td>number/string</td>\n<td>Prioridade: 0-Normal, 1-Média, 2-Alta, 3-Urgente</td>\n</tr>\n<tr>\n<td><code>response.progress</code></td>\n<td>number</td>\n<td>Percentual de andamento (0 a 100)</td>\n</tr>\n<tr>\n<td><code>response.categories</code></td>\n<td>array|null</td>\n<td>Até 5 níveis da matriz de categorização, cada um com <code>position</code>, <code>id</code>, <code>code</code>, <code>name</code></td>\n</tr>\n<tr>\n<td><code>response.stakeholders</code></td>\n<td>array</td>\n<td>Pessoas vinculadas à tarefa: <code>personId</code>, <code>name</code>, <code>login</code>, <code>email</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Observação: <code>response</code> também pode vir <code>null</code> com <code>success: true</code>, quando o <code>assignmentId</code> informado (direto ou resolvido a partir do protocolo) não existe — ver \"Regras de negócio\".</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nem <code>assignmentId</code> nem <code>protocol</code> informados</td>\n<td><code>success: false</code>, mensagem \"Valores não repassados ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>protocol</code> informado e não encontrado</td>\n<td><code>success: false</code>, mensagem \"Solicitação não encontrada.\"</td>\n</tr>\n<tr>\n<td><code>assignmentId</code> informado (direto ou resolvido) e não encontrado</td>\n<td><code>success: true</code>, <code>response: null</code> (não é um erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Busca Relatos por Solicitação\" para o histórico de eventos da solicitação.</li>\n<li>Use \"Lista Solicitações por Cliente\" para localizar o <code>assignmentId</code>/protocolo de um cliente.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","getsolicitationdata"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>ID do protocolo</p>\n","type":"text/plain"},"key":"assignmentId","value":"{{assignmentId}}"},{"description":{"content":"<p>Número do protocolo</p>\n","type":"text/plain"},"key":"protocol","value":"{{protocol}}"}],"variable":[]}},"response":[{"id":"6eb0f120-3a12-46f7-93e0-b243c03ce0cc","name":"Sucesso — busca por protocolo","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":{"raw":"httpd://erp.cliente.com.br:45715/external/integrations/thirdparty/projects/getsolicitationdata?protocol=123","protocol":"httpd","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","projects","getsolicitationdata"],"query":[{"key":"assignmentId","value":"","description":"ID do protocolo","disabled":true},{"key":"protocol","value":"123","description":"Número do protocolo"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 484,\n        \"assignmentId\": 493,\n        \"title\": \"Sem sinal de internet\",\n        \"description\": \"Cliente relata perda total de sinal desde a manhã.\",\n        \"internalObservation\": null,\n        \"priority\": 2, //Prioridade: 0-Normal / 1-Média / 2-Alta / 3-Urgente\n        \"priorityDescription\": \"Alta\",\n        \"progress\": 50, //Percentual de andamento da tarefa (0 a 100)\n        \"created\": \"2022-08-01T17:20:00\",\n        \"conclusionDate\": null,\n        \"reportClosingDate\": null,\n        \"responsibleFinalDate\": \"2022-08-02T17:22:17.650367\",\n        \"incidentTypeId\": 21,\n        \"incidentType\": {\n            \"id\": 21,\n            \"title\": \"Atendimento\",\n            \"code\": \"1.02\"\n        },\n        \"incidentStatusId\": 1,\n        \"incidentStatus\": {\n            \"id\": 1,\n            \"title\": \"Abertura\",\n            \"code\": \"1\",\n            \"synsuiteCode\": null\n        },\n        \"requestorId\": 116,\n        \"requestor\": {\n            \"id\": 116,\n            \"name\": \"Teste\",\n            \"name2\": \"Teste\"\n        },\n        \"clientId\": 116,\n        \"client\": {\n            \"id\": 116,\n            \"name\": \"Teste\",\n            \"name2\": \"Teste\"\n        },\n        \"beginningDate\": \"2022-08-01T17:22:17.650367\",\n        \"finalDate\": \"2022-08-01T17:37:17.65037\",\n        \"criticity\": 8,\n        \"contractServiceTagId\": 273,\n        \"contractServiceTag\": {\n            \"id\": 273,\n            \"title\": \"Serviço de Internet - SCM - 10Mega\",\n            \"serviceTag\": \"ABCDE123\"\n        },\n        \"contractId\": 1000,\n        \"contract\": {\n            \"id\": 1000,\n            \"description\": \"Contrato Residencial\"\n        },\n        \"catalogServiceId\": null,\n        \"catalogService\": null,\n        \"catalogServiceItemId\": null,\n        \"catalogServiceItem\": null,\n        \"catalogServiceItemClassId\": null,\n        \"catalogServiceItemClass\": null,\n        \"sectorAreaId\": 2,\n        \"sectorArea\": {\n            \"id\": 2,\n            \"title\": \"Técnica\"\n        },\n        \"teamId\": 3,\n        \"team\": {\n            \"id\": 3,\n            \"title\": \"Suporte\"\n        },\n        \"responsibleId\": 101,\n        \"responsible\": {\n            \"id\": 101,\n            \"name\": \"Suporte à Clientes\",\n            \"name2\": \"Teste\"\n        },\n        \"companyPlaceId\": 1,\n        \"companyPlace\": {\n            \"id\": 1,\n            \"description\": \"EMPRESA\"\n        },\n        \"categories\": [ //Matriz de categorização; só entram os níveis com id preenchido\n            {\n                \"position\": 1,\n                \"id\": 2,\n                \"code\": \"001.1\",\n                \"name\": \"Equipamento\"\n            }\n        ],\n        \"stakeholders\": [ //Pessoas vinculadas à tarefa\n            {\n                \"personId\": 116,\n                \"name\": \"Teste\",\n                \"login\": \"teste.login\",\n                \"email\": \"teste@teste.com.br\"\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"},{"id":"491fed1d-5ed3-4698-8669-b2cf8af9f38f","name":"Sucesso — busca por assignmentId","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/projects/getsolicitationdata?assignmentId=321","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","projects","getsolicitationdata"],"query":[{"key":"assignmentId","value":"321","description":"ID do protocolo"},{"key":"protocol","value":"","description":"Número do protocolo","disabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 484,\n        \"assignmentId\": 493,\n        \"title\": \"Sem sinal de internet\",\n        \"description\": \"Cliente relata perda total de sinal desde a manhã.\",\n        \"internalObservation\": null,\n        \"priority\": 2, //Prioridade: 0-Normal / 1-Média / 2-Alta / 3-Urgente\n        \"priorityDescription\": \"Alta\",\n        \"progress\": 50, //Percentual de andamento da tarefa (0 a 100)\n        \"created\": \"2022-08-01T17:20:00\",\n        \"conclusionDate\": null,\n        \"reportClosingDate\": null,\n        \"responsibleFinalDate\": \"2022-08-02T17:22:17.650367\",\n        \"incidentTypeId\": 21,\n        \"incidentType\": {\n            \"id\": 21,\n            \"title\": \"Atendimento\",\n            \"code\": \"1.02\"\n        },\n        \"incidentStatusId\": 1,\n        \"incidentStatus\": {\n            \"id\": 1,\n            \"title\": \"Abertura\",\n            \"code\": \"1\",\n            \"synsuiteCode\": null\n        },\n        \"requestorId\": 116,\n        \"requestor\": {\n            \"id\": 116,\n            \"name\": \"Teste\",\n            \"name2\": \"Teste\"\n        },\n        \"clientId\": 116,\n        \"client\": {\n            \"id\": 116,\n            \"name\": \"Teste\",\n            \"name2\": \"Teste\"\n        },\n        \"beginningDate\": \"2022-08-01T17:22:17.650367\",\n        \"finalDate\": \"2022-08-01T17:37:17.65037\",\n        \"criticity\": 8,\n        \"contractServiceTagId\": 273,\n        \"contractServiceTag\": {\n            \"id\": 273,\n            \"title\": \"Serviço de Internet - SCM - 10Mega\",\n            \"serviceTag\": \"ABCDE123\"\n        },\n        \"contractId\": 1000,\n        \"contract\": {\n            \"id\": 1000,\n            \"description\": \"Contrato Residencial\"\n        },\n        \"catalogServiceId\": null,\n        \"catalogService\": null,\n        \"catalogServiceItemId\": null,\n        \"catalogServiceItem\": null,\n        \"catalogServiceItemClassId\": null,\n        \"catalogServiceItemClass\": null,\n        \"sectorAreaId\": 2,\n        \"sectorArea\": {\n            \"id\": 2,\n            \"title\": \"Técnica\"\n        },\n        \"teamId\": 3,\n        \"team\": {\n            \"id\": 3,\n            \"title\": \"Suporte\"\n        },\n        \"responsibleId\": 101,\n        \"responsible\": {\n            \"id\": 101,\n            \"name\": \"Suporte à Clientes\",\n            \"name2\": \"Teste\"\n        },\n        \"companyPlaceId\": 1,\n        \"companyPlace\": {\n            \"id\": 1,\n            \"description\": \"EMPRESA\"\n        },\n        \"categories\": [ //Matriz de categorização; só entram os níveis com id preenchido\n            {\n                \"position\": 1,\n                \"id\": 2,\n                \"code\": \"001.1\",\n                \"name\": \"Equipamento\"\n            }\n        ],\n        \"stakeholders\": [ //Pessoas vinculadas à tarefa\n            {\n                \"personId\": 116,\n                \"name\": \"Teste\",\n                \"login\": \"teste.login\",\n                \"email\": \"teste@teste.com.br\"\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"afaeb435-6af5-4f9d-a024-b157e342c943"},{"name":"Busca Relatos por Solicitação","id":"1c08635e-632c-4a78-8647-6d872b2037b8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/getsolicitationhistory?assignmentId={{idDaSolicitacao}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna o histórico de eventos (relatos, apontamentos do cliente, encaminhamentos e observações internas) de uma solicitação, do mais recente para o mais antigo.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>assignmentId</code> da solicitação (obtido em \"Busca detalhes da solicitação\" ou \"Lista Solicitações por Cliente\").</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Sem o parâmetro <code>typeOperations</code>, retorna apenas relatos e apontamentos do cliente, sem promover encaminhamentos (comportamento histórico/nativo).</li>\n<li><code>typeOperations</code> filtra os tipos de evento a retornar, informados por vírgula: <code>1</code> Relato, <code>2</code> Apontamento do cliente, <code>3</code> Encaminhamento, <code>5</code> Observação interna (<code>4</code> Apropriação existe no domínio mas não é aceito como filtro aqui).</li>\n<li>Ao incluir <code>3</code> (Encaminhamento) em <code>typeOperations</code>, os relatos que foram gravados junto de um encaminhamento passam a sair com <code>typeOperation: 3</code> (em vez de <code>1</code>), acompanhados da origem e do destino do roteamento (<code>destinationTeam</code>/<code>destinationPerson</code>). Essa promoção acontece antes do filtro, então o <code>3</code> também encontra relatos que originalmente seriam <code>1</code>.</li>\n<li>Ao incluir <code>2</code> (Apontamento do cliente), apontamentos excluídos não são devolvidos.</li>\n<li>Se <code>typeOperations</code> for informado mas nenhum valor válido restar após o parse (ex: valores não numéricos ou fora da lista aceita), a chamada falha.</li>\n<li>Valores inválidos misturados com válidos são ignorados silenciosamente (ex.: <code>1,abc,99</code> é tratado como <code>1</code>).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>assignmentId</td>\n<td>query, long</td>\n<td>Sim</td>\n<td>ID da solicitação</td>\n</tr>\n<tr>\n<td>typeOperations</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Tipos de evento a retornar, separados por vírgula: <code>1</code> Relato, <code>2</code> Apontamento do cliente, <code>3</code> Encaminhamento, <code>5</code> Observação interna. Sem filtro, retorna relatos e apontamentos do histórico nativo.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].typeOperation</code></td>\n<td>–</td>\n<td>Tipo do evento: <code>1</code> Relato, <code>2</code> Apontamento do cliente, <code>3</code> Encaminhamento, <code>4</code> Apropriação, <code>5</code> Observação interna</td>\n</tr>\n<tr>\n<td><code>response[].person</code> / <code>response[].team</code></td>\n<td>–</td>\n<td>Responsável pelo evento</td>\n</tr>\n<tr>\n<td><code>response[].destinationTeam</code> / <code>response[].destinationPerson</code></td>\n<td>–</td>\n<td>Preenchidos apenas em encaminhamentos promovidos (<code>typeOperations</code> contendo <code>3</code>)</td>\n</tr>\n<tr>\n<td><code>response[].private</code></td>\n<td>–</td>\n<td>Indica se o relato é privado</td>\n</tr>\n<tr>\n<td><code>response[].beginningGeopositionLatitude/Longitude</code>, <code>response[].finalGeopositionLatitude/Longitude</code></td>\n<td>–</td>\n<td>Posição geográfica do evento, quando disponível</td>\n</tr>\n</tbody>\n</table>\n</div><p>Observação: <code>response</code> também pode vir como lista vazia (<code>[]</code>) com <code>success: true</code>, quando o <code>assignmentId</code> informado não existe — ver \"Regras de negócio\" e \"Erros comuns\".</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>typeOperations</code> informado sem nenhum valor válido</td>\n<td><code>success: false</code>, mensagem \"Nenhum tipo de evento válido informado em typeOperations.\"</td>\n</tr>\n<tr>\n<td><code>assignmentId</code> inexistente</td>\n<td><code>success: true</code>, <code>response: []</code> (lista vazia, não é erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Busca detalhes da solicitação\" para obter o <code>assignmentId</code> a partir do protocolo.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getsolicitationhistory"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>ID da solicitação</p>\n","type":"text/plain"},"key":"assignmentId","value":"{{idDaSolicitacao}}"},{"disabled":true,"description":{"content":"<p>Tipos de evento a retornar, separados por vírgula: 1 Relato, 2 Apontamento do cliente, 3 Encaminhamento, 5 Observação interna (opcional)</p>\n","type":"text/plain"},"key":"typeOperations","value":"1,2,3,5"}],"variable":[]}},"response":[{"id":"b7c2283c-87a3-4d6b-9eff-e96375d497d7","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getsolicitationhistory?assignmentId=XXXXXXXX","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","getsolicitationhistory"],"query":[{"key":"assignmentId","value":"XXXXXXXX"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"typeOperation\": 1, //1-Relato / 2-Apontamento do cliente / 3-Encaminhamento / 4-Apropriação / 5-Observação interna\n            \"id\": 123456,\n            \"title\": \"Atendimento de Solicitação - Primeiro Relato\",\n            \"description\": \"\\r\\nContato: XXX  \\r\\nFone 1: XXXXXXXXXX\\r\\nAssinante: XXXXXXXXXXXXX \\r\\nAtendente: XXXXXXX\\r\\n\\r\\n- Situação normalizada durante o atendimento. \\r\\n\\r\\nATENDIMENTO ENCERRADO.\",\n            \"beginningDate\": \"2017-12-13T07:53:51\",\n            \"finalDate\": \"2017-12-13T07:56:20\",\n            \"private\": false,\n            \"personId\": 123,\n            \"person\": {\n                \"id\": 123,\n                \"name\": \"XXXXXX\"\n            },\n            \"teamId\": 321,\n            \"team\": {\n                \"id\": 321,\n                \"name\": \"XXXXX\"\n            },\n            \"destinationTeamId\": null, //Só preenchido para relatos promovidos a encaminhamento (typeOperations contendo 3)\n            \"destinationTeam\": null,\n            \"destinationPersonId\": null,\n            \"destinationPerson\": null,\n            \"progress\": 50,\n            \"beginningGeopositionLatitude\": null,\n            \"beginningGeopositionLongitude\": null,\n            \"finalGeopositionLatitude\": null,\n            \"finalGeopositionLongitude\": null\n        },\n        {\n            \"typeOperation\": 3, //Encaminhamento (só aparece quando typeOperations contém \"3\")\n            \"id\": 123457,\n            \"title\": \"Encaminhado para outra equipe\",\n            \"description\": \"Encaminhado para verificação técnica.\",\n            \"beginningDate\": \"2017-12-13T08:00:00\",\n            \"finalDate\": \"2017-12-13T08:00:00\",\n            \"private\": false,\n            \"personId\": 123,\n            \"person\": {\n                \"id\": 123,\n                \"name\": \"XXXXXX\"\n            },\n            \"teamId\": 321,\n            \"team\": {\n                \"id\": 321,\n                \"name\": \"XXXXX\"\n            },\n            \"destinationTeamId\": 5,\n            \"destinationTeam\": {\n                \"id\": 5,\n                \"name\": \"Suporte Técnico\"\n            },\n            \"destinationPersonId\": null,\n            \"destinationPerson\": null,\n            \"progress\": 50,\n            \"beginningGeopositionLatitude\": null,\n            \"beginningGeopositionLongitude\": null,\n            \"finalGeopositionLatitude\": null,\n            \"finalGeopositionLongitude\": null\n        }\n    ],\n    \"elapsedTime\": null\n}"}],"_postman_id":"1c08635e-632c-4a78-8647-6d872b2037b8"},{"name":"Lista Solicitações por Cliente","id":"7fdbd11c-06af-4ab1-ba88-5cda5e49ad42","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/solicitationlist/{{clientId}}?allAssignments={{True/False}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista as solicitações (protocolos) vinculadas a um cliente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>clientId</code> do cliente no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Quando <code>allAssignments</code> não é enviado ou é enviado como <code>false</code>, retorna apenas as solicitações em aberto do cliente (<code>progress &lt; 100%</code>).</li>\n<li>Quando <code>allAssignments</code> é enviado como <code>true</code>, retorna todas as solicitações do cliente, independentemente do status/andamento.</li>\n<li>Não há paginação: a lista completa que atende ao filtro é devolvida em uma única resposta.</li>\n<li><code>clientId</code> inexistente ou sem solicitações não é tratado como erro: retorna sucesso com lista vazia.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>clientId</td>\n<td>path, long</td>\n<td>Sim</td>\n<td>ID do cliente</td>\n</tr>\n<tr>\n<td>allAssignments</td>\n<td>query, boolean</td>\n<td>Não (default <code>false</code>)</td>\n<td><code>false</code>/omitido: somente solicitações em aberto. <code>true</code>: todas as solicitações, independente do status.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint não segue o envelope padrão de paginação: <code>response</code> é um objeto fixo com <code>status</code>, <code>count</code> e <code>data</code> (não há <code>page</code>/<code>pageSize</code>/<code>totalPages</code>, pois a lista não é paginada).</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td>Sempre <code>\"OK\"</code> quando a chamada é bem-sucedida</td>\n</tr>\n<tr>\n<td><code>response.count</code></td>\n<td>number</td>\n<td>Quantidade de solicitações retornadas</td>\n</tr>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista das solicitações</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientId</code> inexistente ou sem solicitações</td>\n<td><code>success: true</code>, <code>response.count: 0</code>, <code>response.data: []</code> (não é erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Busca detalhes da solicitação\" para obter os dados completos de um protocolo retornado aqui.</li>\n<li>Use \"Busca Relatos por Solicitação\" para o histórico de eventos.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","solicitationlist","{{clientId}}"],"host":["{{URL}}"],"query":[{"key":"allAssignments","value":"{{True/False}}"}],"variable":[]}},"response":[{"id":"f6d6cdb3-29a8-45d5-ad33-5852c7263b61","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/solicitationlist/000000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"count\": 1,\n        \"data\": [\n            {\n                \"assignmentId\": 123456,\n                \"title\": \"Solicitação\",\n                \"protocol\": 123456,\n                \"status\": \"Abertura\",\n                \"team\": \"Comercial\",\n                \"sectorArea\": \"Negócio\",\n                \"beginningData\": \"2021-07-02T08:52:04\",\n                \"finalData\": \"2021-07-02T10:31:00\"\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"7fdbd11c-06af-4ab1-ba88-5cda5e49ad42"},{"name":"Lista Tipos de Solicitações","id":"4b48dda0-70e4-4946-93ec-6a97d3d23092","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/incidenttypespaged?Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}&incident={{true/false}}&onlyWithUser={{true/false}}&changeServiceIncidentTypes={{true/false}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos tipos de solicitação cadastrados na rotina Serviço / Cadastros / Solicitações - Tipos.</p>\n<p>No cadastro do tipo de solicitação, no menu \"Parâmetros\" aba \"Abertura Solicitação\", encontram-se os itens parametrizados para a abertura de uma nova solicitação.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Nenhum campo obrigatório além da paginação.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Sem filtros adicionais, retorna todos os tipos de solicitação não excluídos.</li>\n<li><code>incident = true</code> filtra apenas os tipos de solicitação com agendamento parametrizado na rotina \"Service Desk / Utilitários / Solicitação - Agendamento\".</li>\n<li><code>onlyWithUser = true</code> filtra apenas os tipos de solicitação vinculados às equipes do usuário autenticado (via token). Se o usuário não pertencer a nenhuma equipe, o filtro é ignorado e a listagem completa é retornada.</li>\n<li><code>changeServiceIncidentTypes = true</code> filtra os tipos de solicitação parametrizados para troca de serviço (parâmetro do sistema <code>ChangeContractServiceIncidentTypesList</code>). Quando esse parâmetro não está configurado, o filtro cai para os tipos de solicitação Externos e ativos.</li>\n<li><strong>allowScheduling:</strong> indica se o tipo de solicitação permite agendamento de campo (Field Service) — usado ao abrir uma nova solicitação com pré-agendamento (<code>schedule</code>).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtros adicionais</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação</td>\n</tr>\n<tr>\n<td>incident</td>\n<td>query, boolean</td>\n<td>Não (default <code>false</code>)</td>\n<td>Filtra tipos de solicitação com agendamento (Field Service) parametrizado</td>\n</tr>\n<tr>\n<td>onlyWithUser</td>\n<td>query, boolean</td>\n<td>Não (default <code>false</code>)</td>\n<td>Filtra apenas tipos de solicitação em que o usuário autenticado faz parte da equipe</td>\n</tr>\n<tr>\n<td>changeServiceIncidentTypes</td>\n<td>query, boolean</td>\n<td>Não (default <code>false</code>)</td>\n<td>Filtra apenas tipos de solicitação para troca de serviço</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de tipos de solicitação da página, cada um com <code>team</code> já como objeto <code>{id, code, title}</code>, <code>allCatalogs</code>, <code>availableSla</code>, <code>solicitationType</code>/<code>solicitationTypeDescription</code>, <code>allowScheduling</code>, entre outros</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Sem cenários de erro de negócio identificados — os filtros são todos opcionais e a ausência de resultados retorna página vazia com sucesso.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Busca Tipos de Solicitação\" para consultar os detalhes completos (regras de abertura, permissões e contextos) de um <code>id</code> retornado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","incidenttypespaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Quantidade de Páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página </p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"},{"description":{"content":"<p>Verifica se a solicitação possui agendamento. Os agendamentos são parametrizados na rotina “Service Desk / Utilitários / Solicitação - Agendamento”.</p>\n","type":"text/plain"},"key":"incident","value":"{{true/false}}"},{"description":{"content":"<p>Apenas tipos de solicitações em que o usuário logado faz parte da equipe.</p>\n","type":"text/plain"},"key":"onlyWithUser","value":"{{true/false}}"},{"description":{"content":"<p>Filtrar apenas solicitações para troca de serviço.</p>\n","type":"text/plain"},"key":"changeServiceIncidentTypes","value":"{{true/false}}"}],"variable":[]}},"response":[{"id":"e54d0abc-6a7c-4b9f-b1d2-707b21444ffa","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/incidenttypespaged?Page=1&PageSize=10&Filter={{filter}}&OrderBy={{order_by}}&incident=false&onlyWithUser=false&changeServiceIncidentTypes=false","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","incidenttypespaged"],"query":[{"key":"Page","value":"1"},{"key":"PageSize","value":"10"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"},{"key":"incident","value":"false"},{"key":"onlyWithUser","value":"false"},{"key":"changeServiceIncidentTypes","value":"false"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"activationType\": false,\n                \"id\": 11,\n                \"code\": \"1.1.01\",\n                \"classRequires\": false,\n                \"allCatalogs\": 0,\n                \"title\": \"Pessoal - Contratração\",\n                \"beginningChecklist\": null,\n                \"requiresCatalogService\": 0,\n                \"teamId\": 7,\n                \"team\": {\n                    \"id\": 7,\n                    \"code\": \"1.1\",\n                    \"title\": \"Pessoal\"\n                },\n                \"solicitationType\": 2, //1-Externa / 2-Interna\n                \"solicitationTypeDescription\": \"Interna\",\n                \"requiresCatalogServicesItem\": false,\n                \"forceRequestor\": false,\n                \"requiresLabel\": false,\n                \"availableSla\": [],\n                \"tagRequires\": false,\n                \"hasProcess\": false,\n                \"active\": true,\n                \"allowScheduling\": false, //Permite agendamento de campo (Field Service) na abertura\n                \"defaultText\": \"Criação de Usuário Novo Para Funcionário Novo \\r\\n\\r\\nNome do Funcionário: \\r\\n\\r\\n Sistema ERP Voalle \\r\\n E-mail / AD - \\r\\n Biometria Portão \\r\\n Usuário  Sistema\",\n                \"appOpeningStatusId\": 9\n            },\n            {\n                \"activationType\": false,\n                \"id\": 13,\n                \"code\": \"1.2.11\",\n                \"classRequires\": false,\n                \"allCatalogs\": 0,\n                \"title\": \"Contratos - Upgrade\",\n                \"beginningChecklist\": null,\n                \"requiresCatalogService\": 0,\n                \"teamId\": 8,\n                \"team\": {\n                    \"id\": 8,\n                    \"code\": \"1.2\",\n                    \"title\": \"Comercial\"\n                },\n                \"solicitationType\": 1,\n                \"solicitationTypeDescription\": \"Externa\",\n                \"requiresCatalogServicesItem\": false,\n                \"forceRequestor\": false,\n                \"requiresLabel\": true,\n                \"availableSla\": [],\n                \"tagRequires\": true,\n                \"hasProcess\": false,\n                \"active\": true,\n                \"allowScheduling\": true,\n                \"defaultText\": \"\",\n                \"appOpeningStatusId\": 9\n            }\n        ],\n        \"totalRecords\": 2,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"4b48dda0-70e4-4946-93ec-6a97d3d23092"},{"name":"Busca Tipos de Solicitação","id":"faa354b4-1be4-4920-ad90-486b63a8306c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/incidenttypes/{{id}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os detalhes de um tipo de solicitação específico cadastrado na rotina Serviço / Cadastros / Solicitações - Tipos, incluindo dados básicos, regras de abertura por filial/unidade de negócio, permissões de abertura por equipe e os contextos de solicitação aplicáveis.</p>\n<p>No cadastro do tipo de solicitação, no menu \"Parâmetros\" aba \"Abertura Solicitação\", encontram-se os itens parametrizados para a abertura de uma nova solicitação.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>id</code> do tipo de solicitação (obtido em \"Lista Tipos de Solicitações\").</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>openingRules</code> traz as regras de abertura por filial/unidade de negócio cadastradas para o tipo de solicitação.</li>\n<li><code>openingPermissions</code> traz as equipes autorizadas a abrir solicitações desse tipo.</li>\n<li><code>contexts</code> traz os contextos de solicitação aplicáveis: quando o tipo de solicitação não exige classificação por contexto (<code>RequiresSolicitationClassificationType = false</code>), retorna todos os contextos ativos (excluindo contextos de uso interno quando o tipo de solicitação não é interno); quando exige, retorna apenas os contextos parametrizados especificamente para esse tipo. A lista sai ordenada por <code>label</code>.</li>\n<li><strong>allowScheduling:</strong> indica se o tipo de solicitação permite agendamento de campo (Field Service) — usado ao abrir uma nova solicitação com pré-agendamento (<code>schedule</code>).</li>\n<li><strong>availableSla:</strong> SLAs disponíveis para abertura de solicitação desse tipo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>id</td>\n<td>path, long</td>\n<td>Sim</td>\n<td>ID do tipo de solicitação</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.solicitationType</code> / <code>response.solicitationTypeDescription</code></td>\n<td>number/string</td>\n<td>Tipo: <code>1</code> Externa, <code>2</code> Interna</td>\n</tr>\n<tr>\n<td><code>response.requiresLabel</code></td>\n<td>boolean</td>\n<td><code>true</code> quando <code>solicitationType</code> é Externa</td>\n</tr>\n<tr>\n<td><code>response.openingRules</code></td>\n<td>array</td>\n<td>Regras de abertura por filial/unidade de negócio</td>\n</tr>\n<tr>\n<td><code>response.openingPermissions</code></td>\n<td>array</td>\n<td>Equipes autorizadas a abrir esse tipo de solicitação</td>\n</tr>\n<tr>\n<td><code>response.contexts</code></td>\n<td>array</td>\n<td>Contextos aplicáveis, no formato <code>label</code>/<code>value</code>/<code>title</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code> inexistente ou de um tipo de solicitação excluído</td>\n<td><code>success: false</code>, mensagem \"Tipo de solicitação não encontrado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Tipos de Solicitações\" para localizar o <code>id</code> do tipo de solicitação.</li>\n<li>Use \"Lista SLAs por tipo de solicitação\" para consultar o SLA vinculado.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","incidenttypes","{{id}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"1438c47a-fe83-4c3b-a94e-1331c72909b1","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/incidenttypes/{{id}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"activationType\": false,\n        \"id\": 1,\n        \"code\": \"1\",\n        \"classRequires\": false,\n        \"allCatalogs\": 0,\n        \"title\": \"Tipo de Solicitação A\",\n        \"beginningChecklist\": null,\n        \"requiresCatalogService\": 0,\n        \"teamId\": 1,\n        \"team\": {\n            \"id\": 1,\n            \"code\": \"1.1\",\n            \"title\": \"Operacional - Instalação\"\n        },\n        \"solicitationType\": 1, //1-Externa / 2-Interna\n        \"solicitationTypeDescription\": \"Externa\",\n        \"requiresCatalogServicesItem\": false,\n        \"forceRequestor\": false,\n        \"requiresLabel\": true, //true quando solicitationType = Externa\n        \"availableSla\": [],\n        \"tagRequires\": true,\n        \"hasProcess\": false,\n        \"active\": true,\n        \"allowScheduling\": true, //Permite agendamento de campo (Field Service) na abertura\n        \"defaultText\": \"\",\n        \"formattedDefaultText\": \"\",\n        \"appOpeningStatusId\": 1,\n        \"openingRules\": [\n            {\n                \"id\": 1,\n                \"companyPlace\": {\n                    \"id\": 1,\n                    \"code\": \"01\",\n                    \"description\": \"Empresa A\",\n                    \"name\": \"Empresa A\"\n                },\n                \"companyPlaceBusinessUnit\": null,\n                \"team\": {\n                    \"id\": 1,\n                    \"code\": \"1.0\",\n                    \"title\": \"Financeiro\"\n                }\n            }\n        ],\n        \"openingPermissions\": [\n            {\n                \"team\": {\n                    \"id\": 1,\n                    \"code\": \"1.0\",\n                    \"title\": \"Operacional - Instalação\"\n                }\n            },\n            {\n                \"team\": {\n                    \"id\": 2,\n                    \"code\": \"1.1\",\n                    \"title\": \"Operacional - Manutenção\"\n                }\n            }\n        ],\n        \"contexts\": [\n            {\n                \"label\": \"001.1 - Equipamento\",\n                \"value\": \"2\",\n                \"title\": \"Equipamento\"\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"},{"id":"3a009f92-5b65-4ddd-ae64-3ce31312b8ea","name":"Erro — tipo de solicitação não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/incidenttypes/{{id}}","description":"## Propósito\nRetorna os detalhes de um tipo de solicitação específico cadastrado na rotina Serviço / Cadastros / Solicitações - Tipos, incluindo dados básicos, regras de abertura por filial/unidade de negócio, permissões de abertura por equipe e os contextos de solicitação aplicáveis.\n\nNo cadastro do tipo de solicitação, no menu \"Parâmetros\" aba \"Abertura Solicitação\", encontram-se os itens parametrizados para a abertura de uma nova solicitação.\n\n## Pré-requisitos\n- `id` do tipo de solicitação (obtido em \"Lista Tipos de Solicitações\").\n\n## Regras de negócio\n- `openingRules` traz as regras de abertura por filial/unidade de negócio cadastradas para o tipo de solicitação.\n- `openingPermissions` traz as equipes autorizadas a abrir solicitações desse tipo.\n- `contexts` traz os contextos de solicitação aplicáveis: quando o tipo de solicitação não exige classificação por contexto (`RequiresSolicitationClassificationType = false`), retorna todos os contextos ativos (excluindo contextos de uso interno quando o tipo de solicitação não é interno); quando exige, retorna apenas os contextos parametrizados especificamente para esse tipo. A lista sai ordenada por `label`.\n- **allowScheduling:** indica se o tipo de solicitação permite agendamento de campo (Field Service) — usado ao abrir uma nova solicitação com pré-agendamento (`schedule`).\n- **availableSla:** SLAs disponíveis para abertura de solicitação desse tipo.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| id | path, long | Sim | ID do tipo de solicitação |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a chamada foi processada sem erro |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.solicitationType` / `response.solicitationTypeDescription` | number/string | Tipo: `1` Externa, `2` Interna |\n| `response.requiresLabel` | boolean | `true` quando `solicitationType` é Externa |\n| `response.openingRules` | array | Regras de abertura por filial/unidade de negócio |\n| `response.openingPermissions` | array | Equipes autorizadas a abrir esse tipo de solicitação |\n| `response.contexts` | array | Contextos aplicáveis, no formato `label`/`value`/`title` |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `id` inexistente ou de um tipo de solicitação excluído | `success: false`, mensagem \"Tipo de solicitação não encontrado.\" |\n\n## Fluxo relacionado\n- Use \"Lista Tipos de Solicitações\" para localizar o `id` do tipo de solicitação.\n- Use \"Lista SLAs por tipo de solicitação\" para consultar o SLA vinculado."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"type\": 3,\n            \"message\": \"Tipo de solicitação não encontrado.\",\n            \"code\": null\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"faa354b4-1be4-4920-ad90-486b63a8306c"},{"name":"Lista SLAs por tipo de solicitação","id":"ad2796eb-4a30-482a-8c60-eaa33b0ade40","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/servicelevelagreementpaged?incidentTypeId={{incidentTypeId}}&Page={{page}}&PageSize={{pageSIze}}&Filter={{filter}}&OrderBy={{orderBy}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos SLAs (Acordos de Nível de Serviço) cadastrados, opcionalmente filtrados pelo tipo de solicitação vinculado.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Nenhum campo obrigatório além da paginação.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Sempre retorna apenas SLAs ativos — não há parâmetro para incluir SLAs inativos neste endpoint.</li>\n<li>Caso seja informado o <code>incidentTypeId</code>, são retornadas as informações do SLA vinculado a esse tipo de solicitação:<ul>\n<li>Se o tipo de solicitação tiver um SLA específico configurado, retorna apenas esse SLA.</li>\n<li>Se não tiver um SLA específico mas tiver um tipo de SLA configurado, retorna todos os SLAs desse tipo.</li>\n<li>Se o tipo de solicitação não tiver nem SLA nem tipo de SLA configurado, retorna todos os SLAs ativos (sem filtro adicional).</li>\n<li>Se o <code>incidentTypeId</code> informado não existir, a chamada falha.</li>\n</ul>\n</li>\n<li>Caso <code>incidentTypeId</code> não seja informado, retorna a lista geral de SLAs ativos. No ERP essa informação pode ser verificada na rotina \"Service Desk / Cadastros / Situações de Solicitações\".</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>incidentTypeId</td>\n<td>query, long</td>\n<td>Não</td>\n<td>ID do tipo de solicitação. Quando informado, filtra os SLAs vinculados a esse tipo.</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtro</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de SLAs da página, cada item com <code>priority</code> e <code>weight</code> já decodificados</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n<tr>\n<td><code>response.data[].priority.value</code></td>\n<td>number</td>\n<td>0-Normal / 1-Média / 2-Alta / 3-Urgente</td>\n</tr>\n<tr>\n<td><code>response.data[].clientHours</code> / <code>response.data[].clientMinutes</code></td>\n<td>number</td>\n<td>Prazo do SLA</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>incidentTypeId</code> informado e inexistente</td>\n<td><code>success: false</code>, mensagem \"Tipo de solicitação não encontrado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Tipos de Solicitações\" ou \"Busca Tipos de Solicitação\" para obter o <code>incidentTypeId</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","servicelevelagreementpaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>ID do tipo de solicitação</p>\n","type":"text/plain"},"key":"incidentTypeId","value":"{{incidentTypeId}}"},{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página</p>\n","type":"text/plain"},"key":"PageSize","value":"{{pageSIze}}"},{"description":{"content":"<p>Filtro</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{orderBy}}"}],"variable":[]}},"response":[{"id":"d43477be-2186-4687-8e06-3632aeeb4369","name":"Sucesso — informando incidentTypeId","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação"}],"url":{"raw":"https://erp.cliente.com,br:45715/external/integrations/thirdparty/servicelevelagreementpaged?incidentTypeId=1133&Page=&PageSize=&Filter=&OrderBy=","protocol":"https","host":["erp","cliente","com,br"],"port":"45715","path":["external","integrations","thirdparty","servicelevelagreementpaged"],"query":[{"key":"incidentTypeId","value":"1133","description":"ID do tipo de solicitação"},{"key":"Page","value":"","description":"Quantidade de páginas"},{"key":"PageSize","value":"","description":"Quantidade de itens por página"},{"key":"Filter","value":"","description":"Filtro"},{"key":"OrderBy","value":"","description":"Ordenação"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"active\": true, //Ativo?\n                \"clientHours\": 1, //Prazo em horas\n                \"clientMinutes\": 30, //Prazo em minutos\n                \"code\": \"99\", //Código do SLA\n                \"description\": \"Manual\", //Situação\n                \"id\": 99, //ID\n                \"priority\": { //Prioridade\n                    \"value\": 0, //Numerador\n                    \"label\": \"Normal\" //Titulo\n                },\n                \"title\": \"SLA Manual\", //Titulo do SLA\n                \"serviceLevelAgreementTypeId\": 9, //ID do tipo do SLA\n                \"serviceLevelAgreementType\": {\n                    \"id\": 9, //ID dp tipo do sla\n                    \"title\": \"Manual\" //Titulo\n                },\n                \"synsuiteCode\": null,\n                \"weight\": { //Peso (criticidade)  do SLA\n                    \"value\": 6,\n                    \"label\": \"6\"\n                }\n            }\n        ],\n        \"totalRecords\": 1,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"},{"id":"70cfd0d7-14d4-4561-ae18-cebe6a9249e4","name":"Sucesso — SLAs em geral","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/servicelevelagreementpaged?Page=1&PageSize=5&Filter=&OrderBy=","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","servicelevelagreementpaged"],"query":[{"key":"Page","value":"1","description":"Quantidade de páginas"},{"key":"PageSize","value":"5","description":"Quantidade de itens por página"},{"key":"Filter","value":"","description":"Filtro"},{"key":"OrderBy","value":"","description":"Ordenação"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"active\": true, //Ativo?\n                \"clientHours\": 4, //Prazo em horas\n                \"clientMinutes\": 0, //Prazo em minutos\n                \"code\": \"6\", //Código\n                \"description\": \"Parado\", //Situação\n                \"id\": 6, //ID\n                \"priority\": { //Prioridade\n                    \"value\": 3, //Numerador\n                    \"label\": \"Urgente\" //Titulo\n                },\n                \"title\": null, //Titulo do SLA \n                \"serviceLevelAgreementTypeId\": 1, //ID do SLA\n                \"serviceLevelAgreementType\": {\n                    \"id\": 1, //ID do SLA\n                    \"title\": \"24x7\" //Titulo\n                },\n                \"synsuiteCode\": null,\n                \"weight\": { //Peso (Criticidade)\n                    \"value\": 0,\n                    \"label\": \"0\"\n                }\n            },\n            {\n                \"active\": true,\n                \"clientHours\": 48,\n                \"clientMinutes\": 0,\n                \"code\": \"7\",\n                \"description\": \"Prejudicado\",\n                \"id\": 7,\n                \"priority\": {\n                    \"value\": 2,\n                    \"label\": \"Alta\"\n                },\n                \"title\": null,\n                \"serviceLevelAgreementTypeId\": 1,\n                \"serviceLevelAgreementType\": {\n                    \"id\": 1,\n                    \"title\": \"24x7\"\n                },\n                \"synsuiteCode\": null,\n                \"weight\": {\n                    \"value\": 0,\n                    \"label\": \"0\"\n                }\n            },\n            {\n                \"active\": true,\n                \"clientHours\": 48,\n                \"clientMinutes\": 0,\n                \"code\": \"8\",\n                \"description\": \"Duvida\",\n                \"id\": 8,\n                \"priority\": {\n                    \"value\": 1,\n                    \"label\": \"Média\"\n                },\n                \"title\": null,\n                \"serviceLevelAgreementTypeId\": 1,\n                \"serviceLevelAgreementType\": {\n                    \"id\": 1,\n                    \"title\": \"24x7\"\n                },\n                \"synsuiteCode\": null,\n                \"weight\": {\n                    \"value\": 0,\n                    \"label\": \"0\"\n                }\n            },\n            {\n                \"active\": true,\n                \"clientHours\": 16,\n                \"clientMinutes\": 0,\n                \"code\": \"10\",\n                \"description\": \"SLA - 16 H PJ\",\n                \"id\": 10,\n                \"priority\": {\n                    \"value\": 3,\n                    \"label\": \"Urgente\"\n                },\n                \"title\": null,\n                \"serviceLevelAgreementTypeId\": 1,\n                \"serviceLevelAgreementType\": {\n                    \"id\": 1,\n                    \"title\": \"24x7\"\n                },\n                \"synsuiteCode\": null,\n                \"weight\": {\n                    \"value\": 8,\n                    \"label\": \"8\"\n                }\n            },\n            {\n                \"active\": true,\n                \"clientHours\": 168,\n                \"clientMinutes\": 0,\n                \"code\": \"100\",\n                \"description\": \"Solicitação Ativação - SLA 7 dias \",\n                \"id\": 100,\n                \"priority\": {\n                    \"value\": 0,\n                    \"label\": \"Normal\"\n                },\n                \"title\": null,\n                \"serviceLevelAgreementTypeId\": 1,\n                \"serviceLevelAgreementType\": {\n                    \"id\": 1,\n                    \"title\": \"24x7\"\n                },\n                \"synsuiteCode\": null,\n                \"weight\": {\n                    \"value\": 10,\n                    \"label\": \"10\"\n                }\n            }\n        ],\n        \"totalRecords\": 16,\n        \"page\": 1,\n        \"pageSize\": 5,\n        \"totalizers\": null,\n        \"totalPages\": 4\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"},{"id":"2c063036-4da1-4ff9-8b7b-6f5ccdb26949","name":"Erro — tipo de solicitação não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/servicelevelagreementpaged?incidentTypeId={{incidentTypeId}}&Page={{page}}&PageSize={{pageSIze}}&Filter={{filter}}&OrderBy={{orderBy}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","servicelevelagreementpaged"],"query":[{"key":"incidentTypeId","value":"{{incidentTypeId}}","description":"ID do tipo de solicitação"},{"key":"Page","value":"{{page}}","description":"Quantidade de páginas"},{"key":"PageSize","value":"{{pageSIze}}","description":"Quantidade de itens por página"},{"key":"Filter","value":"{{filter}}","description":"Filtro"},{"key":"OrderBy","value":"{{orderBy}}","description":"Ordenação"}]},"description":"## Propósito\nLista paginada dos SLAs (Acordos de Nível de Serviço) cadastrados, opcionalmente filtrados pelo tipo de solicitação vinculado.\n\n## Pré-requisitos\nNenhum campo obrigatório além da paginação.\n\n## Regras de negócio\n- Sempre retorna apenas SLAs ativos — não há parâmetro para incluir SLAs inativos neste endpoint.\n- Caso seja informado o `incidentTypeId`, são retornadas as informações do SLA vinculado a esse tipo de solicitação:\n  - Se o tipo de solicitação tiver um SLA específico configurado, retorna apenas esse SLA.\n  - Se não tiver um SLA específico mas tiver um tipo de SLA configurado, retorna todos os SLAs desse tipo.\n  - Se o tipo de solicitação não tiver nem SLA nem tipo de SLA configurado, retorna todos os SLAs ativos (sem filtro adicional).\n  - Se o `incidentTypeId` informado não existir, a chamada falha.\n- Caso `incidentTypeId` não seja informado, retorna a lista geral de SLAs ativos. No ERP essa informação pode ser verificada na rotina \"Service Desk / Cadastros / Situações de Solicitações\".\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| incidentTypeId | query, long | Não | ID do tipo de solicitação. Quando informado, filtra os SLAs vinculados a esse tipo. |\n| Page | query, int | Sim | Número da página |\n| PageSize | query, int | Sim | Quantidade de itens por página |\n| Filter | query, string | Não | Filtro |\n| OrderBy | query, string | Não | Ordenação |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a chamada foi processada sem erro |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.data` | array | Lista de SLAs da página, cada item com `priority` e `weight` já decodificados |\n| `response.totalRecords` | number | Total de registros encontrados |\n| `response.page` | number | Página atual |\n| `response.pageSize` | number | Quantidade de itens por página |\n| `response.totalPages` | number | Total de páginas |\n| `response.data[].priority.value` | number | 0-Normal / 1-Média / 2-Alta / 3-Urgente |\n| `response.data[].clientHours` / `response.data[].clientMinutes` | number | Prazo do SLA |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `incidentTypeId` informado e inexistente | `success: false`, mensagem \"Tipo de solicitação não encontrado.\" |\n\n## Fluxo relacionado\n- Use \"Lista Tipos de Solicitações\" ou \"Busca Tipos de Solicitação\" para obter o `incidentTypeId`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"type\": 3,\n            \"message\": \"Tipo de solicitação não encontrado.\",\n            \"code\": null\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"ad2796eb-4a30-482a-8c60-eaa33b0ade40"},{"name":"Lista Etiquetas, Catalogo, itens e Subitens de Serviço por Cliente/Contrato","id":"f29ac4f6-4fcb-46d7-97d2-5bd132af2505","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação.</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/servicetagsinfopaged?txId={{CPF/CNPJ}}&Page={{Paginas}}&PageSize={{Itens_por_pagina}}&OrderBy={{OrderBy}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada das etiquetas de serviço de um cliente, com os respectivos catálogos, itens e subitens de serviço vinculados a cada etiqueta.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>txId</code> (CPF/CNPJ) de um cliente cadastrado no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas etiquetas ativas e não excluídas do cliente informado.</li>\n<li>Etiquetas de faturamento (vinculadas a uma configuração de faturamento de contrato) nunca são retornadas por este endpoint.</li>\n<li>Por padrão, etiquetas de contratos com status Cancelado ou Encerrado são excluídas da listagem. Essa exclusão é desativada por completo quando o parâmetro de sistema \"Permitir atendimento de contratos bloqueados\" (<code>AllowAttendanceBlockeds</code>) está habilitado — nesse caso, etiquetas de contratos com qualquer status (inclusive Suspenso, Bloqueio Financeiro, Bloqueio Administrativo, Em Cancelamento) também são retornadas.</li>\n<li>⚠ Apenas os status Cancelado e Encerrado são excluídos por essa regra; contratos Suspensos ou em Bloqueio Financeiro/Administrativo não são filtrados por padrão.</li>\n<li>Dentro de cada etiqueta, só entram catálogos ativos; dentro de cada catálogo, só entram itens de serviço ativos; dentro de cada item, só entram subitens ativos.</li>\n<li><code>txId</code> inexistente é tratado como erro (cliente não encontrado).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>txId</td>\n<td>query, string</td>\n<td>Sim</td>\n<td>CPF ou CNPJ do cliente</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de etiquetas da página, cada uma com <code>catalogServices[]</code> → <code>catalogServiceItems[]</code> → <code>catalogServiceItemClasses[]</code></td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code> vazio/não informado</td>\n<td><code>success: false</code>, mensagem \"CPF ou CNPJ não repassado ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>txId</code> de cliente inexistente</td>\n<td><code>success: false</code>, mensagem \"Cliente não encontrado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Etiquetas por Cliente/Contrato\" quando precisar apenas dos IDs das etiquetas (sem catálogos/itens/subitens).</li>\n<li>Use \"Lista Catálogo de Serviços por Etiqueta do Contrato\" para consultar o catálogo de uma etiqueta isoladamente, já paginado por catálogo.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","servicetagsinfopaged"],"host":["{{URL}}"],"query":[{"key":"txId","value":"{{CPF/CNPJ}}"},{"key":"Page","value":"{{Paginas}}"},{"key":"PageSize","value":"{{Itens_por_pagina}}"},{"key":"OrderBy","value":"{{OrderBy}}"}],"variable":[]}},"response":[{"id":"6e807937-82fa-4389-af44-85e4940fab4d","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/servicetagsinfopaged?txId=01234567891&Page=1&PageSize=15&OrderBy=","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","servicetagsinfopaged"],"query":[{"key":"txId","value":"01234567891"},{"key":"Page","value":"1"},{"key":"PageSize","value":"15"},{"key":"OrderBy","value":""}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": 123, //ID da Etiqueta\n                \"contractId\": 1000, //ID do Contrato\n                \"title\": \"FIBER HOME : Com Fidelidade : Promo \", //Titulo\n                \"tag\": \"XXXXXXXX\", //Tag da Etiqueta\n                \"description\": \"FAMÍLIA 240Mbps com fidelidade\", //Descrição\n                \"catalogServices\": []\n            },\n            {\n                \"id\": 1234, //ID da Etiqueta\n                \"contractId\": 1000, //ID do Contrato\n                \"title\": null, //Titulo\n                \"tag\": \"XXXXXXX\", //TAG\n                \"description\": \"Teste\", //Descrição\n                \"catalogServices\": [ //Catálogo de Serviço\n                    {\n                        \"contractServiceTagId\": 1234, //ID da Etiqueta\n                        \"id\": 1, //ID do catálogo\n                        \"code\": \"1.01\", //Código\n                        \"title\": \"Suporte\", //Titulo\n                        \"shortDescription\": \"Suporte\", //Descrição\n                        \"serviceType\": 1, //Tipo de Serviço: Hardware = 1 / Software = 2 / Outro = 3\n                        \"weight\": 5, //Peso (Criticidade)\n                        \"amountStandard\": 1, //Valor padrão\n                        \"sectorId\": null,\n                        \"companyPlace\": { //Local\n                            \"id\": 1,\n                            \"code\": \"01\",\n                            \"description\": \"Testes\",\n                            \"name\": \"HTEC TELECOMUNICACOES EIRELI\"\n                        },\n                        \"serviceLevelAgreement\": { //SLA\n                            \"id\": 9,\n                            \"title\": \"Manual\"\n                        },\n                        \"sectorArea\": { //Área\n                            \"id\": 1,\n                            \"title\": \"Administrativa\"\n                        },\n                        \"catalogServiceItems\": [ //Itens de Serviço\n                            {\n                                \"catalogServiceId\": 1, //ID do Catálogo\n                                \"id\": 1, //ID do Item \n                                \"code\": \"Comercial\", //Código\n                                \"title\": \"Comercial\", //Titulo\n                                \"description\": \"Setor responsável por assuntos relacionado a seu fluxo de trabalho\", //DDescrição\n                                \"weight\": 1, //Peso (Criticidade)\n                                \"synsuiteCode\": null,\n                                \"catalogServiceItemClasses\": [ //Subitens de Serviço\n                                    {\n                                        \"catalogServiceItemId\": 1, //ID do Item de Serviço\n                                        \"id\": 1, //ID do Subitem\n                                        \"code\": \"1234\", //Código\n                                        \"title\": \"teste subitem\", //Titulo\n                                        \"description\": \"teste\", //Descrição\n                                        \"weight\": 2, //Peso (Criticidade)\n                                        \"synsuiteCode\": null\n                                    },\n                                    {\n                                        \"catalogServiceItemId\": 1, //ID do Item de Serviço\n                                        \"id\": 2, //ID do Subitem\n                                        \"code\": \"teste 2\", //Código\n                                        \"title\": \"teste 2\", //Título\n                                        \"description\": \"teste\", //Descrição\n                                        \"weight\": 0, //Peso (Criticidade)\n                                        \"synsuiteCode\": null\n                                    }\n                                ]\n                            },\n                            {\n                                \"catalogServiceId\": 1, //ID do Catálogo\n                                \"id\": 2, //ID do Item\n                                \"code\": \"123123\",\n                                \"title\": \"teste\",\n                                \"description\": \"teste\",\n                                \"weight\": 1,\n                                \"synsuiteCode\": null,\n                                \"catalogServiceItemClasses\": [ //Subitens de Serviço\n                                    {\n                                        \"catalogServiceItemId\": 2, //ID do Item de Serviço\n                                        \"id\": 1, //ID do Subitem\n                                        \"code\": \"1234\",\n                                        \"title\": \"teste subitem\",\n                                        \"description\": \"teste\",\n                                        \"weight\": 2,\n                                        \"synsuiteCode\": null\n                                    },\n                                    {\n                                        \"catalogServiceItemId\": 2,\n                                        \"id\": 2,\n                                        \"code\": \"teste 2\",\n                                        \"title\": \"teste 2\",\n                                        \"description\": \"teste\",\n                                        \"weight\": 0,\n                                        \"synsuiteCode\": null\n                                    },\n                                    {\n                                        \"catalogServiceItemId\": 2,\n                                        \"id\": 3,\n                                        \"code\": \"teste 3\",\n                                        \"title\": \"teste 3\",\n                                        \"description\": \"teste\",\n                                        \"weight\": 0,\n                                        \"synsuiteCode\": null\n                                    }\n                                ]\n                            },\n                            {\n                                \"catalogServiceId\": 1,\n                                \"id\": 3,\n                                \"code\": \"321\",\n                                \"title\": \"teste2\",\n                                \"description\": \"teste\",\n                                \"weight\": 0,\n                                \"synsuiteCode\": null,\n                                \"catalogServiceItemClasses\": [\n                                    {\n                                        \"catalogServiceItemId\": 3,\n                                        \"id\": 4,\n                                        \"code\": \"12345\",\n                                        \"title\": \"teste 4\",\n                                        \"description\": \"teste\",\n                                        \"weight\": 1,\n                                        \"synsuiteCode\": null\n                                    }\n                                ]\n                            }\n                        ]\n                    }\n                ]\n            }\n        ],\n        \"totalRecords\": 2,\n        \"page\": 1,\n        \"pageSize\": 15,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"},{"id":"eb9bc9ee-ed49-43e8-9d49-9d9f052d471d","name":"Erro — cliente não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação."}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/servicetagsinfopaged?txId={{CPF/CNPJ}}&Page={{Paginas}}&PageSize={{Itens_por_pagina}}&OrderBy={{OrderBy}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","servicetagsinfopaged"],"query":[{"key":"txId","value":"{{CPF/CNPJ}}"},{"key":"Page","value":"{{Paginas}}"},{"key":"PageSize","value":"{{Itens_por_pagina}}"},{"key":"OrderBy","value":"{{OrderBy}}"}]},"description":"## Propósito\nLista paginada das etiquetas de serviço de um cliente, com os respectivos catálogos, itens e subitens de serviço vinculados a cada etiqueta.\n\n## Pré-requisitos\n- `txId` (CPF/CNPJ) de um cliente cadastrado no ERP.\n\n## Regras de negócio\n- Retorna apenas etiquetas ativas e não excluídas do cliente informado.\n- Etiquetas de faturamento (vinculadas a uma configuração de faturamento de contrato) nunca são retornadas por este endpoint.\n- Por padrão, etiquetas de contratos com status Cancelado ou Encerrado são excluídas da listagem. Essa exclusão é desativada por completo quando o parâmetro de sistema \"Permitir atendimento de contratos bloqueados\" (`AllowAttendanceBlockeds`) está habilitado — nesse caso, etiquetas de contratos com qualquer status (inclusive Suspenso, Bloqueio Financeiro, Bloqueio Administrativo, Em Cancelamento) também são retornadas.\n- ⚠ Apenas os status Cancelado e Encerrado são excluídos por essa regra; contratos Suspensos ou em Bloqueio Financeiro/Administrativo não são filtrados por padrão.\n- Dentro de cada etiqueta, só entram catálogos ativos; dentro de cada catálogo, só entram itens de serviço ativos; dentro de cada item, só entram subitens ativos.\n- `txId` inexistente é tratado como erro (cliente não encontrado).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| txId | query, string | Sim | CPF ou CNPJ do cliente |\n| Page | query, int | Sim | Número da página |\n| PageSize | query, int | Sim | Quantidade de itens por página |\n| OrderBy | query, string | Não | Ordenação |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a chamada foi processada sem erro |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.data` | array | Lista de etiquetas da página, cada uma com `catalogServices[]` → `catalogServiceItems[]` → `catalogServiceItemClasses[]` |\n| `response.totalRecords` | number | Total de registros encontrados |\n| `response.page` | number | Página atual |\n| `response.pageSize` | number | Quantidade de itens por página |\n| `response.totalPages` | number | Total de páginas |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `txId` vazio/não informado | `success: false`, mensagem \"CPF ou CNPJ não repassado ao controlador.\" |\n| `txId` de cliente inexistente | `success: false`, mensagem \"Cliente não encontrado.\" |\n\n## Fluxo relacionado\n- Use \"Lista Etiquetas por Cliente/Contrato\" quando precisar apenas dos IDs das etiquetas (sem catálogos/itens/subitens).\n- Use \"Lista Catálogo de Serviços por Etiqueta do Contrato\" para consultar o catálogo de uma etiqueta isoladamente, já paginado por catálogo."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"type\": 3,\n            \"message\": \"Cliente não encontrado.\",\n            \"code\": null\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"f29ac4f6-4fcb-46d7-97d2-5bd132af2505"},{"name":"Lista Etiquetas por Cliente/Contrato","id":"66fdb8df-0303-4015-8e65-544f3106f931","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contractservicetagspaged?txId={{tx_id}}&Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos IDs das etiquetas de serviço ativas de um cliente. Retorna apenas os identificadores — para os dados completos das etiquetas (catálogo, itens e subitens), use \"Lista Etiquetas, Catalogo, itens e Subitens de Serviço por Cliente/Contrato\".</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>txId</code> (CPF/CNPJ) de um cliente cadastrado no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas etiquetas ativas e não excluídas do cliente informado.</li>\n<li>⚠ Diferente do endpoint \"Lista Etiquetas, Catalogo, itens e Subitens de Serviço por Cliente/Contrato\", este método não exclui etiquetas de faturamento nem filtra pelo status do contrato (etiquetas de contratos cancelados/encerrados também são retornadas).</li>\n<li><code>txId</code> de cliente inexistente não é tratado como erro de negócio: retorna sucesso com página vazia.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>txId</td>\n<td>query, string</td>\n<td>Sim</td>\n<td>CPF ou CNPJ do cliente</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtros adicionais</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de etiquetas da página (cada item contém apenas <code>id</code>)</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>txId</code> de cliente inexistente</td>\n<td><code>success: true</code>, <code>response.data: []</code>, <code>response.totalRecords: 0</code> (não é erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Catálogo de Serviços por Etiqueta do Contrato\" informando o <code>id</code> retornado aqui.</li>\n<li>Use \"Lista Etiquetas, Catalogo, itens e Subitens de Serviço por Cliente/Contrato\" quando precisar dos dados completos das etiquetas em uma única chamada.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contractservicetagspaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>CPF ou CNPJ</p>\n","type":"text/plain"},"key":"txId","value":"{{tx_id}}"},{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página </p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"}],"variable":[]}},"response":[{"id":"2a7f57ea-3a59-485d-9696-57fc0f72520f","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contractservicetagspaged?txId=00000000000&Page=1&PageSize=10&Filter={{filter}}&OrderBy={{order_by}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","contractservicetagspaged"],"query":[{"key":"txId","value":"00000000000"},{"key":"Page","value":"1"},{"key":"PageSize","value":"10"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": 123456\n            },\n            {\n                \"id\": 0\n            },\n            {\n                \"id\": 111111\n            },\n            {\n                \"id\": 222222\n            },\n            {\n                \"id\": 333333\n            },\n            {\n                \"id\": 444444\n            },\n            {\n                \"id\": 666666\n            },\n            {\n                \"id\": 777777\n            },\n            {\n                \"id\": 888888\n            },\n            {\n                \"id\": 999999\n            }\n        ],\n        \"totalRecords\": 10,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"66fdb8df-0303-4015-8e65-544f3106f931"},{"name":"Lista Catálogo de Serviços por Etiqueta do Contrato","id":"fda3c720-74af-46a8-b232-29be5e80c7dd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no métoo de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/catalogservicespaged?serviceTagId={{service_tag_id}}&Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos catálogos de serviço (tipos de atendimento) vinculados a uma etiqueta de contrato.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>serviceTagId</code> de uma etiqueta obtida em \"Lista Etiquetas por Cliente/Contrato\" ou \"Lista Etiquetas, Catalogo, itens e Subitens de Serviço por Cliente/Contrato\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas vínculos não excluídos, cujo catálogo de serviço e etiqueta de contrato também não estejam excluídos.</li>\n<li><code>serviceTagId</code> inexistente ou sem catálogos vinculados não é tratado como erro: retorna página vazia.</li>\n<li><strong>expectedHours:</strong> carga horária prevista para execução do serviço.</li>\n<li><strong>catalogServicesSkills:</strong> habilidades (skills) associadas ao serviço, usadas pelo módulo de agendamento de campo (Field Service) para calcular disponibilidade de técnicos.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>serviceTagId</td>\n<td>query, long</td>\n<td>Sim</td>\n<td>ID da etiqueta de contrato</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtros (opcional)</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação (opcional)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de vínculos da página; cada item traz o vínculo <code>id</code> e o objeto <code>catalogServices</code> com os dados completos do catálogo, incluindo <code>expectedHours</code> e <code>catalogServicesSkills[]</code></td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Sem cenários de erro de negócio identificados — <code>serviceTagId</code> inexistente retorna página vazia com sucesso.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Itens do Serviço por Catálogo de Serviço\" informando o <code>catalogServices.id</code> retornado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","catalogservicespaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obtido no método \"Lista etiqueta de Contrato\"</p>\n","type":"text/plain"},"key":"serviceTagId","value":"{{service_tag_id}}"},{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página</p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"}],"variable":[]}},"response":[{"id":"298435f4-f7c5-4d78-b33c-54be1f458d04","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/catalogservicespaged?serviceTagId=123456&Page=1&PageSize=5&Filter={{filter}}&OrderBy={{order_by}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","catalogservicespaged"],"query":[{"key":"serviceTagId","value":"123456","description":"Obtido no método \"Lista etiqueta de Contrato\""},{"key":"Page","value":"1"},{"key":"PageSize","value":"5"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": \"123456-eeea-11e9-4444-000abcdefg\",\n                \"catalogServices\": {\n                    \"id\": 1,\n                    \"code\": \"1.01\",\n                    \"title\": \"Suporte\",\n                    \"active\": true,\n                    \"shortDescription\": \"Suporte\",\n                    \"description\": \"\",\n                    \"typeService\": 3,\n                    \"amountStandard\": null,\n                    \"weight\": 5,\n                    \"created\": \"2016-04-12T19:15:06\",\n                    \"modified\": \"2016-04-12T19:15:06\",\n                    \"expectedHours\": 2,\n                    \"companyPlace\": null,\n                    \"sector\": null,\n                    \"serviceLevelAgreementType\": {\n                        \"id\": 2,\n                        \"title\": \"8x5\"\n                    },\n                    \"sectorArea\": null,\n                    \"catalogServicesSkills\": [\n                        {\n                            \"id\": 1,\n                            \"title\": \"Instalação de equipamento\"\n                        }\n                    ]\n                }\n            }\n        ],\n        \"totalRecords\": 1,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"fda3c720-74af-46a8-b232-29be5e80c7dd"},{"name":"Lista Itens do Serviço por Catálogo de Serviço","id":"1417ed7d-1e00-4271-8545-bae2e9fa25d8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/catalogservicesitemspaged?catalogServiceId={{catalog_service_id}}&Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos itens de serviço vinculados a um catálogo de serviço.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>catalogServiceId</code> obtido em \"Lista Catálogo de Serviços por Etiqueta do Contrato\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Filtra apenas os vínculos do catálogo de serviço informado.</li>\n<li><code>catalogServiceId</code> inexistente ou sem itens vinculados não é tratado como erro: retorna página vazia.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>catalogServiceId</td>\n<td>query, long</td>\n<td>Sim</td>\n<td>ID do catálogo de serviço</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtros (opcional)</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação (opcional)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de itens da página; cada item traz os dados do item de serviço, o objeto <code>catalogServiceItem</code> duplicado e <code>catalogServiceIds[]</code> com os catálogos aos quais o item está vinculado</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Sem cenários de erro de negócio identificados — <code>catalogServiceId</code> inexistente retorna página vazia com sucesso.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Lista Subitens do Serviço por Item de Serviço\" informando o <code>id</code> do item retornado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","catalogservicesitemspaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obtido no método \"Lista catálogo de serviços\"</p>\n","type":"text/plain"},"key":"catalogServiceId","value":"{{catalog_service_id}}"},{"description":{"content":"<p>Quantidade de páginas</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidades de itens por página</p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"}],"variable":[]}},"response":[{"id":"030b5561-af64-4672-b189-b77a8fc9f8cd","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/catalogservicesitemspaged?catalogServiceId=1&Page=1&PageSize=5&Filter={{filter}}&OrderBy={{order_by}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","catalogservicesitemspaged"],"query":[{"key":"catalogServiceId","value":"1","description":"Obtido no método \"Lista catálogo de serviços\""},{"key":"Page","value":"1"},{"key":"PageSize","value":"5"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"code\": \"123123\",\n                \"title\": \"teste\",\n                \"active\": true,\n                \"weight\": 1,\n                \"description\": \"teste\",\n                \"id\": 2,\n                \"synsuiteCode\": null,\n                \"catalogServiceItem\": {\n                    \"code\": \"123123\",\n                    \"title\": \"teste\",\n                    \"active\": true,\n                    \"weight\": 1,\n                    \"description\": \"teste\",\n                    \"id\": 2\n                },\n                \"catalogServiceIds\": [\n                    1\n                ]\n            }\n        ],\n        \"totalRecords\": 1,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"1417ed7d-1e00-4271-8545-bae2e9fa25d8"},{"name":"Lista Subitens do Serviço por Item de Serviço","id":"e7a29346-e3f7-4ed3-a1b4-42ba451293d7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/catalogservicesitemsclassespaged?catalogServiceItemId={{catalog_servic_item_id}}&Page={{page}}&PageSize={{page_size}}&Filter={{filter}}&OrderBy={{order_by}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista paginada dos subitens de serviço vinculados a um item de serviço.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>catalogServiceItemId</code> obtido em \"Lista Itens do Serviço por Catálogo de Serviço\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Filtra apenas os vínculos do item de serviço informado.</li>\n<li>Endpoint paginado como os demais desta família (<code>Page</code>/<code>PageSize</code>), embora a URL de exemplo historicamente não os exiba.</li>\n<li><code>catalogServiceItemId</code> inexistente ou sem subitens vinculados não é tratado como erro: retorna página vazia.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>catalogServiceItemId</td>\n<td>query, long</td>\n<td>Sim</td>\n<td>ID do item de serviço</td>\n</tr>\n<tr>\n<td>Page</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Número da página</td>\n</tr>\n<tr>\n<td>PageSize</td>\n<td>query, int</td>\n<td>Sim</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td>Filter</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Filtros (opcional)</td>\n</tr>\n<tr>\n<td>OrderBy</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Ordenação (opcional)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de subitens da página; cada item traz os dados do subitem, o objeto <code>catalogServiceItemClass</code> duplicado e <code>catalogServicesItemsIds[]</code> com os itens de serviço aos quais o subitem está vinculado</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de registros encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Quantidade de itens por página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Sem cenários de erro de negócio identificados — <code>catalogServiceItemId</code> inexistente retorna página vazia com sucesso.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Adiciona Relato e altera Status da Solicitação\" ou os endpoints de abertura de solicitação para vincular o subitem escolhido à solicitação.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","catalogservicesitemsclassespaged"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obtido no método \"Lista Itens de Serviço do Catálogo\"</p>\n","type":"text/plain"},"key":"catalogServiceItemId","value":"{{catalog_servic_item_id}}"},{"description":{"content":"<p>Número da página</p>\n","type":"text/plain"},"key":"Page","value":"{{page}}"},{"description":{"content":"<p>Quantidade de itens por página</p>\n","type":"text/plain"},"key":"PageSize","value":"{{page_size}}"},{"description":{"content":"<p>Filtros (Opcional)</p>\n","type":"text/plain"},"key":"Filter","value":"{{filter}}"},{"description":{"content":"<p>Ordenação (Opcional)</p>\n","type":"text/plain"},"key":"OrderBy","value":"{{order_by}}"}],"variable":[]}},"response":[{"id":"736d85c5-8eac-41df-ada2-9c7184c64351","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/catalogservicesitemsclassespaged?catalogServiceItemId=2&Filter={{filter}}&OrderBy={{order_by}}","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","catalogservicesitemsclassespaged"],"query":[{"key":"catalogServiceItemId","value":"2"},{"key":"Filter","value":"{{filter}}"},{"key":"OrderBy","value":"{{order_by}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"code\": \"1234\",\n                \"title\": \"teste subitem\",\n                \"active\": true,\n                \"weight\": 2,\n                \"description\": \"teste\",\n                \"id\": 1,\n                \"synsuiteCode\": null,\n                \"catalogServiceItemClass\": {\n                    \"code\": \"1234\",\n                    \"title\": \"teste subitem\",\n                    \"active\": true,\n                    \"weight\": 2,\n                    \"description\": \"teste\",\n                    \"id\": 1\n                },\n                \"catalogServicesItemsIds\": [\n                    2\n                ]\n            },\n            {\n                \"code\": \"teste 2\",\n                \"title\": \"teste 2\",\n                \"active\": true,\n                \"weight\": 0,\n                \"description\": \"teste\",\n                \"id\": 2,\n                \"synsuiteCode\": null,\n                \"catalogServiceItemClass\": {\n                    \"code\": \"teste 2\",\n                    \"title\": \"teste 2\",\n                    \"active\": true,\n                    \"weight\": 0,\n                    \"description\": \"teste\",\n                    \"id\": 2\n                },\n                \"catalogServicesItemsIds\": [\n                    2\n                ]\n            },\n            {\n                \"code\": \"teste 3\",\n                \"title\": \"teste 3\",\n                \"active\": true,\n                \"weight\": 0,\n                \"description\": \"teste\",\n                \"id\": 3,\n                \"synsuiteCode\": null,\n                \"catalogServiceItemClass\": {\n                    \"code\": \"teste 3\",\n                    \"title\": \"teste 3\",\n                    \"active\": true,\n                    \"weight\": 0,\n                    \"description\": \"teste\",\n                    \"id\": 3\n                },\n                \"catalogServicesItemsIds\": [\n                    2\n                ]\n            }\n        ],\n        \"totalRecords\": 3,\n        \"page\": 1,\n        \"pageSize\": 10,\n        \"totalizers\": null,\n        \"totalPages\": 1\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"e7a29346-e3f7-4ed3-a1b4-42ba451293d7"},{"name":"Busca de anexos de uma solicitação","id":"40a6c8f5-5b81-4e43-81a0-9a253f429d16","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads?protocol={{Número do protocolo}}&pageNumber={{Página}}&pageSize={{Registros por página}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista, de forma paginada, os anexos (arquivos) associados a uma solicitação (protocolo) do Service Desk.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>protocol</code></td>\n<td>Sim</td>\n<td>Número do protocolo (solicitação) cujos anexos serão listados.</td>\n</tr>\n<tr>\n<td><code>pageNumber</code></td>\n<td>Sim</td>\n<td>Número da página de resultados.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>Sim</td>\n<td>Quantidade de registros por página.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>–</td>\n<td>Id do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].title</code></td>\n<td>–</td>\n<td>Título do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].name</code></td>\n<td>–</td>\n<td>Nome do arquivo armazenado.</td>\n</tr>\n<tr>\n<td><code>response.data[].description</code></td>\n<td>–</td>\n<td>Descrição do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].assignmentId</code></td>\n<td>–</td>\n<td>Id interno da solicitação (assignment) à qual o anexo pertence.</td>\n</tr>\n<tr>\n<td><code>response.data[].assignment</code></td>\n<td>–</td>\n<td>Objeto com <code>title</code>, <code>description</code> e <code>assignmentOrigin</code> da solicitação.</td>\n</tr>\n<tr>\n<td><code>response.data[].documentationTypeId</code></td>\n<td>–</td>\n<td>Id do tipo de documentação do anexo, quando houver.</td>\n</tr>\n<tr>\n<td><code>response.data[].documentationType</code></td>\n<td>–</td>\n<td>Objeto com <code>id</code>, <code>code</code> e <code>title</code> do tipo de documentação, ou <code>null</code> quando não houver.</td>\n</tr>\n<tr>\n<td><code>response.data[].dir</code></td>\n<td>–</td>\n<td>Diretório/caminho de armazenamento do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].size</code></td>\n<td>–</td>\n<td>Tamanho do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].mimetype</code></td>\n<td>–</td>\n<td>Tipo MIME do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].validity</code></td>\n<td>–</td>\n<td>Validade do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].clientView</code></td>\n<td>–</td>\n<td>Indica se o anexo é visível ao cliente.</td>\n</tr>\n<tr>\n<td><code>response.data[].begin</code></td>\n<td>–</td>\n<td>Data de início de validade do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].final</code></td>\n<td>–</td>\n<td>Data de fim de validade do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].hasFile</code></td>\n<td>–</td>\n<td>Indica se o anexo possui arquivo associado (<code>name</code> e <code>dir</code> preenchidos).</td>\n</tr>\n<tr>\n<td><code>response.data[].origin</code></td>\n<td>–</td>\n<td>Origem do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].created</code></td>\n<td>–</td>\n<td>Data de criação do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].createdBy</code></td>\n<td>–</td>\n<td>Id do usuário que criou o anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].createdByUser</code></td>\n<td>–</td>\n<td>Objeto com <code>name</code> do usuário que criou o anexo, ou <code>null</code> quando não houver.</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>–</td>\n<td>Total de registros encontrados.</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>–</td>\n<td>Página atual.</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>–</td>\n<td>Quantidade de itens por página.</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>–</td>\n<td>Total de páginas.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>–</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar a \"Upload de anexo em uma solicitação\" (envio) e \"Download de um anexo de uma solicitação\" (download do conteúdo de um anexo listado aqui).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads"],"host":["{{URL}}"],"query":[{"key":"protocol","value":"{{Número do protocolo}}"},{"key":"pageNumber","value":"{{Página}}"},{"key":"pageSize","value":"{{Registros por página}}"}],"variable":[]}},"response":[{"id":"2f701e69-7e37-409e-83cf-dedda9ed4b7b","name":"Busca de anexos de uma solicitação","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/projects/assignmentsuploads?protocol=123&pageNumber=1&pageSize=5","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads"],"query":[{"key":"protocol","value":"123"},{"key":"pageNumber","value":"1"},{"key":"pageSize","value":"5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"40a6c8f5-5b81-4e43-81a0-9a253f429d16"},{"name":"Consultar agendamentos do FSM","id":"8506fda3-a797-4c3a-9f64-d17ac4cb6854","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/fieldservicemanagement/integrations/getschedules?date={{2024-01-01}}&finalDate={{2024-12-09}}&fieldTechnicianTxId={{CPF}}&protocol={{Número do protocolo}}&routingStatus={{Status do agendamento}}&regionCode={{Códgio da região}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca os agendamentos e pré-agendamentos de Field Service Management (FSM), com filtros por data, técnico, protocolo, status de roteirização e região.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li><code>date</code> (data inicial da consulta) é o único parâmetro obrigatório.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>date</code> é obrigatório; sem ele a chamada falha.</li>\n<li>Quando apenas <code>date</code> é informado, retorna todos os agendamentos daquele dia (00:00 a 23:59:59).</li>\n<li>Quando <code>finalDate</code> é informado, a consulta considera o intervalo entre <code>date</code> e <code>finalDate</code> (23:59:59 do dia final), respeitando um máximo de <strong>15 dias</strong> entre as duas datas. <code>finalDate</code> não pode ser anterior a <code>date</code>.</li>\n<li><code>fieldTechnicianTxId</code>, quando informado, filtra os agendamentos de um técnico de FSM: o CPF precisa pertencer a uma pessoa marcada como técnica, vinculada à equipe de field service parametrizada no sistema (equipe essa que precisa existir, estar ativa e não excluída).</li>\n<li><code>protocol</code>, quando informado, filtra os agendamentos de um único protocolo.</li>\n<li><code>regionCode</code>, quando informado, filtra por uma região de FSM que precisa existir, não estar excluída e ser gerenciada pelo FSM (<code>ManagedByFsm</code>), além de ter recurso principal do tipo Ativação e/ou Manutenção.</li>\n<li><code>routingStatus</code>, quando informado, filtra por um status de roteirização válido (ver tabela abaixo).</li>\n<li>Os filtros são combináveis (aplicados em conjunto, não são mutuamente exclusivos).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>date</td>\n<td>query, string (data)</td>\n<td>Sim</td>\n<td>Data inicial da consulta</td>\n</tr>\n<tr>\n<td>finalDate</td>\n<td>query, string (data)</td>\n<td>Não</td>\n<td>Data final da consulta. Intervalo máximo de 15 dias em relação a <code>date</code></td>\n</tr>\n<tr>\n<td>fieldTechnicianTxId</td>\n<td>query, string</td>\n<td>Não</td>\n<td>CPF do técnico de field service</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>query, long</td>\n<td>Não</td>\n<td>Número do protocolo</td>\n</tr>\n<tr>\n<td>routingStatus</td>\n<td>query, int</td>\n<td>Não</td>\n<td>Status de roteirização: <code>0</code> Não Atribuída, <code>1</code> Atribuída, <code>2</code> Pendente, <code>3</code> Sincronizada, <code>4</code> Deslocamento, <code>5</code> Em Atendimento, <code>6</code> Finalizada, <code>7</code> Deslocamento Finalizado, <code>8</code> Improdutivo</td>\n</tr>\n<tr>\n<td>regionCode</td>\n<td>query, string</td>\n<td>Não</td>\n<td>Código da região de FSM</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada sem erro</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].routingStatus</code></td>\n<td>–</td>\n<td>Ver tabela de status acima</td>\n</tr>\n<tr>\n<td><code>response[].activationType</code></td>\n<td>–</td>\n<td><code>true</code> quando o agendamento é de ativação</td>\n</tr>\n<tr>\n<td><code>response[].reservedSkills</code></td>\n<td>–</td>\n<td>Habilidades reservadas para o agendamento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>date</code> não informado</td>\n<td><code>success: false</code>, mensagem \"É obrigatório o parâmetro de data inicial para consulta de agendamentos.\"</td>\n</tr>\n<tr>\n<td><code>date</code>/<code>finalDate</code> em formato inválido</td>\n<td><code>success: false</code>, mensagem \"A data inicial informada está no formato inválido, verifique os campos enviados na requisição.\" (ou \"A data final...\")</td>\n</tr>\n<tr>\n<td><code>finalDate</code> anterior a <code>date</code></td>\n<td><code>success: false</code>, mensagem \"A data final da consulta não pode ser anterior a data inicial.\"</td>\n</tr>\n<tr>\n<td>Intervalo entre <code>date</code> e <code>finalDate</code> maior que 15 dias</td>\n<td><code>success: false</code>, mensagem \"O intervalo entre a data de início e data de fim não pode ser maior do que 15 dias.\"</td>\n</tr>\n<tr>\n<td><code>fieldTechnicianTxId</code> inválido ou sem técnico correspondente</td>\n<td><code>success: false</code>, mensagem \"CPF inválido ou não foi encontrado um técnico para esse CPF.\"</td>\n</tr>\n<tr>\n<td>Equipe de field service não parametrizada no sistema</td>\n<td><code>success: false</code>, mensagem \"Equipe de field service não parametrizada.\"</td>\n</tr>\n<tr>\n<td>Equipe de field service inativa ou excluída</td>\n<td><code>success: false</code>, mensagem \"Equipe de field service inativa ou deletada.\"</td>\n</tr>\n<tr>\n<td>Técnico informado não pertence à equipe de field service</td>\n<td><code>success: false</code>, mensagem \"O técnico não faz parte da equipe de field service.\"</td>\n</tr>\n<tr>\n<td><code>protocol</code> em formato inválido</td>\n<td><code>success: false</code>, mensagem \"O protocolo informado está no formato inválido, verifique os campos enviados na requisição.\"</td>\n</tr>\n<tr>\n<td><code>protocol</code> sem agendamento correspondente</td>\n<td><code>success: false</code>, mensagem \"Protocolo ou agendamento do protocolo não encontrado.\"</td>\n</tr>\n<tr>\n<td><code>regionCode</code> não encontrado ou não gerenciado pelo FSM</td>\n<td><code>success: false</code>, mensagem \"Região de field service não encontrada.\"</td>\n</tr>\n<tr>\n<td><code>regionCode</code> não é do tipo Ativação/Manutenção</td>\n<td><code>success: false</code>, mensagem \"A região de field service informada não é do tipo ativação e/ou manutenção.\"</td>\n</tr>\n<tr>\n<td><code>routingStatus</code> fora dos valores aceitos</td>\n<td><code>success: false</code>, mensagem \"Status de roteirização inválido.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Use \"Busca detalhes da solicitação\" com o <code>protocol</code> retornado aqui para os dados completos da solicitação.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","fieldservicemanagement","integrations","getschedules"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Data inicial da consulta</p>\n","type":"text/plain"},"key":"date","value":"{{2024-01-01}}"},{"description":{"content":"<p>Data final da consulta (Intervalo máximo de 15 dias)</p>\n","type":"text/plain"},"key":"finalDate","value":"{{2024-12-09}}"},{"description":{"content":"<p>Filtro por técnico</p>\n","type":"text/plain"},"key":"fieldTechnicianTxId","value":"{{CPF}}"},{"description":{"content":"<p>Filtro por protocolo</p>\n","type":"text/plain"},"key":"protocol","value":"{{Número do protocolo}}"},{"description":{"content":"<p>Filtro por status de roterização</p>\n","type":"text/plain"},"key":"routingStatus","value":"{{Status do agendamento}}"},{"description":{"content":"<p>Filtro por região de FSM</p>\n","type":"text/plain"},"key":"regionCode","value":"{{Códgio da região}}"}],"variable":[]}},"response":[{"id":"b937bbfd-25da-4cc3-b568-c82e36008818","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json","type":"text"}],"url":{"raw":"{{URL}}:45715/external/fieldservicemanagement/integrations/getschedules?date=2024-01-01&finalDate=2024-01-15&fieldTechnicianTxId=12345678900&protocol=123&routingStatus=0&regionCode=00123","host":["{{URL}}"],"port":"45715","path":["external","fieldservicemanagement","integrations","getschedules"],"query":[{"key":"date","value":"2024-01-01","description":"Data inicial da consulta"},{"key":"finalDate","value":"2024-01-15","description":"Filtro por intervalo de data da consulta (máximo de 15 dias entre data inical e final)"},{"key":"fieldTechnicianTxId","value":"12345678900","description":"Filtro por técnico"},{"key":"protocol","value":"123","description":"Filtro por protocolo"},{"key":"routingStatus","value":"0","description":"Filtro por status de roterização"},{"key":"regionCode","value":"00123","type":"text"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"protocol\": 123,\n            \"shift\": 1,\n            \"beginDate\": \"2024-01-01T08:30:00\",\n            \"endDate\": \"2024-01-11T18:30:00\",\n            \"activationType\": true,\n            \"routingStatus\": 0,\n            \"regionCode\": \"1.02\",\n            \"regionTitle\": \"Atibaia\",\n            \"teamCode\": \"15\",\n            \"teamTitle\": \"Instalação Fibra\",\n            \"reservedSkills\": [\n                \"Instalação\",\n                \"Mudança de endereço\",\n                \"Troca de tecnologia\",\n                \"Fibra - Instalação + Segundo ponto\",\n                \"Fibra - Instalação + Tv\"\n            ],\n            \"fieldTechnicianName\": \"Técnico de teste\",\n            \"fieldTechnicianTxId\": \"12345678900\"\n        },\n        {\n            \"protocol\": 123,\n            \"shift\": 1,\n            \"beginDate\": \"2024-01-03T08:30:00\",\n            \"endDate\": \"2024-01-03T18:30:00\",\n            \"activationType\": true,\n            \"routingStatus\": 0,\n            \"regionCode\": \"1.02\",\n            \"regionTitle\": \"Atibaia\",\n            \"teamCode\": \"15\",\n            \"teamTitle\": \"Instalação Fibra\",\n            \"reservedSkills\": [\n                \"Instalação\",\n                \"Mudança de endereço\",\n                \"Troca de tecnologia\",\n                \"Fibra - Instalação + Segundo ponto\",\n                \"Fibra - Instalação + Tv\"\n            ],\n            \"fieldTechnicianName\": \"Técnico de teste\",\n            \"fieldTechnicianTxId\": \"12345678900\"\n        },\n        {\n            \"protocol\": 123,\n            \"shift\": 1,\n            \"beginDate\": \"2024-01-07T08:30:00\",\n            \"endDate\": \"2024-01-07T18:30:00\",\n            \"activationType\": true,\n            \"routingStatus\": 0,\n            \"regionCode\": \"1.02\",\n            \"regionTitle\": \"Atibaia\",\n            \"teamCode\": \"15\",\n            \"teamTitle\": \"Instalação Fibra\",\n            \"reservedSkills\": [\n                \"Instalação de Câmeras\",\n                \"Suporte Cameras\"\n            ],\n            \"fieldTechnicianName\": \"Técnico de teste\",\n            \"fieldTechnicianTxId\": \"12345678900\"\n        },\n        {\n            \"protocol\": 123,\n            \"shift\": 1,\n            \"beginDate\": \"2024-01-09T08:30:00\",\n            \"endDate\": \"2024-01-09T18:30:00\",\n            \"activationType\": false,\n            \"routingStatus\": 1,\n            \"regionCode\": \"1.02\",\n            \"regionTitle\": \"Atibaia\",\n            \"teamCode\": \"15\",\n            \"teamTitle\": \"Instalação Fibra\",\n            \"reservedSkills\": [\n                \"Troca de cabeamento\",\n                \"Troca de roteador de local\",\n                \"Segundo Ponto\",\n                \"Rompimento\"\n            ],\n            \"fieldTechnicianName\": \"Técnico de teste\",\n            \"fieldTechnicianTxId\": \"12345678900\"\n        },\n        {\n            \"protocol\": 123,\n            \"shift\": 2,\n            \"beginDate\": \"2024-01-11T08:30:00\",\n            \"endDate\": \"2024-01-19T18:30:00\",\n            \"activationType\": true,\n            \"routingStatus\": 1,\n            \"regionCode\": \"1.02\",\n            \"regionTitle\": \"Atibaia\",\n            \"teamCode\": \"15\",\n            \"teamTitle\": \"Instalação Fibra\",\n            \"reservedSkills\": [\n                \"Instalação de Câmeras\",\n                \"Suporte Cameras\"\n            ],\n            \"fieldTechnicianName\": \"Técnico de teste\",\n            \"fieldTechnicianTxId\": \"12345678900\"\n        }\n    ],\n    \"dataResponseType\": \"List<GetSchedulesResponseDto>\",\n    \"elapsedTime\": null\n}"},{"id":"63a71dae-3923-4d29-8923-c8f8ee858151","name":"Erro — intervalo maior que 15 dias","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/fieldservicemanagement/integrations/getschedules?date={{2024-01-01}}&finalDate={{2024-12-09}}&fieldTechnicianTxId={{CPF}}&protocol={{Número do protocolo}}&routingStatus={{Status do agendamento}}&regionCode={{Códgio da região}}","host":["{{URL}}"],"port":"45715","path":["external","fieldservicemanagement","integrations","getschedules"],"query":[{"key":"date","value":"{{2024-01-01}}","description":"Data inicial da consulta"},{"key":"finalDate","value":"{{2024-12-09}}","description":"Data final da consulta (Intervalo máximo de 15 dias)"},{"key":"fieldTechnicianTxId","value":"{{CPF}}","description":"Filtro por técnico"},{"key":"protocol","value":"{{Número do protocolo}}","description":"Filtro por protocolo"},{"key":"routingStatus","value":"{{Status do agendamento}}","description":"Filtro por status de roterização"},{"key":"regionCode","value":"{{Códgio da região}}","description":"Filtro por região de FSM"}]},"description":"## Propósito\nBusca os agendamentos e pré-agendamentos de Field Service Management (FSM), com filtros por data, técnico, protocolo, status de roteirização e região.\n\n## Pré-requisitos\n- `date` (data inicial da consulta) é o único parâmetro obrigatório.\n\n## Regras de negócio\n- `date` é obrigatório; sem ele a chamada falha.\n- Quando apenas `date` é informado, retorna todos os agendamentos daquele dia (00:00 a 23:59:59).\n- Quando `finalDate` é informado, a consulta considera o intervalo entre `date` e `finalDate` (23:59:59 do dia final), respeitando um máximo de **15 dias** entre as duas datas. `finalDate` não pode ser anterior a `date`.\n- `fieldTechnicianTxId`, quando informado, filtra os agendamentos de um técnico de FSM: o CPF precisa pertencer a uma pessoa marcada como técnica, vinculada à equipe de field service parametrizada no sistema (equipe essa que precisa existir, estar ativa e não excluída).\n- `protocol`, quando informado, filtra os agendamentos de um único protocolo.\n- `regionCode`, quando informado, filtra por uma região de FSM que precisa existir, não estar excluída e ser gerenciada pelo FSM (`ManagedByFsm`), além de ter recurso principal do tipo Ativação e/ou Manutenção.\n- `routingStatus`, quando informado, filtra por um status de roteirização válido (ver tabela abaixo).\n- Os filtros são combináveis (aplicados em conjunto, não são mutuamente exclusivos).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| date | query, string (data) | Sim | Data inicial da consulta |\n| finalDate | query, string (data) | Não | Data final da consulta. Intervalo máximo de 15 dias em relação a `date` |\n| fieldTechnicianTxId | query, string | Não | CPF do técnico de field service |\n| protocol | query, long | Não | Número do protocolo |\n| routingStatus | query, int | Não | Status de roteirização: `0` Não Atribuída, `1` Atribuída, `2` Pendente, `3` Sincronizada, `4` Deslocamento, `5` Em Atendimento, `6` Finalizada, `7` Deslocamento Finalizado, `8` Improdutivo |\n| regionCode | query, string | Não | Código da região de FSM |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a chamada foi processada sem erro |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].routingStatus` | – | Ver tabela de status acima |\n| `response[].activationType` | – | `true` quando o agendamento é de ativação |\n| `response[].reservedSkills` | – | Habilidades reservadas para o agendamento |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `date` não informado | `success: false`, mensagem \"É obrigatório o parâmetro de data inicial para consulta de agendamentos.\" |\n| `date`/`finalDate` em formato inválido | `success: false`, mensagem \"A data inicial informada está no formato inválido, verifique os campos enviados na requisição.\" (ou \"A data final...\") |\n| `finalDate` anterior a `date` | `success: false`, mensagem \"A data final da consulta não pode ser anterior a data inicial.\" |\n| Intervalo entre `date` e `finalDate` maior que 15 dias | `success: false`, mensagem \"O intervalo entre a data de início e data de fim não pode ser maior do que 15 dias.\" |\n| `fieldTechnicianTxId` inválido ou sem técnico correspondente | `success: false`, mensagem \"CPF inválido ou não foi encontrado um técnico para esse CPF.\" |\n| Equipe de field service não parametrizada no sistema | `success: false`, mensagem \"Equipe de field service não parametrizada.\" |\n| Equipe de field service inativa ou excluída | `success: false`, mensagem \"Equipe de field service inativa ou deletada.\" |\n| Técnico informado não pertence à equipe de field service | `success: false`, mensagem \"O técnico não faz parte da equipe de field service.\" |\n| `protocol` em formato inválido | `success: false`, mensagem \"O protocolo informado está no formato inválido, verifique os campos enviados na requisição.\" |\n| `protocol` sem agendamento correspondente | `success: false`, mensagem \"Protocolo ou agendamento do protocolo não encontrado.\" |\n| `regionCode` não encontrado ou não gerenciado pelo FSM | `success: false`, mensagem \"Região de field service não encontrada.\" |\n| `regionCode` não é do tipo Ativação/Manutenção | `success: false`, mensagem \"A região de field service informada não é do tipo ativação e/ou manutenção.\" |\n| `routingStatus` fora dos valores aceitos | `success: false`, mensagem \"Status de roteirização inválido.\" |\n\n## Fluxo relacionado\n- Use \"Busca detalhes da solicitação\" com o `protocol` retornado aqui para os dados completos da solicitação."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"type\": 3,\n            \"message\": \"O intervalo entre a data de início e data de fim não pode ser maior do que 15 dias.\",\n            \"code\": null\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"8506fda3-a797-4c3a-9f64-d17ac4cb6854"}],"id":"e7ccdc5e-0092-4d90-ab41-62c89ecadbdc","_postman_id":"e7ccdc5e-0092-4d90-ab41-62c89ecadbdc","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Materials","item":[{"name":"Lista de produtos alocados em uma solicitação","id":"7d844f56-00e3-c5ef-be63-84176625dfb0","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna a lista de produtos (itens de estoque, não patrimoniados) atualmente alocados a uma solicitação (protocolo), com a quantidade reservada e a unidade de medida.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n<li><code>assignmentId</code> de uma solicitação existente.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>assignmentId</code> é obrigatório e deve ser maior que zero.</li>\n<li>Retorna apenas produtos com quantidade alocada maior que zero.</li>\n<li>O endpoint não valida se a solicitação existe: se o <code>assignmentId</code> informado não tiver nenhum produto alocado (por não existir ou por não ter produtos), a resposta é um sucesso com lista vazia.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>assignmentId</code></td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id da solicitação (protocolo) da qual se deseja listar os produtos alocados</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>long</td>\n<td>Id do produto (item de estoque)</td>\n</tr>\n<tr>\n<td><code>response[].description</code></td>\n<td>string</td>\n<td>Descrição/título do produto</td>\n</tr>\n<tr>\n<td><code>response[].type</code></td>\n<td>string</td>\n<td>Tipo do produto — um de: <code>Produto</code>, <code>Serviço</code>, <code>Interno</code>, <code>Matéria-prima</code>, <code>Subprodutos</code></td>\n</tr>\n<tr>\n<td><code>response[].units</code></td>\n<td>number</td>\n<td>Quantidade alocada na solicitação</td>\n</tr>\n<tr>\n<td><code>response[].unitMeasure</code></td>\n<td>string</td>\n<td>Símbolo da unidade de medida do produto (ex.: <code>UN</code>, <code>MT</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> não informado ou menor/igual a zero</td>\n<td><code>success: false</code>, mensagem \"Identificador da solicitação não informado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Endpoint de consulta complementar aos demais endpoints de materiais da solicitação: <em>Aloca um produto em uma solicitação</em> e <em>Efetiva um produto em uma solicitação</em> (pasta Service Desk &gt; Materials).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"c1f1f25f-8974-f141-9229-ea8c4f31620b","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nRetorna a lista de produtos (itens de estoque, não patrimoniados) atualmente alocados a uma solicitação (protocolo), com a quantidade reservada e a unidade de medida.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- `assignmentId` de uma solicitação existente.\n\n## Regras de negócio\n- `assignmentId` é obrigatório e deve ser maior que zero.\n- Retorna apenas produtos com quantidade alocada maior que zero.\n- O endpoint não valida se a solicitação existe: se o `assignmentId` informado não tiver nenhum produto alocado (por não existir ou por não ter produtos), a resposta é um sucesso com lista vazia.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Tipo | Obrigatório | Descrição |\n|---|---|---|---|---|\n| `assignmentId` | Query string | long | Sim | Id da solicitação (protocolo) da qual se deseja listar os produtos alocados |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | long | Id do produto (item de estoque) |\n| `response[].description` | string | Descrição/título do produto |\n| `response[].type` | string | Tipo do produto — um de: `Produto`, `Serviço`, `Interno`, `Matéria-prima`, `Subprodutos` |\n| `response[].units` | number | Quantidade alocada na solicitação |\n| `response[].unitMeasure` | string | Símbolo da unidade de medida do produto (ex.: `UN`, `MT`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `assignmentId` não informado ou menor/igual a zero | `success: false`, mensagem \"Identificador da solicitação não informado.\" |\n\n## Fluxo relacionado\nEndpoint de consulta complementar aos demais endpoints de materiais da solicitação: *Aloca um produto em uma solicitação* e *Efetiva um produto em uma solicitação* (pasta Service Desk > Materials)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 501,\n            \"description\": \"Roteador Wi-Fi 6\",\n            \"type\": \"Produto\",\n            \"units\": 2,\n            \"unitMeasure\": \"UN\"\n        },\n        {\n            \"id\": 618,\n            \"description\": \"Cabo de rede Cat6 - 100m\",\n            \"type\": \"Matéria-prima\",\n            \"units\": 1,\n            \"unitMeasure\": \"RL\"\n        }\n    ],\n    \"elapsedTime\": null\n}"},{"id":"0538a499-362a-4682-afe8-b0e4d850f667","name":"Erro - identificador da solicitação não informado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nRetorna a lista de produtos (itens de estoque, não patrimoniados) atualmente alocados a uma solicitação (protocolo), com a quantidade reservada e a unidade de medida.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- `assignmentId` de uma solicitação existente.\n\n## Regras de negócio\n- `assignmentId` é obrigatório e deve ser maior que zero.\n- Retorna apenas produtos com quantidade alocada maior que zero.\n- O endpoint não valida se a solicitação existe: se o `assignmentId` informado não tiver nenhum produto alocado (por não existir ou por não ter produtos), a resposta é um sucesso com lista vazia.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Tipo | Obrigatório | Descrição |\n|---|---|---|---|---|\n| `assignmentId` | Query string | long | Sim | Id da solicitação (protocolo) da qual se deseja listar os produtos alocados |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | long | Id do produto (item de estoque) |\n| `response[].description` | string | Descrição/título do produto |\n| `response[].type` | string | Tipo do produto — um de: `Produto`, `Serviço`, `Interno`, `Matéria-prima`, `Subprodutos` |\n| `response[].units` | number | Quantidade alocada na solicitação |\n| `response[].unitMeasure` | string | Símbolo da unidade de medida do produto (ex.: `UN`, `MT`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `assignmentId` não informado ou menor/igual a zero | `success: false`, mensagem \"Identificador da solicitação não informado.\" |\n\n## Fluxo relacionado\nEndpoint de consulta complementar aos demais endpoints de materiais da solicitação: *Aloca um produto em uma solicitação* e *Efetiva um produto em uma solicitação* (pasta Service Desk > Materials)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Identificador da solicitação não informado.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"7d844f56-00e3-c5ef-be63-84176625dfb0"},{"name":"Aloca um produto em uma solicitação","id":"43a18693-138a-4add-1f07-2485a342311e","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0,\n    \"units\": 0\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Reserva (aloca) uma quantidade de um produto do catálogo para uma solicitação (protocolo) do Service Desk, debitando a quantidade do estoque disponível do responsável pela solicitação. Não fatura nem gera nota fiscal — a fatura ocorre na efetivação.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> (query)</td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo. Deve ser maior que 0.</td>\n</tr>\n<tr>\n<td><code>id</code></td>\n<td>Sim</td>\n<td>Id do produto no catálogo de serviços. Deve ser maior que 0.</td>\n</tr>\n<tr>\n<td><code>units</code></td>\n<td>Sim</td>\n<td>Quantidade de unidades a alocar. Deve ser maior que 0.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A solicitação precisa existir, ter um responsável vinculado, e não pode estar encerrada ou cancelada.</li>\n<li>É necessário haver saldo disponível (<code>units</code> solicitadas) no estoque do <strong>responsável pela solicitação</strong> — não é o estoque geral do produto.</li>\n<li>Não há checagem de \"já alocado antes\": chamar de novo simplesmente aloca mais uma quantidade, consumindo mais estoque (se houver saldo disponível).</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em <code>messages</code>. Confirmado em código-fonte: sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Solicitação não encontrada</td>\n<td>\"Solicitação {id} não encontrada.\"</td>\n</tr>\n<tr>\n<td>Solicitação sem responsável vinculado</td>\n<td>\"Solicitação {id} não possui responsável vinculado.\"</td>\n</tr>\n<tr>\n<td>Solicitação encerrada ou cancelada</td>\n<td>\"Solicitação {id} encerrada/cancelada, impossível de alocar produtos nela.\"</td>\n</tr>\n<tr>\n<td>Saldo insuficiente no estoque do responsável</td>\n<td>\"Produto {id} não disponível ou com saldo insuficiente no estoque do responsável.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima — o resultado (sucesso/erro) vem no corpo da resposta.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Passo 1 de um fluxo de duas etapas: alocar (este endpoint) → \"Efetiva um produto em uma solicitação\" (que fatura tudo o que estiver pendente).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"38e0c560-27f4-4587-7749-40e5db1cb061","name":"Aloca um produto em uma solicitação","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0,\n    \"units\": 0\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nReserva (aloca) uma quantidade de um produto do catálogo para uma solicitação (protocolo) do Service Desk, debitando a quantidade do estoque disponível do responsável pela solicitação. Não fatura nem gera nota fiscal — a fatura ocorre na efetivação.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `assignmentId` (query) | Sim | Id da solicitação/protocolo. Deve ser maior que 0. |\n| `id` | Sim | Id do produto no catálogo de serviços. Deve ser maior que 0. |\n| `units` | Sim | Quantidade de unidades a alocar. Deve ser maior que 0. |\n\n## Regras de negócio\n- A solicitação precisa existir, ter um responsável vinculado, e não pode estar encerrada ou cancelada.\n- É necessário haver saldo disponível (`units` solicitadas) no estoque do **responsável pela solicitação** — não é o estoque geral do produto.\n- Não há checagem de \"já alocado antes\": chamar de novo simplesmente aloca mais uma quantidade, consumindo mais estoque (se houver saldo disponível).\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi realizada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em `messages`. Confirmado em código-fonte: sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Solicitação não encontrada | \"Solicitação {id} não encontrada.\" |\n| Solicitação sem responsável vinculado | \"Solicitação {id} não possui responsável vinculado.\" |\n| Solicitação encerrada ou cancelada | \"Solicitação {id} encerrada/cancelada, impossível de alocar produtos nela.\" |\n| Saldo insuficiente no estoque do responsável | \"Produto {id} não disponível ou com saldo insuficiente no estoque do responsável.\" |\n\n> O status HTTP é sempre 200, inclusive nos erros acima — o resultado (sucesso/erro) vem no corpo da resposta.\n\n## Fluxo relacionado\nPasso 1 de um fluxo de duas etapas: alocar (este endpoint) → \"Efetiva um produto em uma solicitação\" (que fatura tudo o que estiver pendente)."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Produto adicionado na solicitação\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"43a18693-138a-4add-1f07-2485a342311e"},{"name":"Efetiva um produto em uma solicitação","id":"514f602c-720f-5cf8-c247-9e7213d0de0b","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products/effetive?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Efetiva (fatura) todos os produtos alocados e ainda pendentes de uma solicitação, gerando a nota fiscal/romaneio de consumo correspondente. Não recebe corpo de requisição.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> (query)</td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Efetiva <strong>todos</strong> os produtos pendentes da solicitação de uma só vez — não é possível efetivar parcialmente ou escolher quais produtos.</li>\n<li>Um produto já efetivado (com nota fiscal emitida) não entra novamente nesse processo.</li>\n<li>A solicitação precisa existir e não pode estar encerrada ou cancelada.</li>\n</ul>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Dispara a emissão automática de nota fiscal/romaneio de consumo para os produtos efetivados — é o gatilho fiscal do material usado na solicitação.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em <code>messages</code>. Confirmado em código-fonte: sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum produto pendente (nada foi alocado, ou tudo já foi efetivado antes)</td>\n<td>\"Nenhum produto pendente vinculado a esta solicitação.\"</td>\n</tr>\n<tr>\n<td>Solicitação não encontrada</td>\n<td>\"Solicitação {id} não encontrada.\"</td>\n</tr>\n<tr>\n<td>Solicitação encerrada ou cancelada</td>\n<td>\"Solicitação {id} encerrada/cancelada, impossível efetivar produtos nela.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Passo 2 do fluxo: \"Aloca um produto em uma solicitação\" → este endpoint.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products","effetive"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"2a5c269a-7694-253e-feb9-df654eefa67d","name":"Efetiva um produto em uma solicitação","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/products/effetive?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","products","effetive"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nEfetiva (fatura) todos os produtos alocados e ainda pendentes de uma solicitação, gerando a nota fiscal/romaneio de consumo correspondente. Não recebe corpo de requisição.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `assignmentId` (query) | Sim | Id da solicitação/protocolo. |\n\n## Regras de negócio\n- Efetiva **todos** os produtos pendentes da solicitação de uma só vez — não é possível efetivar parcialmente ou escolher quais produtos.\n- Um produto já efetivado (com nota fiscal emitida) não entra novamente nesse processo.\n- A solicitação precisa existir e não pode estar encerrada ou cancelada.\n\n## Efeitos colaterais\n- Dispara a emissão automática de nota fiscal/romaneio de consumo para os produtos efetivados — é o gatilho fiscal do material usado na solicitação.\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi realizada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em `messages`. Confirmado em código-fonte: sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Nenhum produto pendente (nada foi alocado, ou tudo já foi efetivado antes) | \"Nenhum produto pendente vinculado a esta solicitação.\" |\n| Solicitação não encontrada | \"Solicitação {id} não encontrada.\" |\n| Solicitação encerrada ou cancelada | \"Solicitação {id} encerrada/cancelada, impossível efetivar produtos nela.\" |\n\n> O status HTTP é sempre 200, inclusive nos erros acima.\n\n## Fluxo relacionado\nPasso 2 do fluxo: \"Aloca um produto em uma solicitação\" → este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Patrimonios efetivados com sucesso\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"514f602c-720f-5cf8-c247-9e7213d0de0b"},{"name":"Aloca um patrimônio em uma solicitação","id":"b914d487-f53f-69fd-0cf0-1bdcecfe9161","request":{"method":"POST","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"patrimonyIds\": [\n        12,\n        32\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Aloca um ou mais patrimônios (equipamentos) para uma solicitação do Service Desk. Os patrimônios precisam já ter sido remetidos (romaneio de saída com nota fiscal emitida) ao técnico responsável antes de poderem ser alocados.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> (query)</td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo.</td>\n</tr>\n<tr>\n<td><code>patrimonyIds</code></td>\n<td>Sim</td>\n<td>Lista de Ids dos patrimônios a alocar. Processados um a um — se um item falhar, o processo para naquele item.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A solicitação precisa existir, ter responsável vinculado, e não pode estar encerrada ou cancelada.</li>\n<li>Cada patrimônio precisa ter uma movimentação de envio (romaneio de saída) com nota fiscal emitida — ou seja, precisa já ter sido enviado ao técnico responsável antes.</li>\n<li>A solicitação precisa possuir etiqueta, ponto de acesso e site vinculados.</li>\n<li>O usuário/integração precisa ter permissão de uso de romaneio.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em <code>messages</code>. Confirmado em código-fonte: sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Solicitação não encontrada/sem responsável/encerrada ou cancelada</td>\n<td>mesmas mensagens do endpoint \"Aloca um produto em uma solicitação\"</td>\n</tr>\n<tr>\n<td>Movimentação de envio não encontrada</td>\n<td>\"Movimentação de envio não encontrada.\"</td>\n</tr>\n<tr>\n<td>Nota fiscal de saída não emitida</td>\n<td>\"Impossível vincular objeto. Verifique a nota de envio para o técnico.\"</td>\n</tr>\n<tr>\n<td>Sem permissão de uso de romaneio</td>\n<td>\"Permissão negada. Você não tem autorização para realizar esta ação.\"</td>\n</tr>\n<tr>\n<td>Solicitação sem etiqueta/ponto de acesso/site</td>\n<td>\"Ação abortada. A solicitação não possui uma etiqueta, um ponto de acesso e um site.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Passo 1 de um fluxo de duas etapas: alocar (este endpoint) → \"Efetiva um patrimônio em uma solicitação\". Ver também \"Retorna um patrimônio alocado a uma solicitação\" para devolução sem efetivação.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"1f125813-a7f3-02d8-bb09-6b5c83a1fdc7","name":"Aloca um patrimônio em uma solicitação","originalRequest":{"method":"POST","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"patrimonyIds\": [\n        12,\n        32\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nAloca um ou mais patrimônios (equipamentos) para uma solicitação do Service Desk. Os patrimônios precisam já ter sido remetidos (romaneio de saída com nota fiscal emitida) ao técnico responsável antes de poderem ser alocados.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `assignmentId` (query) | Sim | Id da solicitação/protocolo. |\n| `patrimonyIds` | Sim | Lista de Ids dos patrimônios a alocar. Processados um a um — se um item falhar, o processo para naquele item. |\n\n## Regras de negócio\n- A solicitação precisa existir, ter responsável vinculado, e não pode estar encerrada ou cancelada.\n- Cada patrimônio precisa ter uma movimentação de envio (romaneio de saída) com nota fiscal emitida — ou seja, precisa já ter sido enviado ao técnico responsável antes.\n- A solicitação precisa possuir etiqueta, ponto de acesso e site vinculados.\n- O usuário/integração precisa ter permissão de uso de romaneio.\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi realizada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em `messages`. Confirmado em código-fonte: sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Solicitação não encontrada/sem responsável/encerrada ou cancelada | mesmas mensagens do endpoint \"Aloca um produto em uma solicitação\" |\n| Movimentação de envio não encontrada | \"Movimentação de envio não encontrada.\" |\n| Nota fiscal de saída não emitida | \"Impossível vincular objeto. Verifique a nota de envio para o técnico.\" |\n| Sem permissão de uso de romaneio | \"Permissão negada. Você não tem autorização para realizar esta ação.\" |\n| Solicitação sem etiqueta/ponto de acesso/site | \"Ação abortada. A solicitação não possui uma etiqueta, um ponto de acesso e um site.\" |\n\n> O status HTTP é sempre 200, inclusive nos erros acima.\n\n## Fluxo relacionado\nPasso 1 de um fluxo de duas etapas: alocar (este endpoint) → \"Efetiva um patrimônio em uma solicitação\". Ver também \"Retorna um patrimônio alocado a uma solicitação\" para devolução sem efetivação."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Patrimonios alocados com sucesso\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"b914d487-f53f-69fd-0cf0-1bdcecfe9161"},{"name":"Efetiva um patrimônio em uma solicitação","id":"df6553be-cd94-7c37-f184-de9a305c1ab8","request":{"method":"POST","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies/effetive?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Efetiva (fatura) todos os patrimônios alocados e ainda pendentes de uma solicitação, gerando a nota fiscal correspondente. Não recebe corpo de requisição.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> (query)</td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Efetiva <strong>todos</strong> os patrimônios pendentes da solicitação de uma só vez — não é possível efetivar parcialmente.</li>\n<li>Um patrimônio já efetivado não entra novamente nesse processo.</li>\n<li>A solicitação precisa existir e não pode estar encerrada ou cancelada.</li>\n</ul>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Gera nota fiscal para os patrimônios efetivados; se a solicitação estiver vinculada a um contrato de cliente (via etiqueta de serviço do contrato), também gera remessa fiscal ao cliente.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em <code>messages</code>. Confirmado em código-fonte: sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum patrimônio pendente para efetivar</td>\n<td>\"Nenhum patrimônio pendente vinculado a esta Solicitação.\"</td>\n</tr>\n<tr>\n<td>Solicitação não encontrada/encerrada/cancelada</td>\n<td>mesmas mensagens dos demais endpoints deste módulo</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Passo 2 do fluxo: \"Aloca um patrimônio em uma solicitação\" → este endpoint.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies","effetive"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"01895929-ab6d-6b9d-9a5c-736a0c0a6c4f","name":"Efetiva um patrimônio em uma solicitação","originalRequest":{"method":"POST","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies/effetive?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies","effetive"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nEfetiva (fatura) todos os patrimônios alocados e ainda pendentes de uma solicitação, gerando a nota fiscal correspondente. Não recebe corpo de requisição.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `assignmentId` (query) | Sim | Id da solicitação/protocolo. |\n\n## Regras de negócio\n- Efetiva **todos** os patrimônios pendentes da solicitação de uma só vez — não é possível efetivar parcialmente.\n- Um patrimônio já efetivado não entra novamente nesse processo.\n- A solicitação precisa existir e não pode estar encerrada ou cancelada.\n\n## Efeitos colaterais\n- Gera nota fiscal para os patrimônios efetivados; se a solicitação estiver vinculada a um contrato de cliente (via etiqueta de serviço do contrato), também gera remessa fiscal ao cliente.\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi realizada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em `messages`. Confirmado em código-fonte: sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Nenhum patrimônio pendente para efetivar | \"Nenhum patrimônio pendente vinculado a esta Solicitação.\" |\n| Solicitação não encontrada/encerrada/cancelada | mesmas mensagens dos demais endpoints deste módulo |\n\n> O status HTTP é sempre 200, inclusive nos erros acima.\n\n## Fluxo relacionado\nPasso 2 do fluxo: \"Aloca um patrimônio em uma solicitação\" → este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Patrimonios efetivados com sucesso\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"df6553be-cd94-7c37-f184-de9a305c1ab8"},{"name":"Retorna um patrimônio alocado a uma solicitação","id":"ee5f0536-ee9c-5eaf-2e62-6100973ab2d4","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"devolutionType\": 2,\n    \"patrimonyId\": 19820\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies/return?assignmentId=1234","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Registra a devolução de um patrimônio previamente alocado a uma solicitação, sem efetivá-lo (uso alternativo a \"Efetiva um patrimônio em uma solicitação\").</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> (query)</td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo.</td>\n</tr>\n<tr>\n<td><code>patrimonyId</code></td>\n<td>Sim</td>\n<td>Id do patrimônio a devolver.</td>\n</tr>\n<tr>\n<td><code>devolutionType</code></td>\n<td>Sim</td>\n<td>Tipo de devolução. Valores aceitos por este endpoint: <code>1</code> (devolução para a empresa) ou <code>2</code> (devolução para o técnico).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A solicitação precisa existir, ter responsável vinculado, não pode estar encerrada/cancelada, e precisa ter vínculo com cliente, site e ponto de acesso.</li>\n<li>O patrimônio precisa pertencer ao mesmo cliente/site/ponto de acesso da solicitação.</li>\n<li>O patrimônio não pode já ter sido devolvido anteriormente.</li>\n</ul>\n<blockquote>\n<p><strong>A confirmar com o time de backend:</strong> o domínio também define um terceiro valor de <code>devolutionType</code> (<code>3</code>, devolução por extravio), mas este endpoint atualmente rejeita qualquer valor diferente de <code>1</code>/<code>2</code>. Não documentamos o <code>3</code> como aceito até confirmar se essa restrição é intencional.</p>\n</blockquote>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Gera nota fiscal de retorno (para cliente/site ou movimentação de estrutura, dependendo do destino).</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em <code>messages</code>. Confirmado em código-fonte: sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>devolutionType</code> diferente de 1 ou 2</td>\n<td>\"Tipo de devolução inválido. Use 1 (empresa) ou 2 (técnico).\"</td>\n</tr>\n<tr>\n<td>Solicitação sem vínculo de cliente/site/ponto de acesso</td>\n<td>\"Solicitação {id} não possui vinculo com cliente/site/ponto de acesso.\"</td>\n</tr>\n<tr>\n<td>Patrimônio não encontrado</td>\n<td>\"Patrimônio {id} não encontrado.\"</td>\n</tr>\n<tr>\n<td>Patrimônio de cliente/site/ponto de acesso diferente do da solicitação</td>\n<td>mensagem específica por caso</td>\n</tr>\n<tr>\n<td>Patrimônio já devolvido</td>\n<td>\"Patrimônio {id} já foi devolvido.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Alternativa a \"Efetiva um patrimônio em uma solicitação\" quando o patrimônio alocado não será utilizado.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies","return"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"1234"}],"variable":[]}},"response":[{"id":"00a8ba6e-dd8a-2a4f-9b53-fdd600ac9057","name":"Retorna um patrimônio alocado a uma solicitação","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"devolutionType\": 2,\n    \"patrimonyId\": 19820\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/material/patrimonies/return?assignmentId=1234","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","material","patrimonies","return"],"query":[{"key":"assignmentId","value":"1234"}]},"description":"## Propósito\nRegistra a devolução de um patrimônio previamente alocado a uma solicitação, sem efetivá-lo (uso alternativo a \"Efetiva um patrimônio em uma solicitação\").\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `assignmentId` (query) | Sim | Id da solicitação/protocolo. |\n| `patrimonyId` | Sim | Id do patrimônio a devolver. |\n| `devolutionType` | Sim | Tipo de devolução. Valores aceitos por este endpoint: `1` (devolução para a empresa) ou `2` (devolução para o técnico). |\n\n## Regras de negócio\n- A solicitação precisa existir, ter responsável vinculado, não pode estar encerrada/cancelada, e precisa ter vínculo com cliente, site e ponto de acesso.\n- O patrimônio precisa pertencer ao mesmo cliente/site/ponto de acesso da solicitação.\n- O patrimônio não pode já ter sido devolvido anteriormente.\n\n> **A confirmar com o time de backend:** o domínio também define um terceiro valor de `devolutionType` (`3`, devolução por extravio), mas este endpoint atualmente rejeita qualquer valor diferente de `1`/`2`. Não documentamos o `3` como aceito até confirmar se essa restrição é intencional.\n\n## Efeitos colaterais\n- Gera nota fiscal de retorno (para cliente/site ou movimentação de estrutura, dependendo do destino).\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi realizada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Este endpoint não retorna dados estruturados — apenas o ack de sucesso/erro em `messages`. Confirmado em código-fonte: sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `devolutionType` diferente de 1 ou 2 | \"Tipo de devolução inválido. Use 1 (empresa) ou 2 (técnico).\" |\n| Solicitação sem vínculo de cliente/site/ponto de acesso | \"Solicitação {id} não possui vinculo com cliente/site/ponto de acesso.\" |\n| Patrimônio não encontrado | \"Patrimônio {id} não encontrado.\" |\n| Patrimônio de cliente/site/ponto de acesso diferente do da solicitação | mensagem específica por caso |\n| Patrimônio já devolvido | \"Patrimônio {id} já foi devolvido.\" |\n\n> O status HTTP é sempre 200, inclusive nos erros acima.\n\n## Fluxo relacionado\nAlternativa a \"Efetiva um patrimônio em uma solicitação\" quando o patrimônio alocado não será utilizado."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Patrimonio retornado com sucesso.\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"ee5f0536-ee9c-5eaf-2e62-6100973ab2d4"}],"id":"324a77c7-9436-3cd8-d891-345fe8e65286","_postman_id":"324a77c7-9436-3cd8-d891-345fe8e65286","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Encaminhamento","item":[{"name":"Listar equipes para encaminhamento","id":"85172bd1-f514-413f-9ec8-1978189cb327","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/teams?assignmentId=123","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna as equipes disponíveis para encaminhar (redirecionar) uma solicitação para outra equipe ou, quando permitido, diretamente para um atendente específico.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n<li><code>assignmentId</code> de uma solicitação existente, ainda não encerrada/cancelada.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>assignmentId</code> é obrigatório e deve ser maior que zero.</li>\n<li>A solicitação deve existir e não pode estar encerrada ou cancelada — caso contrário, o endpoint recusa a consulta.</li>\n<li>Se o responsável atual da solicitação for o gerente da equipe atual dela, a resposta traz <strong>todas</strong> as equipes ativas do tenant.</li>\n<li>Caso contrário, a resposta traz apenas as equipes configuradas como destino de encaminhamento a partir da equipe atual da solicitação, e somente as equipes ativas que atendem o tipo de solicitação (incidentType) atual.</li>\n<li><code>allowDirectRouting</code> indica se é permitido encaminhar diretamente para uma pessoa (atendente) daquela equipe, em vez de só para a equipe; a equipe atual da solicitação sempre vem com <code>allowDirectRouting: true</code>.</li>\n<li>A lista <code>people</code> só vem preenchida quando <code>allowDirectRouting</code> é <code>true</code>; caso contrário vem <code>null</code>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>assignmentId</code></td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id da solicitação (protocolo) a ser encaminhada</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>long</td>\n<td>Id da equipe.</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome da equipe.</td>\n</tr>\n<tr>\n<td><code>response[].allowDirectRouting</code></td>\n<td>boolean</td>\n<td>Indica se é possível encaminhar diretamente para um integrante desta equipe.</td>\n</tr>\n<tr>\n<td><code>response[].people</code></td>\n<td>array|null</td>\n<td>Integrantes da equipe (<code>id</code>, <code>name</code>) — só preenchido quando <code>allowDirectRouting</code> é <code>true</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code> não informado ou menor/igual a zero</td>\n<td><code>success: false</code>, mensagem \"Identificador da solicitação não informado.\"</td>\n</tr>\n<tr>\n<td>Solicitação não encontrada</td>\n<td><code>success: false</code>, mensagem \"Solicitação {assignmentId} não encontrada.\"</td>\n</tr>\n<tr>\n<td>Solicitação já encerrada ou cancelada</td>\n<td><code>success: false</code>, mensagem \"Solicitação {assignmentId} já encerrada/cancelada.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use em conjunto com <em>Listar status para encaminhamento</em> e <em>Listar motivos para encaminhamento</em> para montar o payload de <em>Encaminhar solicitação para equipe/atendente</em>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","teams"],"host":["{{URL}}"],"query":[{"key":"assignmentId","value":"123"}],"variable":[]}},"response":[{"id":"d9281de2-3c2d-4a82-a7f2-3a10a092842b","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/teams?assignmentId=123","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","teams"],"query":[{"key":"assignmentId","value":"123"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 1,\n            \"title\": \"Equipe 1\",\n            \"allowDirectRouting\": true,\n            \"people\": [\n                {\n                    \"id\": 1,\n                    \"name\": \"Joao\"\n                }\n            ]\n        },\n        {\n            \"id\": 2,\n            \"title\": \"Equipe 2\",\n            \"allowDirectRouting\": false,\n            \"people\": null\n        },\n        {\n            \"id\": 3,\n            \"title\": \"Equipe 3\",\n            \"allowDirectRouting\": true,\n            \"people\": [\n                {\n                    \"id\": 1,\n                    \"name\": \"Joao\"\n                }\n            ]\n        }\n    ],\n    \"elapsedTime\": null\n}"},{"id":"08fd672b-a80a-432c-b0ce-0056efeb937a","name":"Erro - solicitação não encontrada","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/teams?assignmentId=123","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","teams"],"query":[{"key":"assignmentId","value":"123"}]},"description":"## Propósito\nRetorna as equipes disponíveis para encaminhar (redirecionar) uma solicitação para outra equipe ou, quando permitido, diretamente para um atendente específico.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- `assignmentId` de uma solicitação existente, ainda não encerrada/cancelada.\n\n## Regras de negócio\n- `assignmentId` é obrigatório e deve ser maior que zero.\n- A solicitação deve existir e não pode estar encerrada ou cancelada — caso contrário, o endpoint recusa a consulta.\n- Se o responsável atual da solicitação for o gerente da equipe atual dela, a resposta traz **todas** as equipes ativas do tenant.\n- Caso contrário, a resposta traz apenas as equipes configuradas como destino de encaminhamento a partir da equipe atual da solicitação, e somente as equipes ativas que atendem o tipo de solicitação (incidentType) atual.\n- `allowDirectRouting` indica se é permitido encaminhar diretamente para uma pessoa (atendente) daquela equipe, em vez de só para a equipe; a equipe atual da solicitação sempre vem com `allowDirectRouting: true`.\n- A lista `people` só vem preenchida quando `allowDirectRouting` é `true`; caso contrário vem `null`.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Tipo | Obrigatório | Descrição |\n|---|---|---|---|---|\n| `assignmentId` | Query string | long | Sim | Id da solicitação (protocolo) a ser encaminhada |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | long | Id da equipe. |\n| `response[].title` | string | Nome da equipe. |\n| `response[].allowDirectRouting` | boolean | Indica se é possível encaminhar diretamente para um integrante desta equipe. |\n| `response[].people` | array\\|null | Integrantes da equipe (`id`, `name`) — só preenchido quando `allowDirectRouting` é `true`. |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `assignmentId` não informado ou menor/igual a zero | `success: false`, mensagem \"Identificador da solicitação não informado.\" |\n| Solicitação não encontrada | `success: false`, mensagem \"Solicitação {assignmentId} não encontrada.\" |\n| Solicitação já encerrada ou cancelada | `success: false`, mensagem \"Solicitação {assignmentId} já encerrada/cancelada.\" |\n\n## Fluxo relacionado\nUse em conjunto com *Listar status para encaminhamento* e *Listar motivos para encaminhamento* para montar o payload de *Encaminhar solicitação para equipe/atendente*."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Solicitação 123 não encontrada.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"ae1229c0-83c3-4256-b097-328c5daa996f","name":"Erro - solicitação já encerrada/cancelada","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/teams?assignmentId=123","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","teams"],"query":[{"key":"assignmentId","value":"123"}]},"description":"## Propósito\nRetorna as equipes disponíveis para encaminhar (redirecionar) uma solicitação para outra equipe ou, quando permitido, diretamente para um atendente específico.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- `assignmentId` de uma solicitação existente, ainda não encerrada/cancelada.\n\n## Regras de negócio\n- `assignmentId` é obrigatório e deve ser maior que zero.\n- A solicitação deve existir e não pode estar encerrada ou cancelada — caso contrário, o endpoint recusa a consulta.\n- Se o responsável atual da solicitação for o gerente da equipe atual dela, a resposta traz **todas** as equipes ativas do tenant.\n- Caso contrário, a resposta traz apenas as equipes configuradas como destino de encaminhamento a partir da equipe atual da solicitação, e somente as equipes ativas que atendem o tipo de solicitação (incidentType) atual.\n- `allowDirectRouting` indica se é permitido encaminhar diretamente para uma pessoa (atendente) daquela equipe, em vez de só para a equipe; a equipe atual da solicitação sempre vem com `allowDirectRouting: true`.\n- A lista `people` só vem preenchida quando `allowDirectRouting` é `true`; caso contrário vem `null`.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Tipo | Obrigatório | Descrição |\n|---|---|---|---|---|\n| `assignmentId` | Query string | long | Sim | Id da solicitação (protocolo) a ser encaminhada |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | long | Id da equipe. |\n| `response[].title` | string | Nome da equipe. |\n| `response[].allowDirectRouting` | boolean | Indica se é possível encaminhar diretamente para um integrante desta equipe. |\n| `response[].people` | array\\|null | Integrantes da equipe (`id`, `name`) — só preenchido quando `allowDirectRouting` é `true`. |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `assignmentId` não informado ou menor/igual a zero | `success: false`, mensagem \"Identificador da solicitação não informado.\" |\n| Solicitação não encontrada | `success: false`, mensagem \"Solicitação {assignmentId} não encontrada.\" |\n| Solicitação já encerrada ou cancelada | `success: false`, mensagem \"Solicitação {assignmentId} já encerrada/cancelada.\" |\n\n## Fluxo relacionado\nUse em conjunto com *Listar status para encaminhamento* e *Listar motivos para encaminhamento* para montar o payload de *Encaminhar solicitação para equipe/atendente*."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Solicitação 123 já encerrada/cancelada.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"85172bd1-f514-413f-9ec8-1978189cb327"},{"name":"Listar status para encaminhamento","id":"222e7a88-1044-4edc-8e2e-3c9d0bf1bd7e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/incident-status","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os status de solicitação disponíveis para serem informados ao encaminhar uma solicitação para outra equipe/atendente (campo <code>incidentStatusId</code> do endpoint de encaminhamento).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas status ativos e não excluídos.</li>\n<li>Não retorna os status conclusivos do fluxo de atendimento (por exemplo, fechado, encerrado, cancelado e aguardando classificação) — esses não fazem sentido como destino de um encaminhamento.</li>\n<li>A lista de status é configurável por tenant; os valores (<code>id</code>/<code>title</code>) variam de cliente para cliente.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>long</td>\n<td>Id do status de incidente.</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome do status.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>?</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use em conjunto com <em>Listar equipes para encaminhamento</em> e <em>Listar motivos para encaminhamento</em> para montar o payload de <em>Encaminhar solicitação para equipe/atendente</em>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","incident-status"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"670da931-8e79-4898-b131-de9ecbc1f849","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/incident-status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 1,\n            \"title\": \"Status x\"\n        },\n        {\n            \"id\": 2,\n            \"title\": \"Status y\"\n        }\n    ],\n    \"elapsedTime\": null\n}"}],"_postman_id":"222e7a88-1044-4edc-8e2e-3c9d0bf1bd7e"},{"name":"Listar motivos para encaminhamento","id":"9c5bd702-7b40-4169-80c0-d3ea02b63274","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/motives","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os motivos de encaminhamento cadastrados especificamente para a operação de encaminhar uma solicitação para outra equipe/atendente (campo <code>routingMotiveId</code> do endpoint de encaminhamento).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas motivos ativos e não excluídos.</li>\n<li>Retorna somente os motivos cuja origem de cadastro seja \"Encaminhamento\" — motivos cadastrados para outras operações (por exemplo, cancelamento) não aparecem aqui.</li>\n<li>A lista de motivos é configurável por tenant; os valores (<code>id</code>/<code>title</code>) variam de cliente para cliente.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>long</td>\n<td>Id do motivo.</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome do motivo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>?</td>\n<td>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use em conjunto com <em>Listar equipes para encaminhamento</em> e <em>Listar status para encaminhamento</em> para montar o payload de <em>Encaminhar solicitação para equipe/atendente</em>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward","motives"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"7d210dd2-4815-472f-860c-5c0dd79caeae","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward/motives"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 1,\n            \"title\": \"Motivo x\"\n        },\n        {\n            \"id\": 2,\n            \"title\": \"Motivo y\"\n        }\n    ],\n    \"elapsedTime\": null\n}"}],"_postman_id":"9c5bd702-7b40-4169-80c0-d3ea02b63274"},{"name":"Encaminhar solicitação para equipe/atendente","id":"92d2c51d-56f4-437a-a38c-ff071fb347a4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0, // Solicitação\n    \"routingMotiveId\": 0, // Motivo\n    \"teamId\": 0, // Equipe\n    \"responsibleId\": 0, // Responsável\n    \"motive\": \"\", // Observação a ser adicionada\n    \"incidentStatusId\": 0 // Status\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Encaminha (reatribui) uma solicitação para outra equipe e/ou atendente, podendo também alterar o status da solicitação.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code></td>\n<td>Sim</td>\n<td>Id da solicitação/protocolo. Precisa estar em aberto (não encerrada/cancelada).</td>\n</tr>\n<tr>\n<td><code>teamId</code></td>\n<td>Sim</td>\n<td>Id da equipe de destino. Precisa existir e estar ativa.</td>\n</tr>\n<tr>\n<td><code>routingMotiveId</code></td>\n<td>Nominalmente obrigatório</td>\n<td>Id do motivo de encaminhamento (ver \"Listar motivos para encaminhamento\"). <em>O valor não é validado contra a lista de motivos — qualquer id é aceito, inclusive inexistente.</em></td>\n</tr>\n<tr>\n<td><code>motive</code></td>\n<td>Sim</td>\n<td>Texto livre do motivo/observação do encaminhamento.</td>\n</tr>\n<tr>\n<td><code>incidentStatusId</code></td>\n<td>Nominalmente obrigatório</td>\n<td>Novo status da solicitação (ver \"Listar status para encaminhamento\"). Precisa existir. <em>Este endpoint não impede usar aqui um status de Encerrado/Cancelado — na prática é possível encerrar uma solicitação através dele.</em></td>\n</tr>\n<tr>\n<td><code>responsibleId</code></td>\n<td>Não</td>\n<td>Id do atendente responsável de destino. Precisa ser uma pessoa com usuário de sistema vinculado. Pode ser enviado junto com <code>teamId</code> — não são mutuamente exclusivos, e não há checagem de que o responsável pertença à equipe de destino.</td>\n</tr>\n<tr>\n<td><code>actAsPersonId</code></td>\n<td>Não</td>\n<td>Id da pessoa em nome de quem a ação é registrada. Se informado e não puder ser resolvido, é o único cenário deste endpoint que retorna HTTP 400.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Encaminhar para a <strong>mesma</strong> combinação de equipe + responsável que a solicitação já tem é bloqueado; mudar só a equipe ou só o responsável é permitido normalmente.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso. <code>false</code> nos erros listados em \"Erros comuns\" que retornam HTTP 200.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna dados estruturados — sempre <code>null</code>, tanto no sucesso quanto no erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Solicitação não encontrada</td>\n<td>\"Solicitação {id} não encontrada.\"</td>\n</tr>\n<tr>\n<td>Equipe não encontrada</td>\n<td>\"Não foi possível localizar a equipe selecionada.\"</td>\n</tr>\n<tr>\n<td>Equipe desativada</td>\n<td>\"A equipe selecionada está desativada.\"</td>\n</tr>\n<tr>\n<td>Status de destino não encontrado</td>\n<td>\"Não foi possível localizar o status a solicitação selecionado.\"</td>\n</tr>\n<tr>\n<td>Responsável não encontrado</td>\n<td>\"Não foi possível localizar o responsável selecionado.\"</td>\n</tr>\n<tr>\n<td>Já está na mesma equipe/responsável</td>\n<td>\"Solicitação {id} já encontra-se para a equipe/responsável informado.\"</td>\n</tr>\n<tr>\n<td><code>actAsPersonId</code> não pôde ser resolvido</td>\n<td>erro com <strong>HTTP 400</strong> — único cenário de erro deste endpoint que não retorna 200</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Os demais erros acima retornam HTTP 200 com <code>success: false</code> no corpo.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use \"Listar equipes para encaminhamento\", \"Listar status para encaminhamento\" e \"Listar motivos para encaminhamento\" antes, para obter valores de referência.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","solicitation","forward"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"0578e05b-d595-4d9a-8989-fbbe16cdbc25","name":"Encaminhar solicitação para equipe/atendente","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0, // Solicitação\n    \"routingMotiveId\": 0, // Motivo\n    \"teamId\": 0, // Equipe\n    \"responsibleId\": 0, // Responsável\n    \"motive\": \"\", // Observação a ser adicionada\n    \"incidentStatusId\": 0 // Status\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/solicitation/forward"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Solicitação encaminhada\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ]\n}"}],"_postman_id":"92d2c51d-56f4-437a-a38c-ff071fb347a4"}],"id":"e0c5399b-1c34-4b35-b7d4-cd9040916b3f","_postman_id":"e0c5399b-1c34-4b35-b7d4-cd9040916b3f","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Field Service","item":[{"name":"Descobrir Slots Disponíveis (FSM)","id":"5d0439e6-432b-14a2-7221-dc6adca7ef13","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"catalogServiceId\": 10,\n    \"beginDate\": \"2026-09-20T00:00:00\",\n    \"endDate\": \"2026-09-25T00:00:00\",\n    \"regionId\": null,\n    \"clientId\": 400123,\n    \"contractServiceTagId\": 98765,\n    \"authenticationSiteCode\": null,\n    \"authenticationAccessPointCode\": null,\n    \"matrixType\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/discoverslots","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os horários (slots) disponíveis para agendamento de campo (Field Service Management) <strong>antes</strong> da abertura da solicitação, usando os mesmos dados que seriam usados para resolver a região em uma abertura de solicitação detalhada (cliente/etiqueta de contrato, ou site/ponto de acesso).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n<li>Catálogo de serviço válido, ativo e com habilidades configuradas.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>catalogServiceId</code> é obrigatório.</li>\n<li>Se <code>beginDate</code> não for informado, assume a data/hora de execução da requisição.</li>\n<li>Se <code>endDate</code> não for informado, assume o fim do dia (23:59:59) da data de <code>beginDate</code> resolvida.</li>\n<li>Não é permitido informar <code>beginDate</code> ou <code>endDate</code> anteriores ao momento atual da requisição — o endpoint retorna erro de negócio.</li>\n<li>A região é resolvida na seguinte ordem:<ol>\n<li><code>regionId</code>, se informado, é usado diretamente (ignora os passos abaixo);</li>\n<li>se <code>matrixType</code> for <code>2</code> (Interna), a região é resolvida a partir de <code>authenticationSiteCode</code>/<code>authenticationAccessPointCode</code>;</li>\n<li>caso contrário (<code>matrixType</code> <code>1</code>/Externa, ou não informado), a região é resolvida a partir de <code>clientId</code>/<code>contractServiceTagId</code>.</li>\n</ol>\n</li>\n<li>Se nenhum dos caminhos acima conseguir resolver uma região configurada para atendimento de campo, o endpoint retorna erro de negócio.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>catalogServiceId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do catálogo de serviço — resolve habilidades e duração do atendimento</td>\n</tr>\n<tr>\n<td><code>beginDate</code></td>\n<td>datetime</td>\n<td>Não</td>\n<td>Data/hora inicial da busca; padrão: agora</td>\n</tr>\n<tr>\n<td><code>endDate</code></td>\n<td>datetime</td>\n<td>Não</td>\n<td>Data/hora final da busca; padrão: fim do dia de <code>beginDate</code></td>\n</tr>\n<tr>\n<td><code>regionId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Id da região; se informado, ignora a resolução automática</td>\n</tr>\n<tr>\n<td><code>clientId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Id do cliente — usado na resolução \"externa\" da região</td>\n</tr>\n<tr>\n<td><code>contractServiceTagId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Id da etiqueta de contrato — usado na resolução \"externa\" da região</td>\n</tr>\n<tr>\n<td><code>authenticationSiteCode</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Código do site — usado na resolução \"interna\" da região (<code>matrixType = 2</code>)</td>\n</tr>\n<tr>\n<td><code>authenticationAccessPointCode</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Código do ponto de acesso — usado na resolução \"interna\" da região (<code>matrixType = 2</code>)</td>\n</tr>\n<tr>\n<td><code>matrixType</code></td>\n<td>int (enum)</td>\n<td>Não</td>\n<td>Tipo de matriz da solicitação que será aberta em seguida: <code>1</code> Externa, <code>2</code> Interna</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].start</code></td>\n<td>datetime</td>\n<td>Início do slot</td>\n</tr>\n<tr>\n<td><code>response[].end</code></td>\n<td>datetime</td>\n<td>Fim do slot</td>\n</tr>\n<tr>\n<td><code>response[].slotDate</code></td>\n<td>date</td>\n<td>Data do agrupamento do slot</td>\n</tr>\n<tr>\n<td><code>response[].shift</code></td>\n<td>int (enum)</td>\n<td>Turno do slot — <code>0</code> Intervalo, <code>1</code> Manhã, <code>2</code> Tarde, <code>3</code> Noite, <code>99</code> Sem Agendamento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>beginDate</code> ou <code>endDate</code> retroativos</td>\n<td><code>success: false</code>, mensagem \"Não é permitido buscar slots com data retroativa.\"</td>\n</tr>\n<tr>\n<td>Região não resolvida por nenhum dos caminhos acima</td>\n<td><code>success: false</code>, mensagem \"Região do cliente não configurada para atendimento de campo.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use antes de abrir uma solicitação detalhada, para oferecer horários ao cliente. Ver também <em>Buscar Técnicos com Disponibilidade (FSM)</em>, <em>Alocar Técnico (FSM)</em> e <em>Registrar Agendamento (FSM)</em>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","fsm","discoverslots"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"5953fb95-1986-4d9c-bfab-047bb94acae6","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"catalogServiceId\": 10,\n    \"beginDate\": \"2026-09-20T00:00:00\",\n    \"endDate\": \"2026-09-25T00:00:00\",\n    \"regionId\": null,\n    \"clientId\": 400123,\n    \"contractServiceTagId\": 98765,\n    \"authenticationSiteCode\": null,\n    \"authenticationAccessPointCode\": null,\n    \"matrixType\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/discoverslots","description":"## Propósito\nRetorna os horários (slots) disponíveis para agendamento de campo (Field Service Management) **antes** da abertura da solicitação, usando os mesmos dados que seriam usados para resolver a região em uma abertura de solicitação detalhada (cliente/etiqueta de contrato, ou site/ponto de acesso).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Catálogo de serviço válido, ativo e com habilidades configuradas.\n\n## Regras de negócio\n- `catalogServiceId` é obrigatório.\n- Se `beginDate` não for informado, assume a data/hora de execução da requisição.\n- Se `endDate` não for informado, assume o fim do dia (23:59:59) da data de `beginDate` resolvida.\n- Não é permitido informar `beginDate` ou `endDate` anteriores ao momento atual da requisição — o endpoint retorna erro de negócio.\n- A região é resolvida na seguinte ordem:\n  1. `regionId`, se informado, é usado diretamente (ignora os passos abaixo);\n  2. se `matrixType` for `2` (Interna), a região é resolvida a partir de `authenticationSiteCode`/`authenticationAccessPointCode`;\n  3. caso contrário (`matrixType` `1`/Externa, ou não informado), a região é resolvida a partir de `clientId`/`contractServiceTagId`.\n- Se nenhum dos caminhos acima conseguir resolver uma região configurada para atendimento de campo, o endpoint retorna erro de negócio.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço — resolve habilidades e duração do atendimento |\n| `beginDate` | datetime | Não | Data/hora inicial da busca; padrão: agora |\n| `endDate` | datetime | Não | Data/hora final da busca; padrão: fim do dia de `beginDate` |\n| `regionId` | long | Não | Id da região; se informado, ignora a resolução automática |\n| `clientId` | long | Não | Id do cliente — usado na resolução \"externa\" da região |\n| `contractServiceTagId` | long | Não | Id da etiqueta de contrato — usado na resolução \"externa\" da região |\n| `authenticationSiteCode` | string | Não | Código do site — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `authenticationAccessPointCode` | string | Não | Código do ponto de acesso — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `matrixType` | int (enum) | Não | Tipo de matriz da solicitação que será aberta em seguida: `1` Externa, `2` Interna |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].start` | datetime | Início do slot |\n| `response[].end` | datetime | Fim do slot |\n| `response[].slotDate` | date | Data do agrupamento do slot |\n| `response[].shift` | int (enum) | Turno do slot — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `beginDate` ou `endDate` retroativos | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n| Região não resolvida por nenhum dos caminhos acima | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse antes de abrir uma solicitação detalhada, para oferecer horários ao cliente. Ver também *Buscar Técnicos com Disponibilidade (FSM)*, *Alocar Técnico (FSM)* e *Registrar Agendamento (FSM)*."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"start\": \"2026-09-20T08:00:00\",\n            \"end\": \"2026-09-20T10:00:00\",\n            \"slotDate\": \"2026-09-20T00:00:00\",\n            \"shift\": 1\n        },\n        {\n            \"start\": \"2026-09-20T13:00:00\",\n            \"end\": \"2026-09-20T15:00:00\",\n            \"slotDate\": \"2026-09-20T00:00:00\",\n            \"shift\": 2\n        }\n    ],\n    \"elapsedTime\": null\n}"},{"id":"45a7bf5c-02bf-0def-52eb-a6f6c829af36","name":"Erro - data retroativa","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"catalogServiceId\": 10,\n    \"beginDate\": \"2026-09-20T00:00:00\",\n    \"endDate\": \"2026-09-25T00:00:00\",\n    \"regionId\": null,\n    \"clientId\": 400123,\n    \"contractServiceTagId\": 98765,\n    \"authenticationSiteCode\": null,\n    \"authenticationAccessPointCode\": null,\n    \"matrixType\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/discoverslots","description":"## Propósito\nRetorna os horários (slots) disponíveis para agendamento de campo (Field Service Management) **antes** da abertura da solicitação, usando os mesmos dados que seriam usados para resolver a região em uma abertura de solicitação detalhada (cliente/etiqueta de contrato, ou site/ponto de acesso).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Catálogo de serviço válido, ativo e com habilidades configuradas.\n\n## Regras de negócio\n- `catalogServiceId` é obrigatório.\n- Se `beginDate` não for informado, assume a data/hora de execução da requisição.\n- Se `endDate` não for informado, assume o fim do dia (23:59:59) da data de `beginDate` resolvida.\n- Não é permitido informar `beginDate` ou `endDate` anteriores ao momento atual da requisição — o endpoint retorna erro de negócio.\n- A região é resolvida na seguinte ordem:\n  1. `regionId`, se informado, é usado diretamente (ignora os passos abaixo);\n  2. se `matrixType` for `2` (Interna), a região é resolvida a partir de `authenticationSiteCode`/`authenticationAccessPointCode`;\n  3. caso contrário (`matrixType` `1`/Externa, ou não informado), a região é resolvida a partir de `clientId`/`contractServiceTagId`.\n- Se nenhum dos caminhos acima conseguir resolver uma região configurada para atendimento de campo, o endpoint retorna erro de negócio.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço — resolve habilidades e duração do atendimento |\n| `beginDate` | datetime | Não | Data/hora inicial da busca; padrão: agora |\n| `endDate` | datetime | Não | Data/hora final da busca; padrão: fim do dia de `beginDate` |\n| `regionId` | long | Não | Id da região; se informado, ignora a resolução automática |\n| `clientId` | long | Não | Id do cliente — usado na resolução \"externa\" da região |\n| `contractServiceTagId` | long | Não | Id da etiqueta de contrato — usado na resolução \"externa\" da região |\n| `authenticationSiteCode` | string | Não | Código do site — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `authenticationAccessPointCode` | string | Não | Código do ponto de acesso — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `matrixType` | int (enum) | Não | Tipo de matriz da solicitação que será aberta em seguida: `1` Externa, `2` Interna |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].start` | datetime | Início do slot |\n| `response[].end` | datetime | Fim do slot |\n| `response[].slotDate` | date | Data do agrupamento do slot |\n| `response[].shift` | int (enum) | Turno do slot — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `beginDate` ou `endDate` retroativos | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n| Região não resolvida por nenhum dos caminhos acima | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse antes de abrir uma solicitação detalhada, para oferecer horários ao cliente. Ver também *Buscar Técnicos com Disponibilidade (FSM)*, *Alocar Técnico (FSM)* e *Registrar Agendamento (FSM)*."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Não é permitido buscar slots com data retroativa.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"2b9babc0-f1db-00c1-ab72-cde89feeeb57","name":"Erro - região não configurada","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"catalogServiceId\": 10,\n    \"beginDate\": \"2026-09-20T00:00:00\",\n    \"endDate\": \"2026-09-25T00:00:00\",\n    \"regionId\": null,\n    \"clientId\": 400123,\n    \"contractServiceTagId\": 98765,\n    \"authenticationSiteCode\": null,\n    \"authenticationAccessPointCode\": null,\n    \"matrixType\": null\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/discoverslots","description":"## Propósito\nRetorna os horários (slots) disponíveis para agendamento de campo (Field Service Management) **antes** da abertura da solicitação, usando os mesmos dados que seriam usados para resolver a região em uma abertura de solicitação detalhada (cliente/etiqueta de contrato, ou site/ponto de acesso).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Catálogo de serviço válido, ativo e com habilidades configuradas.\n\n## Regras de negócio\n- `catalogServiceId` é obrigatório.\n- Se `beginDate` não for informado, assume a data/hora de execução da requisição.\n- Se `endDate` não for informado, assume o fim do dia (23:59:59) da data de `beginDate` resolvida.\n- Não é permitido informar `beginDate` ou `endDate` anteriores ao momento atual da requisição — o endpoint retorna erro de negócio.\n- A região é resolvida na seguinte ordem:\n  1. `regionId`, se informado, é usado diretamente (ignora os passos abaixo);\n  2. se `matrixType` for `2` (Interna), a região é resolvida a partir de `authenticationSiteCode`/`authenticationAccessPointCode`;\n  3. caso contrário (`matrixType` `1`/Externa, ou não informado), a região é resolvida a partir de `clientId`/`contractServiceTagId`.\n- Se nenhum dos caminhos acima conseguir resolver uma região configurada para atendimento de campo, o endpoint retorna erro de negócio.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço — resolve habilidades e duração do atendimento |\n| `beginDate` | datetime | Não | Data/hora inicial da busca; padrão: agora |\n| `endDate` | datetime | Não | Data/hora final da busca; padrão: fim do dia de `beginDate` |\n| `regionId` | long | Não | Id da região; se informado, ignora a resolução automática |\n| `clientId` | long | Não | Id do cliente — usado na resolução \"externa\" da região |\n| `contractServiceTagId` | long | Não | Id da etiqueta de contrato — usado na resolução \"externa\" da região |\n| `authenticationSiteCode` | string | Não | Código do site — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `authenticationAccessPointCode` | string | Não | Código do ponto de acesso — usado na resolução \"interna\" da região (`matrixType = 2`) |\n| `matrixType` | int (enum) | Não | Tipo de matriz da solicitação que será aberta em seguida: `1` Externa, `2` Interna |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].start` | datetime | Início do slot |\n| `response[].end` | datetime | Fim do slot |\n| `response[].slotDate` | date | Data do agrupamento do slot |\n| `response[].shift` | int (enum) | Turno do slot — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `beginDate` ou `endDate` retroativos | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n| Região não resolvida por nenhum dos caminhos acima | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse antes de abrir uma solicitação detalhada, para oferecer horários ao cliente. Ver também *Buscar Técnicos com Disponibilidade (FSM)*, *Alocar Técnico (FSM)* e *Registrar Agendamento (FSM)*."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Região do cliente não configurada para atendimento de campo.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"5d0439e6-432b-14a2-7221-dc6adca7ef13"},{"name":"Alocar Técnico (FSM)","id":"5b5ebe92-c32a-f894-860c-c5fe71369184","request":{"method":"PUT","header":[{"description":"<p>Token obtido no método de autenticação</p>\n","value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458213,\n  \"technicianId\": 981,\n  \"beginDate\": \"2026-09-16T08:00:00\",\n  \"typeSlot\": 1,\n  \"reasonId\": 4,\n  \"reason\": \"Realocação solicitada pelo cliente\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/allocatetechnician","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Aloca um técnico a uma solicitação (protocolo) já aberta, para um período determinado — equivalente a arrastar e soltar uma demanda sobre um técnico na tela de Roteiro.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n<li>Solicitação (protocolo) já aberta.</li>\n<li>Módulo Field Service Management habilitado para a empresa.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>É obrigatório informar o técnico a ser alocado (<code>technicianId</code>).</li>\n<li>O turno (<code>typeSlot</code>) deve sempre ser informado explicitamente na requisição — se omitido, é interpretado como <code>0</code> (Intervalo).</li>\n<li>Se o módulo de Field Service Management estiver desabilitado para a empresa, o endpoint retorna erro de negócio.</li>\n<li>Se a demanda já estiver alocada para outro técnico, o endpoint retorna erro de negócio informando o nome do recurso responsável.</li>\n<li>O resultado da operação vem dentro do campo <code>response</code> do envelope de retorno — o <code>success</code> do nível raiz indica apenas se a requisição foi processada; o <code>success</code> dentro de <code>response</code> indica se a alocação foi de fato realizada.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>protocol</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do protocolo/solicitação</td>\n</tr>\n<tr>\n<td><code>technicianId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do técnico a ser alocado</td>\n</tr>\n<tr>\n<td><code>beginDate</code></td>\n<td>datetime</td>\n<td>Sim</td>\n<td>Data/hora inicial do agendamento</td>\n</tr>\n<tr>\n<td><code>typeSlot</code></td>\n<td>int (enum)</td>\n<td>Sim</td>\n<td>Turno: <code>0</code> Intervalo, <code>1</code> Manhã, <code>2</code> Tarde, <code>3</code> Noite, <code>99</code> Sem Agendamento</td>\n</tr>\n<tr>\n<td><code>reasonId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Id do motivo da alocação/reagendamento</td>\n</tr>\n<tr>\n<td><code>reason</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Justificativa em texto livre</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada (não indica, por si só, se a alocação ocorreu)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></p>\n<p>Este endpoint devolve um segundo envelope dentro de <code>response</code>, que representa o resultado da operação de alocação em si (<code>success</code> raiz só indica que a requisição foi processada).</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.success</code></td>\n<td>boolean</td>\n<td>Indica se a alocação foi realizada com sucesso</td>\n</tr>\n<tr>\n<td><code>response.messages</code></td>\n<td>array|null</td>\n<td>Mensagem de sucesso, ou o motivo da recusa da alocação</td>\n</tr>\n<tr>\n<td><code>response.response</code></td>\n<td>object|null</td>\n<td>Não utilizado neste endpoint (sempre <code>null</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro de nível raiz (ex.: erro inesperado). Note que recusas de negócio, como técnico já alocado, ocorrem com <code>success: true</code> no nível raiz e <code>response.success: false</code> — ver acima.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>technicianId</code> não informado</td>\n<td><code>response.success: false</code>, mensagem \"Técnico não informado.\"</td>\n</tr>\n<tr>\n<td>Módulo Field Service Management desabilitado</td>\n<td><code>response.success: false</code>, mensagem \"Módulo Field Service Management encontra-se desabilitado.\"</td>\n</tr>\n<tr>\n<td>Demanda já alocada para outro técnico</td>\n<td><code>response.success: false</code>, mensagem \"Demanda já alocada para recurso {nome}. Atualize o roteiro para visualizar as demandas.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use <em>Buscar Técnicos com Disponibilidade (FSM)</em> para descobrir a quem alocar antes de chamar este endpoint.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","fsm","allocatetechnician"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"66228776-80eb-132c-027d-90596cfd1037","name":"Sucesso","originalRequest":{"method":"PUT","header":[{"description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458213,\n  \"technicianId\": 981,\n  \"beginDate\": \"2026-09-16T08:00:00\",\n  \"typeSlot\": 1,\n  \"reasonId\": 4,\n  \"reason\": \"Realocação solicitada pelo cliente\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/allocatetechnician","description":"## Propósito\nAloca um técnico a uma solicitação (protocolo) já aberta, para um período determinado — equivalente a arrastar e soltar uma demanda sobre um técnico na tela de Roteiro.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta.\n- Módulo Field Service Management habilitado para a empresa.\n\n## Regras de negócio\n- É obrigatório informar o técnico a ser alocado (`technicianId`).\n- O turno (`typeSlot`) deve sempre ser informado explicitamente na requisição — se omitido, é interpretado como `0` (Intervalo).\n- Se o módulo de Field Service Management estiver desabilitado para a empresa, o endpoint retorna erro de negócio.\n- Se a demanda já estiver alocada para outro técnico, o endpoint retorna erro de negócio informando o nome do recurso responsável.\n- O resultado da operação vem dentro do campo `response` do envelope de retorno — o `success` do nível raiz indica apenas se a requisição foi processada; o `success` dentro de `response` indica se a alocação foi de fato realizada.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo/solicitação |\n| `technicianId` | long | Sim | Id do técnico a ser alocado |\n| `beginDate` | datetime | Sim | Data/hora inicial do agendamento |\n| `typeSlot` | int (enum) | Sim | Turno: `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `reasonId` | long | Não | Id do motivo da alocação/reagendamento |\n| `reason` | string | Não | Justificativa em texto livre |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada (não indica, por si só, se a alocação ocorreu) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\nEste endpoint devolve um segundo envelope dentro de `response`, que representa o resultado da operação de alocação em si (`success` raiz só indica que a requisição foi processada).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Indica se a alocação foi realizada com sucesso |\n| `response.messages` | array\\|null | Mensagem de sucesso, ou o motivo da recusa da alocação |\n| `response.response` | object\\|null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro de nível raiz (ex.: erro inesperado). Note que recusas de negócio, como técnico já alocado, ocorrem com `success: true` no nível raiz e `response.success: false` — ver acima. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `technicianId` não informado | `response.success: false`, mensagem \"Técnico não informado.\" |\n| Módulo Field Service Management desabilitado | `response.success: false`, mensagem \"Módulo Field Service Management encontra-se desabilitado.\" |\n| Demanda já alocada para outro técnico | `response.success: false`, mensagem \"Demanda já alocada para recurso {nome}. Atualize o roteiro para visualizar as demandas.\" |\n\n## Fluxo relacionado\nUse *Buscar Técnicos com Disponibilidade (FSM)* para descobrir a quem alocar antes de chamar este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": {\n    \"success\": true,\n    \"messages\": [\"Operação realizada com sucesso!\"],\n    \"response\": null,\n    \"elapsedTime\": null\n  },\n  \"elapsedTime\": null\n}"},{"id":"ad40763a-550a-3e2f-64bf-8c9befc3b363","name":"Erro - técnico não informado","originalRequest":{"method":"PUT","header":[{"description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458213,\n  \"technicianId\": 981,\n  \"beginDate\": \"2026-09-16T08:00:00\",\n  \"typeSlot\": 1,\n  \"reasonId\": 4,\n  \"reason\": \"Realocação solicitada pelo cliente\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/allocatetechnician","description":"## Propósito\nAloca um técnico a uma solicitação (protocolo) já aberta, para um período determinado — equivalente a arrastar e soltar uma demanda sobre um técnico na tela de Roteiro.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta.\n- Módulo Field Service Management habilitado para a empresa.\n\n## Regras de negócio\n- É obrigatório informar o técnico a ser alocado (`technicianId`).\n- O turno (`typeSlot`) deve sempre ser informado explicitamente na requisição — se omitido, é interpretado como `0` (Intervalo).\n- Se o módulo de Field Service Management estiver desabilitado para a empresa, o endpoint retorna erro de negócio.\n- Se a demanda já estiver alocada para outro técnico, o endpoint retorna erro de negócio informando o nome do recurso responsável.\n- O resultado da operação vem dentro do campo `response` do envelope de retorno — o `success` do nível raiz indica apenas se a requisição foi processada; o `success` dentro de `response` indica se a alocação foi de fato realizada.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo/solicitação |\n| `technicianId` | long | Sim | Id do técnico a ser alocado |\n| `beginDate` | datetime | Sim | Data/hora inicial do agendamento |\n| `typeSlot` | int (enum) | Sim | Turno: `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `reasonId` | long | Não | Id do motivo da alocação/reagendamento |\n| `reason` | string | Não | Justificativa em texto livre |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada (não indica, por si só, se a alocação ocorreu) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\nEste endpoint devolve um segundo envelope dentro de `response`, que representa o resultado da operação de alocação em si (`success` raiz só indica que a requisição foi processada).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Indica se a alocação foi realizada com sucesso |\n| `response.messages` | array\\|null | Mensagem de sucesso, ou o motivo da recusa da alocação |\n| `response.response` | object\\|null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro de nível raiz (ex.: erro inesperado). Note que recusas de negócio, como técnico já alocado, ocorrem com `success: true` no nível raiz e `response.success: false` — ver acima. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `technicianId` não informado | `response.success: false`, mensagem \"Técnico não informado.\" |\n| Módulo Field Service Management desabilitado | `response.success: false`, mensagem \"Módulo Field Service Management encontra-se desabilitado.\" |\n| Demanda já alocada para outro técnico | `response.success: false`, mensagem \"Demanda já alocada para recurso {nome}. Atualize o roteiro para visualizar as demandas.\" |\n\n## Fluxo relacionado\nUse *Buscar Técnicos com Disponibilidade (FSM)* para descobrir a quem alocar antes de chamar este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\"Técnico não informado.\"],\n  \"response\": null,\n  \"elapsedTime\": null\n}"},{"id":"d69aa190-44cc-6a3b-fbaf-0eb33cd9259f","name":"Erro - módulo desabilitado","originalRequest":{"method":"PUT","header":[{"description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458213,\n  \"technicianId\": 981,\n  \"beginDate\": \"2026-09-16T08:00:00\",\n  \"typeSlot\": 1,\n  \"reasonId\": 4,\n  \"reason\": \"Realocação solicitada pelo cliente\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/allocatetechnician","description":"## Propósito\nAloca um técnico a uma solicitação (protocolo) já aberta, para um período determinado — equivalente a arrastar e soltar uma demanda sobre um técnico na tela de Roteiro.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta.\n- Módulo Field Service Management habilitado para a empresa.\n\n## Regras de negócio\n- É obrigatório informar o técnico a ser alocado (`technicianId`).\n- O turno (`typeSlot`) deve sempre ser informado explicitamente na requisição — se omitido, é interpretado como `0` (Intervalo).\n- Se o módulo de Field Service Management estiver desabilitado para a empresa, o endpoint retorna erro de negócio.\n- Se a demanda já estiver alocada para outro técnico, o endpoint retorna erro de negócio informando o nome do recurso responsável.\n- O resultado da operação vem dentro do campo `response` do envelope de retorno — o `success` do nível raiz indica apenas se a requisição foi processada; o `success` dentro de `response` indica se a alocação foi de fato realizada.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo/solicitação |\n| `technicianId` | long | Sim | Id do técnico a ser alocado |\n| `beginDate` | datetime | Sim | Data/hora inicial do agendamento |\n| `typeSlot` | int (enum) | Sim | Turno: `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `reasonId` | long | Não | Id do motivo da alocação/reagendamento |\n| `reason` | string | Não | Justificativa em texto livre |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada (não indica, por si só, se a alocação ocorreu) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\nEste endpoint devolve um segundo envelope dentro de `response`, que representa o resultado da operação de alocação em si (`success` raiz só indica que a requisição foi processada).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Indica se a alocação foi realizada com sucesso |\n| `response.messages` | array\\|null | Mensagem de sucesso, ou o motivo da recusa da alocação |\n| `response.response` | object\\|null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro de nível raiz (ex.: erro inesperado). Note que recusas de negócio, como técnico já alocado, ocorrem com `success: true` no nível raiz e `response.success: false` — ver acima. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `technicianId` não informado | `response.success: false`, mensagem \"Técnico não informado.\" |\n| Módulo Field Service Management desabilitado | `response.success: false`, mensagem \"Módulo Field Service Management encontra-se desabilitado.\" |\n| Demanda já alocada para outro técnico | `response.success: false`, mensagem \"Demanda já alocada para recurso {nome}. Atualize o roteiro para visualizar as demandas.\" |\n\n## Fluxo relacionado\nUse *Buscar Técnicos com Disponibilidade (FSM)* para descobrir a quem alocar antes de chamar este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": {\n    \"success\": false,\n    \"messages\": [\"Módulo Field Service Management encontra-se desabilitado.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n  },\n  \"elapsedTime\": null\n}"},{"id":"fe3c0e43-13cd-d90a-fc25-c8b721796616","name":"Erro - demanda já alocada","originalRequest":{"method":"PUT","header":[{"description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458213,\n  \"technicianId\": 981,\n  \"beginDate\": \"2026-09-16T08:00:00\",\n  \"typeSlot\": 1,\n  \"reasonId\": 4,\n  \"reason\": \"Realocação solicitada pelo cliente\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/allocatetechnician","description":"## Propósito\nAloca um técnico a uma solicitação (protocolo) já aberta, para um período determinado — equivalente a arrastar e soltar uma demanda sobre um técnico na tela de Roteiro.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta.\n- Módulo Field Service Management habilitado para a empresa.\n\n## Regras de negócio\n- É obrigatório informar o técnico a ser alocado (`technicianId`).\n- O turno (`typeSlot`) deve sempre ser informado explicitamente na requisição — se omitido, é interpretado como `0` (Intervalo).\n- Se o módulo de Field Service Management estiver desabilitado para a empresa, o endpoint retorna erro de negócio.\n- Se a demanda já estiver alocada para outro técnico, o endpoint retorna erro de negócio informando o nome do recurso responsável.\n- O resultado da operação vem dentro do campo `response` do envelope de retorno — o `success` do nível raiz indica apenas se a requisição foi processada; o `success` dentro de `response` indica se a alocação foi de fato realizada.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo/solicitação |\n| `technicianId` | long | Sim | Id do técnico a ser alocado |\n| `beginDate` | datetime | Sim | Data/hora inicial do agendamento |\n| `typeSlot` | int (enum) | Sim | Turno: `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `reasonId` | long | Não | Id do motivo da alocação/reagendamento |\n| `reason` | string | Não | Justificativa em texto livre |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada (não indica, por si só, se a alocação ocorreu) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\nEste endpoint devolve um segundo envelope dentro de `response`, que representa o resultado da operação de alocação em si (`success` raiz só indica que a requisição foi processada).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Indica se a alocação foi realizada com sucesso |\n| `response.messages` | array\\|null | Mensagem de sucesso, ou o motivo da recusa da alocação |\n| `response.response` | object\\|null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro de nível raiz (ex.: erro inesperado). Note que recusas de negócio, como técnico já alocado, ocorrem com `success: true` no nível raiz e `response.success: false` — ver acima. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `technicianId` não informado | `response.success: false`, mensagem \"Técnico não informado.\" |\n| Módulo Field Service Management desabilitado | `response.success: false`, mensagem \"Módulo Field Service Management encontra-se desabilitado.\" |\n| Demanda já alocada para outro técnico | `response.success: false`, mensagem \"Demanda já alocada para recurso {nome}. Atualize o roteiro para visualizar as demandas.\" |\n\n## Fluxo relacionado\nUse *Buscar Técnicos com Disponibilidade (FSM)* para descobrir a quem alocar antes de chamar este endpoint."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": {\n    \"success\": false,\n    \"messages\": [\"Demanda já alocada para recurso João da Silva. Atualize o roteiro para visualizar as demandas.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n  },\n  \"elapsedTime\": null\n}"}],"_postman_id":"5b5ebe92-c32a-f894-860c-c5fe71369184"},{"name":"Buscar Técnicos com Disponibilidade (FSM)","id":"1085f95c-7f44-9e99-494a-782aa18e73fd","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"regionId\": 12,\n  \"date\": \"2026-09-16\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/gettechnicianslots","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca, para uma região e uma data de referência, os técnicos com disponibilidade de agenda, agrupados por turno, com as habilidades e catálogos de serviço atendíveis e os horários livres. Uso típico: antes de alocar um técnico a uma demanda (ver <em>Alocar Técnico (FSM)</em>), para descobrir a quem alocar.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>É obrigatório informar a região de atendimento (<code>regionId</code>).</li>\n<li>Se <code>date</code> não for informado, considera a data/hora atuais.</li>\n<li>Não é permitido informar uma data retroativa (anterior ao dia de hoje) — o endpoint retorna erro de negócio.</li>\n<li>Se for informada apenas a data (sem horário) de hoje, considera a data de hoje com a hora atual.</li>\n<li>Se for informada uma data futura sem horário, considera essa data a partir de <code>00:00</code>.</li>\n<li>Se for informada uma data futura com horário, usa exatamente o valor informado.</li>\n<li>Em qualquer caso, considera apenas o dia resolvido e apenas horários livres, não bloqueados, não reservados e que ainda não passaram.</li>\n<li>Se nenhum técnico tiver disponibilidade, retorna lista vazia (não é tratado como erro).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>regionId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id da região a consultar</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>datetime</td>\n<td>Não</td>\n<td>Data/hora de referência da busca</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a requisição foi processada com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].technicianId</code></td>\n<td>long</td>\n<td>Id do técnico</td>\n</tr>\n<tr>\n<td><code>response[].technicianName</code></td>\n<td>string</td>\n<td>Nome do técnico</td>\n</tr>\n<tr>\n<td><code>response[].shifts</code></td>\n<td>array</td>\n<td>Turnos com disponibilidade para este técnico (ver abaixo)</td>\n</tr>\n</tbody>\n</table>\n</div><p>Cada item de <code>response[].shifts</code> traz:</p>\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>shift</td>\n<td>Turno do slot (int, mesmo enum de turno usado em <em>Alocar Técnico</em>)</td>\n</tr>\n<tr>\n<td>skills</td>\n<td>Habilidades do turno: <code>skillId</code>/<code>skillName</code></td>\n</tr>\n<tr>\n<td>catalogServices</td>\n<td>Catálogos de serviço atendíveis: <code>catalogServiceId</code>/<code>catalogServiceName</code></td>\n</tr>\n<tr>\n<td>slots</td>\n<td>Horários livres: <code>beginDate</code>/<code>endDate</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>regionId</code> não informado ou igual a zero</td>\n<td><code>success: false</code>, mensagem \"Região do cliente não configurada para atendimento de campo.\"</td>\n</tr>\n<tr>\n<td><code>date</code> retroativo</td>\n<td><code>success: false</code>, mensagem \"Não é permitido buscar slots com data retroativa.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use antes de <em>Alocar Técnico (FSM)</em>, para descobrir a quem alocar.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","fsm","gettechnicianslots"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"406a8e87-bd0a-3ec3-3173-5f4ae4e3318e","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"regionId\": 12,\n  \"date\": \"2026-09-16\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/gettechnicianslots","description":"## Propósito\nBusca, para uma região e uma data de referência, os técnicos com disponibilidade de agenda, agrupados por turno, com as habilidades e catálogos de serviço atendíveis e os horários livres. Uso típico: antes de alocar um técnico a uma demanda (ver *Alocar Técnico (FSM)*), para descobrir a quem alocar.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n\n## Regras de negócio\n- É obrigatório informar a região de atendimento (`regionId`).\n- Se `date` não for informado, considera a data/hora atuais.\n- Não é permitido informar uma data retroativa (anterior ao dia de hoje) — o endpoint retorna erro de negócio.\n- Se for informada apenas a data (sem horário) de hoje, considera a data de hoje com a hora atual.\n- Se for informada uma data futura sem horário, considera essa data a partir de `00:00`.\n- Se for informada uma data futura com horário, usa exatamente o valor informado.\n- Em qualquer caso, considera apenas o dia resolvido e apenas horários livres, não bloqueados, não reservados e que ainda não passaram.\n- Se nenhum técnico tiver disponibilidade, retorna lista vazia (não é tratado como erro).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `regionId` | long | Sim | Id da região a consultar |\n| `date` | datetime | Não | Data/hora de referência da busca |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].technicianId` | long | Id do técnico |\n| `response[].technicianName` | string | Nome do técnico |\n| `response[].shifts` | array | Turnos com disponibilidade para este técnico (ver abaixo) |\n\nCada item de `response[].shifts` traz:\n\n| Campo | Descrição |\n|---|---|\n| shift | Turno do slot (int, mesmo enum de turno usado em *Alocar Técnico*) |\n| skills | Habilidades do turno: `skillId`/`skillName` |\n| catalogServices | Catálogos de serviço atendíveis: `catalogServiceId`/`catalogServiceName` |\n| slots | Horários livres: `beginDate`/`endDate` |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `regionId` não informado ou igual a zero | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n| `date` retroativo | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n\n## Fluxo relacionado\nUse antes de *Alocar Técnico (FSM)*, para descobrir a quem alocar."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": [\n    {\n      \"technicianId\": 981,\n      \"technicianName\": \"João da Silva\",\n      \"shifts\": [\n        {\n          \"shift\": 1,\n          \"skills\": [\n            { \"skillId\": 5, \"skillName\": \"Instalação de Rede\" }\n          ],\n          \"catalogServices\": [\n            { \"catalogServiceId\": 10, \"catalogServiceName\": \"Instalação Residencial\" }\n          ],\n          \"slots\": [\n            { \"beginDate\": \"2026-09-16T08:00:00\", \"endDate\": \"2026-09-16T08:30:00\" },\n            { \"beginDate\": \"2026-09-16T08:30:00\", \"endDate\": \"2026-09-16T09:00:00\" }\n          ]\n        }\n      ]\n    }\n  ],\n  \"elapsedTime\": null\n}"},{"id":"5e14e857-4d5c-21d7-0d3c-0fef4f808bc3","name":"Erro - região não informada","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"regionId\": 12,\n  \"date\": \"2026-09-16\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/gettechnicianslots","description":"## Propósito\nBusca, para uma região e uma data de referência, os técnicos com disponibilidade de agenda, agrupados por turno, com as habilidades e catálogos de serviço atendíveis e os horários livres. Uso típico: antes de alocar um técnico a uma demanda (ver *Alocar Técnico (FSM)*), para descobrir a quem alocar.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n\n## Regras de negócio\n- É obrigatório informar a região de atendimento (`regionId`).\n- Se `date` não for informado, considera a data/hora atuais.\n- Não é permitido informar uma data retroativa (anterior ao dia de hoje) — o endpoint retorna erro de negócio.\n- Se for informada apenas a data (sem horário) de hoje, considera a data de hoje com a hora atual.\n- Se for informada uma data futura sem horário, considera essa data a partir de `00:00`.\n- Se for informada uma data futura com horário, usa exatamente o valor informado.\n- Em qualquer caso, considera apenas o dia resolvido e apenas horários livres, não bloqueados, não reservados e que ainda não passaram.\n- Se nenhum técnico tiver disponibilidade, retorna lista vazia (não é tratado como erro).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `regionId` | long | Sim | Id da região a consultar |\n| `date` | datetime | Não | Data/hora de referência da busca |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].technicianId` | long | Id do técnico |\n| `response[].technicianName` | string | Nome do técnico |\n| `response[].shifts` | array | Turnos com disponibilidade para este técnico (ver abaixo) |\n\nCada item de `response[].shifts` traz:\n\n| Campo | Descrição |\n|---|---|\n| shift | Turno do slot (int, mesmo enum de turno usado em *Alocar Técnico*) |\n| skills | Habilidades do turno: `skillId`/`skillName` |\n| catalogServices | Catálogos de serviço atendíveis: `catalogServiceId`/`catalogServiceName` |\n| slots | Horários livres: `beginDate`/`endDate` |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `regionId` não informado ou igual a zero | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n| `date` retroativo | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n\n## Fluxo relacionado\nUse antes de *Alocar Técnico (FSM)*, para descobrir a quem alocar."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\"Região do cliente não configurada para atendimento de campo.\"],\n  \"response\": null,\n  \"elapsedTime\": null\n}"},{"id":"c87f48c4-dfd5-43e2-9015-144f81f997f4","name":"Erro - data retroativa","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n  \"regionId\": 12,\n  \"date\": \"2026-09-16\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/gettechnicianslots","description":"## Propósito\nBusca, para uma região e uma data de referência, os técnicos com disponibilidade de agenda, agrupados por turno, com as habilidades e catálogos de serviço atendíveis e os horários livres. Uso típico: antes de alocar um técnico a uma demanda (ver *Alocar Técnico (FSM)*), para descobrir a quem alocar.\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n\n## Regras de negócio\n- É obrigatório informar a região de atendimento (`regionId`).\n- Se `date` não for informado, considera a data/hora atuais.\n- Não é permitido informar uma data retroativa (anterior ao dia de hoje) — o endpoint retorna erro de negócio.\n- Se for informada apenas a data (sem horário) de hoje, considera a data de hoje com a hora atual.\n- Se for informada uma data futura sem horário, considera essa data a partir de `00:00`.\n- Se for informada uma data futura com horário, usa exatamente o valor informado.\n- Em qualquer caso, considera apenas o dia resolvido e apenas horários livres, não bloqueados, não reservados e que ainda não passaram.\n- Se nenhum técnico tiver disponibilidade, retorna lista vazia (não é tratado como erro).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `regionId` | long | Sim | Id da região a consultar |\n| `date` | datetime | Não | Data/hora de referência da busca |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a requisição foi processada com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].technicianId` | long | Id do técnico |\n| `response[].technicianName` | string | Nome do técnico |\n| `response[].shifts` | array | Turnos com disponibilidade para este técnico (ver abaixo) |\n\nCada item de `response[].shifts` traz:\n\n| Campo | Descrição |\n|---|---|\n| shift | Turno do slot (int, mesmo enum de turno usado em *Alocar Técnico*) |\n| skills | Habilidades do turno: `skillId`/`skillName` |\n| catalogServices | Catálogos de serviço atendíveis: `catalogServiceId`/`catalogServiceName` |\n| slots | Horários livres: `beginDate`/`endDate` |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| `regionId` não informado ou igual a zero | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n| `date` retroativo | `success: false`, mensagem \"Não é permitido buscar slots com data retroativa.\" |\n\n## Fluxo relacionado\nUse antes de *Alocar Técnico (FSM)*, para descobrir a quem alocar."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\"Não é permitido buscar slots com data retroativa.\"],\n  \"response\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"1085f95c-7f44-9e99-494a-782aa18e73fd"},{"name":"Registrar Agendamento (FSM)","id":"76ccc147-088b-bf7f-c690-87cbf284d869","request":{"method":"POST","header":[{"key":"Authorization","description":"<p>Token obtido no método de autenticação</p>\n","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso válido (Bearer).</li>\n<li>Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>protocol</code> identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.</li>\n<li>A solicitação precisa já ter uma região vinculada (independente do <code>regionId</code> informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.</li>\n<li><code>regionId</code> deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como <em>Descobrir Slots Disponíveis</em>), este endpoint não resolve a região automaticamente.</li>\n<li>A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.</li>\n<li>É necessário haver um catálogo de serviço válido informado.</li>\n<li>Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando <code>hasDefaultSolicitationOrigin</code> ou <code>hasCancelSolicitationOrigin</code> forem verdadeiros).</li>\n<li>Se a solicitação estiver vinculada a um contrato cancelado/encerrado e <code>hasCancelSolicitationOrigin</code> for verdadeiro, o agendamento é bloqueado.</li>\n<li><code>newAssignmentId</code> é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.</li>\n<li>A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).</li>\n<li>Diferente de <em>Alocar Técnico (FSM)</em>, o resultado deste endpoint <strong>não</strong> vem aninhado: o <code>success</code>/<code>messages</code> do nível raiz já refletem diretamente se o agendamento foi ou não realizado.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>protocol</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do protocolo da solicitação a ser agendada</td>\n</tr>\n<tr>\n<td><code>catalogServiceId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do catálogo de serviço</td>\n</tr>\n<tr>\n<td><code>regionId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id da região de atendimento</td>\n</tr>\n<tr>\n<td><code>incidentTypeId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do tipo de solicitação</td>\n</tr>\n<tr>\n<td><code>newAssignmentId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>datetime</td>\n<td>Sim</td>\n<td>Data/hora escolhida para o agendamento</td>\n</tr>\n<tr>\n<td><code>typeSlot</code></td>\n<td>int (enum)</td>\n<td>Sim</td>\n<td>Turno escolhido — <code>0</code> Intervalo, <code>1</code> Manhã, <code>2</code> Tarde, <code>3</code> Noite, <code>99</code> Sem Agendamento</td>\n</tr>\n<tr>\n<td><code>hasDefaultSolicitationOrigin</code></td>\n<td>bool</td>\n<td>Sim</td>\n<td>Indica se esta é a solicitação de origem</td>\n</tr>\n<tr>\n<td><code>hasCancelSolicitationOrigin</code></td>\n<td>bool</td>\n<td>Sim</td>\n<td>Indica se esta é uma solicitação de cancelamento</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o agendamento foi realizado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.success</code></td>\n<td>boolean</td>\n<td>Sempre <code>true</code> quando o agendamento foi confirmado</td>\n</tr>\n<tr>\n<td><code>response.data.message</code></td>\n<td>string</td>\n<td>Mensagem de confirmação</td>\n</tr>\n<tr>\n<td><code>response.data.dateSla</code></td>\n<td>datetime</td>\n<td>Data final do SLA após o agendamento</td>\n</tr>\n<tr>\n<td><code>response.elapsedTime</code></td>\n<td>number</td>\n<td>Tempo de processamento interno</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Protocolo não localizado</td>\n<td><code>success: false</code>, mensagem \"Não foi possível localizar a solicitação.\"</td>\n</tr>\n<tr>\n<td>Solicitação sem região vinculada</td>\n<td><code>success: false</code>, mensagem \"Solicitação não possui região definida.\"</td>\n</tr>\n<tr>\n<td>Solicitação encerrada</td>\n<td><code>success: false</code>, mensagem \"Solicitação encontra-se encerrada.\"</td>\n</tr>\n<tr>\n<td>Solicitação cancelada</td>\n<td><code>success: false</code>, mensagem \"Solicitação encontra-se cancelada.\"</td>\n</tr>\n<tr>\n<td>Solicitação fechada</td>\n<td><code>success: false</code>, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\"</td>\n</tr>\n<tr>\n<td>Catálogo de serviço não informado</td>\n<td><code>success: false</code>, mensagem \"Catálogo de serviço não informado.\"</td>\n</tr>\n<tr>\n<td>Já existe agendamento ativo para a etiqueta de contrato</td>\n<td><code>success: false</code>, mensagem \"Já existe um agendamento associado para a etiqueta.\"</td>\n</tr>\n<tr>\n<td>Contrato cancelado/encerrado (com <code>hasCancelSolicitationOrigin: true</code>)</td>\n<td><code>success: false</code>, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\"</td>\n</tr>\n<tr>\n<td><code>regionId</code> não informado no corpo</td>\n<td><code>success: false</code>, mensagem \"Região do cliente não configurada para atendimento de campo.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use <em>Descobrir Slots Disponíveis (FSM)</em> ou <em>Buscar Técnicos com Disponibilidade (FSM)</em> para descobrir horários antes de registrar o agendamento. Ver também <em>Alocar Técnico (FSM)</em> para alocar um técnico específico a uma demanda já aberta.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","fsm","registerslots"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"81568875-8d32-7504-7df4-9f062b4ed020","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"success\": true,\n        \"data\": {\n            \"message\": \"Agendamento realizado com sucesso!\",\n            \"dateSla\": \"2026-09-26T18:00:00\"\n        },\n        \"elapsedTime\": 0\n    },\n    \"elapsedTime\": null\n}"},{"id":"ef0c33cb-c27f-749c-5d6d-6d53ddd70fe0","name":"Erro - protocolo não localizado","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Não foi possível localizar a solicitação.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"d8c8b1a1-f824-bca6-43f1-a92f3a02cfa1","name":"Erro - solicitação sem região definida","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Solicitação não possui região definida.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"91552b40-8a87-aa2e-b5c9-d6a292bca914","name":"Erro - solicitação encerrada","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Solicitação encontra-se encerrada.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"3699af25-b462-b57d-0310-d6dde5fe6d7f","name":"Erro - solicitação cancelada","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Solicitação encontra-se cancelada.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"d1b4e90a-da65-678c-6404-f763e2d3c0da","name":"Erro - solicitação fechada","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"28bc6b86-5e39-da0f-ca4f-7e0d199d96c1","name":"Erro - catálogo de serviço não informado","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Catálogo de serviço não informado.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"66261e0a-ebc9-b495-edb4-7b79ecc1d13e","name":"Erro - agendamento já existe para a etiqueta","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Já existe um agendamento associado para a etiqueta.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"3a609624-fa12-a225-91f4-ddd7a951ca8d","name":"Erro - contrato cancelado","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"a9c75185-ea5d-e087-7f66-8dcd72acf5c0","name":"Erro - região do cliente não configurada","originalRequest":{"method":"POST","header":[{"key":"Authorization","description":"Token obtido no método de autenticação","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"protocol\": 458210,\n  \"catalogServiceId\": 45,\n  \"regionId\": 12,\n  \"incidentTypeId\": 8,\n  \"newAssignmentId\": null,\n  \"date\": \"2026-09-24T08:00:00\",\n  \"typeSlot\": 1,\n  \"hasDefaultSolicitationOrigin\": true,\n  \"hasCancelSolicitationOrigin\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/fsm/registerslots","description":"## Propósito\nRealiza o agendamento de uma solicitação de campo já aberta para um turno e data específicos (Field Service Management).\n\n## Pré-requisitos\n- Token de acesso válido (Bearer).\n- Solicitação (protocolo) já aberta, com região vinculada e catálogo de serviço associado.\n\n## Regras de negócio\n- `protocol` identifica a solicitação a ser agendada; se não for localizada, a operação é recusada.\n- A solicitação precisa já ter uma região vinculada (independente do `regionId` informado no corpo) — se a solicitação não tiver região definida, a operação é recusada.\n- `regionId` deve ser informado explicitamente pelo consumidor — diferente de outros endpoints de slots (como *Descobrir Slots Disponíveis*), este endpoint não resolve a região automaticamente.\n- A solicitação precisa estar em um status compatível com agendamento: não pode estar fechada, encerrada ou cancelada.\n- É necessário haver um catálogo de serviço válido informado.\n- Se a organização não permitir múltiplos agendamentos para a mesma etiqueta de contrato, uma nova tentativa é bloqueada quando já existe um agendamento ativo para essa etiqueta (regra não aplicada quando `hasDefaultSolicitationOrigin` ou `hasCancelSolicitationOrigin` forem verdadeiros).\n- Se a solicitação estiver vinculada a um contrato cancelado/encerrado e `hasCancelSolicitationOrigin` for verdadeiro, o agendamento é bloqueado.\n- `newAssignmentId` é usado quando este agendamento decorre de uma nova solicitação aberta a partir de uma anterior.\n- A disponibilidade do turno/data é validada no momento da reserva; se não houver disponibilidade, o agendamento também é recusado (a mensagem pode variar conforme a regra de disponibilidade aplicada).\n- Diferente de *Alocar Técnico (FSM)*, o resultado deste endpoint **não** vem aninhado: o `success`/`messages` do nível raiz já refletem diretamente se o agendamento foi ou não realizado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| `protocol` | long | Sim | Id do protocolo da solicitação a ser agendada |\n| `catalogServiceId` | long | Sim | Id do catálogo de serviço |\n| `regionId` | long | Sim | Id da região de atendimento |\n| `incidentTypeId` | long | Sim | Id do tipo de solicitação |\n| `newAssignmentId` | long | Não | Id da nova solicitação, quando este agendamento decorre de uma solicitação anterior |\n| `date` | datetime | Sim | Data/hora escolhida para o agendamento |\n| `typeSlot` | int (enum) | Sim | Turno escolhido — `0` Intervalo, `1` Manhã, `2` Tarde, `3` Noite, `99` Sem Agendamento |\n| `hasDefaultSolicitationOrigin` | bool | Sim | Indica se esta é a solicitação de origem |\n| `hasCancelSolicitationOrigin` | bool | Sim | Indica se esta é uma solicitação de cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o agendamento foi realizado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.success` | boolean | Sempre `true` quando o agendamento foi confirmado |\n| `response.data.message` | string | Mensagem de confirmação |\n| `response.data.dateSla` | datetime | Data final do SLA após o agendamento |\n| `response.elapsedTime` | number | Tempo de processamento interno |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | Retorno |\n|---|---|\n| Protocolo não localizado | `success: false`, mensagem \"Não foi possível localizar a solicitação.\" |\n| Solicitação sem região vinculada | `success: false`, mensagem \"Solicitação não possui região definida.\" |\n| Solicitação encerrada | `success: false`, mensagem \"Solicitação encontra-se encerrada.\" |\n| Solicitação cancelada | `success: false`, mensagem \"Solicitação encontra-se cancelada.\" |\n| Solicitação fechada | `success: false`, mensagem \"Não é possível realizar um Agendamento/Reagendamento para uma solicitação fechada!\" |\n| Catálogo de serviço não informado | `success: false`, mensagem \"Catálogo de serviço não informado.\" |\n| Já existe agendamento ativo para a etiqueta de contrato | `success: false`, mensagem \"Já existe um agendamento associado para a etiqueta.\" |\n| Contrato cancelado/encerrado (com `hasCancelSolicitationOrigin: true`) | `success: false`, mensagem \"Não foi possível agendar, seu contrato encontra-se encerrado ou cancelado.\" |\n| `regionId` não informado no corpo | `success: false`, mensagem \"Região do cliente não configurada para atendimento de campo.\" |\n\n## Fluxo relacionado\nUse *Descobrir Slots Disponíveis (FSM)* ou *Buscar Técnicos com Disponibilidade (FSM)* para descobrir horários antes de registrar o agendamento. Ver também *Alocar Técnico (FSM)* para alocar um técnico específico a uma demanda já aberta."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Região do cliente não configurada para atendimento de campo.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"76ccc147-088b-bf7f-c690-87cbf284d869"}],"id":"1ff9f084-3eae-6548-41d0-53fbc45b18e6","_postman_id":"1ff9f084-3eae-6548-41d0-53fbc45b18e6","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Nova Solicitação Externa - Detalhada","id":"32d52b6c-0946-424c-892f-e315f8d450e8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre uma nova solicitação do tipo <strong>Externa</strong> com controle detalhado sobre tipo de solicitação, catálogo, SLA, categorização por matriz e, opcionalmente, agendamento de campo (Field Service) já na abertura.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Somente é possível abrir solicitações usando a nova tela de atendimento de solicitações do tipo <strong>Externa</strong>.</li>\n<li>Não é possível abrir solicitação que necessite de checklist inicial.</li>\n<li>Para abrir solicitação em um contrato bloqueado ou suspenso, a opção \"Contratos bloqueados/suspensos\" precisa estar marcada na parametrização do tipo de solicitação utilizado (rotina \"Serviço / Cadastros / Solicitações - Tipos\").</li>\n<li>Para agendamento automático (<code>schedule</code>), o tipo de solicitação selecionado precisa permitir agendamento de campo.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p><strong>Campos sempre obrigatórios</strong> (validados antes de qualquer outra regra):</p>\n<ul>\n<li><code>personId</code>, <code>incidentTypeId</code>, <code>incidentStatusId</code>, <code>serviceLevelAgreementId</code>, <code>assignment.description</code>.</li>\n<li><code>assignment.priority</code> deve estar entre Normal e Alta.</li>\n</ul>\n<p><strong>incidentStatusId</strong> — status da solicitação:</p>\n<ul>\n<li><strong>1 - Abertura</strong></li>\n<li>2 - Andamento</li>\n<li>3 - Fechamento</li>\n<li>4 - Encerramento</li>\n<li><strong>8 - Cancelado</strong> (não é permitida a abertura já cancelada)</li>\n<li><strong>9 - Ag. Classificação</strong></li>\n</ul>\n<p>Regra cruzada entre <code>incidentStatusId</code> e <code>assignment.report</code>:</p>\n<ul>\n<li>Com status <strong>1, 8 ou 9</strong>: <strong>não</strong> é permitido enviar <code>report.description</code> preenchido (a solicitação nasce sem relato).</li>\n<li>Com qualquer outro status: é <strong>obrigatório</strong> enviar <code>report.description</code> preenchido. Para abrir com status de Abertura ou Ag. Classificação sem relato, envie <code>\"report\": { }</code> com <code>description: null</code>.</li>\n</ul>\n<p><strong>SLA</strong>:</p>\n<ul>\n<li><code>serviceLevelAgreementId = 99</code> identifica o SLA do tipo \"Manual\": nesse caso é obrigatório informar <code>assignment.finalDate</code>, e não é permitido usá-lo junto com <code>incidentStatusId = 9</code>.</li>\n<li>Com qualquer outro SLA, <strong>não</strong> é permitido informar <code>assignment.finalDate</code>.</li>\n</ul>\n<p><strong>personId</strong>: solicitante da solicitação. Pode ser o próprio cliente ou um colaborador. Obrigatório o uso quando for passado um relato em <code>report.description</code>. Para que um colaborador possa abrir a solicitação, o tipo de solicitação precisa ter o parâmetro \"Força Solicitante Interno\" habilitado (rotina \"Serviço / Cadastros / Solicitações - Tipos\" → Parâmetros → aba \"Abertura de Solicitação\").</p>\n<p><strong>clientId</strong>: Id do cliente da solicitação. Obtido no método \"Busca Pessoa por CPF/CNPJ\".</p>\n<p><strong>incidentTypeId</strong>: Id do tipo de solicitação (método \"Tipos de Solicitação\").</p>\n<p><strong>contractServiceTagId</strong>: Id da etiqueta de serviço do contrato (método \"Lista Etiquetas de Contrato\"). <strong>Obrigatório quando o tipo de solicitação for \"Externa\"</strong>.</p>\n<p><strong>catalogServiceId</strong>: Id do catálogo de serviço. <strong>Obrigatório quando o tipo de solicitação estiver marcado como \"Obriga Catálogo de Serviço\"</strong>. Se o tipo de solicitação tiver a opção \"Todo Catálogo\" marcada nos parâmetros, todos os catálogos ficam disponíveis, mesmo os não vinculados a uma etiqueta.</p>\n<p><strong>Categorização por matriz</strong> (<code>solicitationServiceCategory1..5</code>, <code>contractServiceTagCategory</code>): usada apenas quando o estilo de atendimento ativo tem integração com categorias (Integration/WorkspaceV2/Workspace) e <code>solicitationServiceCategory1</code> é enviado.</p>\n<ul>\n<li>A etiqueta informada em <code>contractServiceTagCategory</code> precisa existir e não estar excluída.</li>\n<li>O serviço vinculado à etiqueta precisa existir (senão: \"Nenhum serviço vinculado a etiqueta foi encontrado.\").</li>\n<li>A combinação de categorias precisa apontar para exatamente uma matriz vinculada ao serviço da etiqueta — nenhuma ou mais de uma matriz gera erro.</li>\n<li>O <code>incidentTypeId</code> enviado precisa estar vinculado à matriz encontrada.</li>\n<li>Se <code>catalogServiceId</code> for enviado e divergir do catálogo da matriz, a abertura falha.</li>\n<li>A GUT (Gravidade/Urgência/Tendência) e o SLA usados na solicitação passam a ser os da matriz encontrada.</li>\n</ul>\n<p><strong>catalogServiceItemId / catalogServiceItemClassId</strong>: itens e subitens de serviço do catálogo (métodos \"Lista Itens do Serviço\" / \"Lista Subitens do Serviço\").</p>\n<p><strong>assignment.beginningDate</strong>: data de abertura da solicitação. Só é considerada se a opção \"DT Abertura\" estiver marcada nos parâmetros, aba \"Abertura Solicitação\".</p>\n<p><strong>assignment.report</strong>: obrigatória apenas para o status 4 - Encerramento; não deve ser enviada preenchida na abertura de um protocolo em outro status. Quando não houver relato, envie a estrutura vazia: <code>\"report\": { }</code>.</p>\n<p><strong>assignment.companyPlaceId</strong>: Id do local de atendimento (método \"Lista Locais\"; quando o serviço já tem local, esse valor também vem no método \"Lista Catálogo de Serviço\").</p>\n<p><strong>changeContractServiceTagInitialAttendance</strong>: quando a nova tela de atendimento está ativa e a solicitação é Externa com <code>contractServiceTagId</code> informado, esse booleano define se o atendente poderá trocar a etiqueta de serviço no atendimento inicial.</p>\n<p><strong>schedule</strong> (opcional): solicita o agendamento automático de campo já na abertura.</p>\n<ul>\n<li><code>date</code>: data e horário desejados.</li>\n<li><code>typeSlot</code>: turno desejado.</li>\n<li><code>regionId</code>: opcional; quando não informado, é resolvido automaticamente a partir do endereço do cliente/etiqueta.</li>\n<li>Exige <code>catalogServiceId</code> informado, e que o tipo de solicitação permita agendamento de campo — ambas validações <strong>impedem a abertura da solicitação</strong> se falharem.</li>\n<li>Se o agendamento em si não puder ser confirmado (ex.: sem disponibilidade na data/turno pedidos), a solicitação <strong>já é aberta normalmente</strong> — a resposta traz o protocolo criado e o motivo da falha no agendamento, sem desfazer a abertura.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>incidentStatusId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Status da solicitação (ver valores acima)</td>\n</tr>\n<tr>\n<td>personId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do solicitante</td>\n</tr>\n<tr>\n<td>clientId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do cliente</td>\n</tr>\n<tr>\n<td>incidentTypeId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do tipo de solicitação</td>\n</tr>\n<tr>\n<td>contractServiceTagId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Obrigatório quando o tipo de solicitação for Externa</td>\n</tr>\n<tr>\n<td>catalogServiceId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Obrigatório quando o tipo exige catálogo de serviço, ou quando <code>schedule</code> é enviado</td>\n</tr>\n<tr>\n<td>serviceLevelAgreementId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do SLA. <code>99</code> = Manual (exige <code>assignment.finalDate</code>)</td>\n</tr>\n<tr>\n<td>catalogServiceItemId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do item do catálogo</td>\n</tr>\n<tr>\n<td>catalogServiceItemClassId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do subitem do catálogo</td>\n</tr>\n<tr>\n<td>matrixType</td>\n<td>int</td>\n<td>Não</td>\n<td>Tipo de matriz (ver \"Nova Solicitação Interna - Detalhada\" para uso em matriz interna)</td>\n</tr>\n<tr>\n<td>teamCode</td>\n<td>string</td>\n<td>Não</td>\n<td>Código da equipe (usado principalmente em matriz interna)</td>\n</tr>\n<tr>\n<td>authenticationSiteCode / authenticationAccessPointCode</td>\n<td>string</td>\n<td>Não</td>\n<td>Usados apenas em solicitação Interna</td>\n</tr>\n<tr>\n<td>assignment.title</td>\n<td>string</td>\n<td>Não</td>\n<td>Título da solicitação</td>\n</tr>\n<tr>\n<td>assignment.description</td>\n<td>string</td>\n<td>Sim</td>\n<td>Descrição da solicitação</td>\n</tr>\n<tr>\n<td>assignment.priority</td>\n<td>int</td>\n<td>Sim</td>\n<td>Prioridade (faixa Normal–Alta)</td>\n</tr>\n<tr>\n<td>assignment.beginningDate</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Data de abertura, só se parametrizado</td>\n</tr>\n<tr>\n<td>assignment.finalDate</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Obrigatório se SLA Manual; proibido nos demais</td>\n</tr>\n<tr>\n<td>assignment.report.description</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Ver regra cruzada com <code>incidentStatusId</code> acima</td>\n</tr>\n<tr>\n<td>assignment.companyPlaceId</td>\n<td>long</td>\n<td>Não</td>\n<td>Local de atendimento</td>\n</tr>\n<tr>\n<td>contractServiceTagCategory</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Usado na consulta de matriz por categoria</td>\n</tr>\n<tr>\n<td>solicitationServiceCategory1..5</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Códigos das categorias para consulta de matriz</td>\n</tr>\n<tr>\n<td>changeContractServiceTagInitialAttendance</td>\n<td>bool</td>\n<td>Não</td>\n<td>Libera troca de etiqueta no atendimento inicial (nova tela)</td>\n</tr>\n<tr>\n<td>schedule.date</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Obrigatório se <code>schedule</code> for enviado</td>\n</tr>\n<tr>\n<td>schedule.typeSlot</td>\n<td>int</td>\n<td>Condicional</td>\n<td>Turno; obrigatório se <code>schedule</code> for enviado</td>\n</tr>\n<tr>\n<td>schedule.regionId</td>\n<td>long</td>\n<td>Não</td>\n<td>Região; resolvida automaticamente se omitida</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo criado</td>\n</tr>\n<tr>\n<td><code>response.assignmentId</code></td>\n<td>long</td>\n<td>Id interno da tarefa da solicitação</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string|null</td>\n<td>Mensagens informativas não bloqueantes (ex.: divergência de local vs. etiqueta)</td>\n</tr>\n<tr>\n<td><code>response.scheduleStatus</code></td>\n<td>string|null</td>\n<td><code>\"OK\"</code> ou <code>\"FAILED\"</code>; só aparece quando <code>schedule</code> foi enviado</td>\n</tr>\n<tr>\n<td><code>response.scheduleMessage</code></td>\n<td>string|null</td>\n<td>Motivo da falha do agendamento, quando <code>scheduleStatus = \"FAILED\"</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>O HTTP retornado é sempre <strong>200</strong>, tanto em sucesso quanto em erro de negócio; verifique sempre <code>success</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Campo obrigatório ausente</td>\n<td>Pessoa não informada. / Tipo de solicitação não informado. / Status da solicitação não informado. / Situação (SLA) não informada. / Descritivo da solicitação não informado.</td>\n</tr>\n<tr>\n<td>Abertura com status Cancelado</td>\n<td>Não é permitida a abertura de solicitação já cancelada.</td>\n</tr>\n<tr>\n<td>Relato enviado com status 1, 8 ou 9</td>\n<td>Não é permitida a abertura de solicitação com relato e com o status informado.</td>\n</tr>\n<tr>\n<td>Relato ausente com status diferente de 1, 8 ou 9</td>\n<td>Nâo é permitida a abertura de uma solicitação sem relato.</td>\n</tr>\n<tr>\n<td>Prioridade fora da faixa Normal–Alta</td>\n<td>Prioridade fora do escopo.</td>\n</tr>\n<tr>\n<td>SLA Manual com status Ag. Classificação</td>\n<td>Não é permitida a seleção de sla manual em solicitações aguardando classificação.</td>\n</tr>\n<tr>\n<td><code>assignment.finalDate</code> enviado com SLA diferente de Manual</td>\n<td>Não é permitida a inclusão da data final com sla diferente de manual.</td>\n</tr>\n<tr>\n<td><code>assignment.finalDate</code> ausente com SLA Manual</td>\n<td>Data final (Prazo) da solicitação não informado</td>\n</tr>\n<tr>\n<td>Solicitante inválido (não é recurso/colaborador, não está na equipe do tipo, ou falta o parâmetro \"Força Solicitante Interno\")</td>\n<td>Solicitante inválido para esta solicitação.</td>\n</tr>\n<tr>\n<td>Etiqueta de categorização não encontrada</td>\n<td>Nenhuma etiqueta foi encontrada para consulta das categorias.</td>\n</tr>\n<tr>\n<td>Serviço da etiqueta não encontrado</td>\n<td>Nenhum serviço vinculado a etiqueta foi encontrado.</td>\n</tr>\n<tr>\n<td>Nenhuma matriz vinculada ao serviço da etiqueta</td>\n<td>Não foi encontrado o vínculo entre a matriz enviada e o serviço da etiqueta.</td>\n</tr>\n<tr>\n<td>Mais de uma matriz vinculada ao serviço da etiqueta</td>\n<td>Foi encontrado mais de uma matriz de categoria vinculada ao serviço da etiqueta.</td>\n</tr>\n<tr>\n<td><code>incidentTypeId</code> não vinculado à matriz encontrada</td>\n<td>O tipo de solicitação não está vinculado à matriz selecionada.</td>\n</tr>\n<tr>\n<td>Catálogo enviado diverge do catálogo da matriz</td>\n<td>Catálogo de serviço não presente na matriz selecionada.</td>\n</tr>\n<tr>\n<td>Catálogo de serviço não presente na etiqueta selecionada</td>\n<td>Catálogo de serviço não presente na etiqueta selecionada.</td>\n</tr>\n<tr>\n<td>Usuário autenticado fora da equipe de destino</td>\n<td>Usuário não pode atender este tipo de solicitação</td>\n</tr>\n<tr>\n<td>Tipo de solicitação não encontrado</td>\n<td>Tipo de solicitação não encontrado.</td>\n</tr>\n<tr>\n<td><code>schedule</code> enviado sem <code>catalogServiceId</code></td>\n<td>CatalogServiceId é obrigatório para pré-agendamento.</td>\n</tr>\n<tr>\n<td><code>schedule</code> enviado para tipo que não permite agendamento</td>\n<td>O tipo de solicitação selecionado não permite agendamento.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para uma abertura simples (sem categorização/agendamento), use \"Nova Solicitação - Simplificado\" ou \"Nova Solicitação CRM\".</li>\n<li>Para abertura de solicitações do tipo Interna, use \"Nova Solicitação Interna - Detalhada\".</li>\n<li>Depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\" para relatos e mudanças de status, e \"Realiza manutenção em solicitação\" para trocar a matriz de categorização.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opendetailedsolicitation"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"b13db38a-cf39-475f-be8f-f8d4e588c4e9","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456\n    },\n    \"dataResponseType\": \"<>f__AnonymousType887`3\",\n    \"elapsedTime\": null\n}"},{"id":"b1bde248-4840-493f-91bd-64d9130afe2e","name":"Sucesso — local diferente do local do contrato","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456,\n        \"message\": \"Protocolo aberto para o local \\\"001 - Empresa Teste\\\", pois é o local vinculado ao contrato/etiqueta.\"\n    },\n    \"dataResponseType\": \"<>f__AnonymousType887`3\",\n    \"elapsedTime\": null\n}"},{"id":"6503492d-be4d-4825-88e7-f308333e111a","name":"Sucesso — com categorias","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456\n    },\n    \"dataResponseType\": \"<>f__AnonymousType887`3\",\n    \"elapsedTime\": null\n}"},{"id":"efaf29e2-c37a-aa9b-75b2-c021e3517381","name":"Sucesso — agendamento confirmado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456,\n        \"scheduleStatus\": \"OK\",\n        \"scheduleMessage\": null\n    },\n    \"elapsedTime\": null\n}"},{"id":"6df0fde9-f33e-f659-7ca7-38562837d3a7","name":"Sucesso — falha no agendamento (protocolo aberto)","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456,\n        \"scheduleStatus\": \"FAILED\",\n        \"scheduleMessage\": \"Não há disponibilidade de agenda para a data/turno solicitados.\"\n    },\n    \"elapsedTime\": null\n}"},{"id":"486f438e-a24b-0206-ce28-9d3a89a2c311","name":"Erro — tipo de solicitação não permite agendamento","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"O tipo de solicitação selecionado não permite agendamento.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"af74b1e5-832b-363b-704c-8246fbc060ad","name":"Erro — CatalogServiceId obrigatório para agendamento","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"CatalogServiceId é obrigatório para pré-agendamento.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"32d52b6c-0946-424c-892f-e315f8d450e8"},{"name":"Nova Solicitação Interna- Detalhada","id":"59607a23-49bb-4e79-a1e6-ad90444f4e8c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre uma nova solicitação do tipo <strong>Interna</strong> com controle detalhado sobre tipo de solicitação, catálogo, SLA, categorização por matriz interna, equipe, local, site/ponto de acesso e, opcionalmente, agendamento de campo (Field Service) já na abertura. Usa o mesmo endpoint de \"Nova Solicitação Externa - Detalhada\"; o que diferencia o fluxo Interno é <code>matrixType = 2</code>.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Não é possível abrir solicitação que necessite de checklist inicial.</li>\n<li>Não existe parametrização de matriz padrão para solicitação interna (diferente da Externa, que tem matriz/tipo padrão nos parâmetros).</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p><strong>Campos sempre obrigatórios</strong> (validados antes de qualquer outra regra):</p>\n<ul>\n<li><code>personId</code>, <code>incidentTypeId</code>, <code>incidentStatusId</code>, <code>serviceLevelAgreementId</code>, <code>assignment.description</code>.</li>\n<li><code>assignment.priority</code> deve estar entre Normal e Alta.</li>\n</ul>\n<p><strong>incidentStatusId</strong> — status da solicitação:</p>\n<ul>\n<li><strong>1 - Abertura</strong></li>\n<li>2 - Andamento</li>\n<li>3 - Fechamento</li>\n<li>4 - Encerramento</li>\n<li><strong>8 - Cancelado</strong> (não é permitida a abertura já cancelada)</li>\n<li><strong>9 - Ag. Classificação</strong></li>\n</ul>\n<p>Regra cruzada entre <code>incidentStatusId</code> e <code>assignment.report</code>:</p>\n<ul>\n<li>Com status <strong>1, 8 ou 9</strong>: <strong>não</strong> é permitido enviar <code>report.description</code> preenchido.</li>\n<li>Com qualquer outro status: é <strong>obrigatório</strong> enviar <code>report.description</code> preenchido. Para abrir com status de Abertura ou Ag. Classificação sem relato, envie <code>\"report\": { }</code> com <code>description: null</code>.</li>\n</ul>\n<p><strong>SLA</strong>:</p>\n<ul>\n<li><code>serviceLevelAgreementId = 99</code> identifica o SLA do tipo \"Manual\": nesse caso é obrigatório informar <code>assignment.finalDate</code>, e não é permitido usá-lo junto com <code>incidentStatusId = 9</code>.</li>\n<li>Com qualquer outro SLA, <strong>não</strong> é permitido informar <code>assignment.finalDate</code>.</li>\n</ul>\n<p><strong>matrixType</strong>: enviar o valor <strong>2</strong> para identificar a solicitação como Interna. Com <code>matrixType = 2</code>, a busca de matriz de categoria não passa pela etiqueta de contrato: usa a combinação de <code>teamCode</code> + catálogo.</p>\n<p><strong>teamCode</strong>: código da equipe que possui vínculo com o catálogo e com a matriz encontrada pelas categorias. Obrigatório quando <code>solicitationServiceCategory1</code> é enviado (fluxo com categorização por matriz).</p>\n<p><strong>Categorização por matriz interna</strong> (<code>solicitationServiceCategory1..5</code>): usada apenas quando o estilo de atendimento ativo tem integração com categorias (Integration/WorkspaceV2/Workspace) e <code>solicitationServiceCategory1</code> é enviado.</p>\n<ul>\n<li><code>teamCode</code> e <code>assignment.companyPlaceId</code> são obrigatórios nesse fluxo.</li>\n<li>A combinação de categorias precisa apontar para exatamente uma matriz do tipo Interno vinculada às categorias — nenhuma ou mais de uma matriz gera erro.</li>\n<li>O <code>incidentTypeId</code> enviado precisa estar vinculado à matriz encontrada.</li>\n<li>Além disso, a matriz encontrada precisa estar entre as matrizes internas liberadas para a solicitação (mesma checagem usada por \"Realiza manutenção em solicitação\").</li>\n<li>A GUT (Gravidade/Urgência/Tendência) e o SLA usados na solicitação passam a ser os da matriz encontrada.</li>\n<li>Se <code>catalogServiceId</code> for enviado e divergir do catálogo da matriz, a abertura falha.</li>\n</ul>\n<p><strong>Site / Ponto de acesso</strong>: a solicitação interna pode ser vinculada a um site (local físico) ou a um ponto de acesso (equipamento), por código de negócio, resolvidos para o Id interno.</p>\n<ul>\n<li>Se o tipo de solicitação tiver o parâmetro \"Obriga site\" marcado, <code>authenticationSiteCode</code> é obrigatório.</li>\n<li>Se o tipo de solicitação tiver o parâmetro \"Obriga ponto de acesso\" marcado, <code>authenticationAccessPointCode</code> é obrigatório.</li>\n<li>Um código informado que não existe (ou está inativo/excluído) gera erro específico com o código enviado na mensagem.</li>\n<li>Quando site/ponto de acesso é resolvido e tem endereço com localização, a região da solicitação é resolvida automaticamente a partir desse endereço (usada, por exemplo, para o agendamento).</li>\n</ul>\n<p><strong>personId</strong>: solicitante da solicitação. Para que um colaborador possa abrir a solicitação, o tipo de solicitação precisa ter o parâmetro \"Força Solicitante Interno\" habilitado (rotina \"Serviço / Cadastros / Solicitações - Tipos\" → Parâmetros → aba \"Abertura de Solicitação\").</p>\n<p><strong>incidentTypeId</strong>: Id do tipo de solicitação (método \"Tipos de Solicitação\").</p>\n<p><strong>serviceLevelAgreementId</strong>: Id do SLA (método \"Lista Catálogo de Serviços\"; cadastrado em \"Service Desk / Cadastros / Situações de Solicitações\").</p>\n<p><strong>assignment.beginningDate</strong>: data de abertura. Só é considerada se a opção \"DT Abertura\" estiver marcada nos parâmetros, aba \"Abertura Solicitação\".</p>\n<p><strong>assignment.report</strong>: obrigatória apenas para o status 4 - Encerramento; não deve ser enviada preenchida na abertura em outro status. Quando não houver relato, envie <code>\"report\": { }</code>.</p>\n<p><strong>assignment.companyPlaceId</strong>: Id do local de atendimento (método \"Lista Locais\"). Para que a solicitação respeite as regras de abertura por local definidas no tipo de solicitação:</p>\n<ul>\n<li>O tipo de solicitação precisa ter regra de abertura para o local;</li>\n<li>O local enviado precisa ter vínculo com a equipe na regra de abertura do tipo de solicitação;</li>\n<li>A equipe enviada também precisa estar vinculada ao catálogo de serviço enviado, para que o protocolo possa ser direcionado a ela.</li>\n<li>Se alguma dessas condições não for atendida, o protocolo é aberto para o local enviado e a equipe definida como padrão no tipo de solicitação.</li>\n</ul>\n<p><strong>solicitationServiceCategory1..5</strong>: código das categorias para a consulta da matriz.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>incidentStatusId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Status da solicitação (ver valores acima)</td>\n</tr>\n<tr>\n<td>personId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do solicitante</td>\n</tr>\n<tr>\n<td>clientId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do cliente, quando aplicável</td>\n</tr>\n<tr>\n<td>incidentTypeId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do tipo de solicitação</td>\n</tr>\n<tr>\n<td>catalogServiceId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Obrigatório se <code>schedule</code> for enviado, ou se o catálogo divergir do da matriz</td>\n</tr>\n<tr>\n<td>serviceLevelAgreementId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do SLA. <code>99</code> = Manual (exige <code>assignment.finalDate</code>)</td>\n</tr>\n<tr>\n<td>catalogServiceItemId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do item do catálogo</td>\n</tr>\n<tr>\n<td>catalogServiceItemClassId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id do subitem do catálogo</td>\n</tr>\n<tr>\n<td>matrixType</td>\n<td>int</td>\n<td>Sim</td>\n<td>Enviar <code>2</code> para solicitação Interna</td>\n</tr>\n<tr>\n<td>teamCode</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>solicitationServiceCategory1</code> é enviado</td>\n</tr>\n<tr>\n<td>authenticationSiteCode</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Obrigatório quando o tipo de solicitação exige site</td>\n</tr>\n<tr>\n<td>authenticationAccessPointCode</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Obrigatório quando o tipo de solicitação exige ponto de acesso</td>\n</tr>\n<tr>\n<td>assignment.title</td>\n<td>string</td>\n<td>Não</td>\n<td>Título da solicitação</td>\n</tr>\n<tr>\n<td>assignment.description</td>\n<td>string</td>\n<td>Sim</td>\n<td>Descrição da solicitação</td>\n</tr>\n<tr>\n<td>assignment.priority</td>\n<td>int</td>\n<td>Sim</td>\n<td>Prioridade (faixa Normal–Alta)</td>\n</tr>\n<tr>\n<td>assignment.beginningDate</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Data de abertura, só se parametrizado</td>\n</tr>\n<tr>\n<td>assignment.finalDate</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Obrigatório se SLA Manual; proibido nos demais</td>\n</tr>\n<tr>\n<td>assignment.report.description</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Ver regra cruzada com <code>incidentStatusId</code> acima</td>\n</tr>\n<tr>\n<td>assignment.companyPlaceId</td>\n<td>long</td>\n<td>Não</td>\n<td>Local de atendimento; ver regras de equipe/local acima</td>\n</tr>\n<tr>\n<td>solicitationServiceCategory1..5</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Códigos das categorias para consulta de matriz</td>\n</tr>\n<tr>\n<td>schedule.date</td>\n<td>datetime</td>\n<td>Condicional</td>\n<td>Obrigatório se <code>schedule</code> for enviado</td>\n</tr>\n<tr>\n<td>schedule.typeSlot</td>\n<td>int</td>\n<td>Condicional</td>\n<td>Turno; obrigatório se <code>schedule</code> for enviado</td>\n</tr>\n<tr>\n<td>schedule.regionId</td>\n<td>long</td>\n<td>Não</td>\n<td>Região; resolvida automaticamente pelo site/ponto de acesso se omitida</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo criado</td>\n</tr>\n<tr>\n<td><code>response.assignmentId</code></td>\n<td>long</td>\n<td>Id interno da tarefa da solicitação</td>\n</tr>\n<tr>\n<td><code>response.scheduleStatus</code></td>\n<td>string|null</td>\n<td><code>\"OK\"</code> ou <code>\"FAILED\"</code>; só aparece quando <code>schedule</code> foi enviado</td>\n</tr>\n<tr>\n<td><code>response.scheduleMessage</code></td>\n<td>string|null</td>\n<td>Motivo da falha do agendamento, quando <code>scheduleStatus = \"FAILED\"</code></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>O HTTP retornado é sempre <strong>200</strong>, tanto em sucesso quanto em erro de negócio; verifique sempre <code>success</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Campo obrigatório ausente</td>\n<td>Pessoa não informada. / Tipo de solicitação não informado. / Status da solicitação não informado. / Situação (SLA) não informada. / Descritivo da solicitação não informado.</td>\n</tr>\n<tr>\n<td>Abertura com status Cancelado</td>\n<td>Não é permitida a abertura de solicitação já cancelada.</td>\n</tr>\n<tr>\n<td>Relato enviado com status 1, 8 ou 9</td>\n<td>Não é permitida a abertura de solicitação com relato e com o status informado.</td>\n</tr>\n<tr>\n<td>Relato ausente com status diferente de 1, 8 ou 9</td>\n<td>Nâo é permitida a abertura de uma solicitação sem relato.</td>\n</tr>\n<tr>\n<td>Prioridade fora da faixa Normal–Alta</td>\n<td>Prioridade fora do escopo.</td>\n</tr>\n<tr>\n<td>SLA Manual com status Ag. Classificação</td>\n<td>Não é permitida a seleção de sla manual em solicitações aguardando classificação.</td>\n</tr>\n<tr>\n<td><code>assignment.finalDate</code> enviado com SLA diferente de Manual</td>\n<td>Não é permitida a inclusão da data final com sla diferente de manual.</td>\n</tr>\n<tr>\n<td><code>assignment.finalDate</code> ausente com SLA Manual</td>\n<td>Data final (Prazo) da solicitação não informado</td>\n</tr>\n<tr>\n<td>Solicitante inválido (não é recurso/colaborador, não está na equipe do tipo, ou falta o parâmetro \"Força Solicitante Interno\")</td>\n<td>Solicitante inválido para esta solicitação.</td>\n</tr>\n<tr>\n<td><code>teamCode</code> ausente com categorização enviada</td>\n<td>O código da equipe não foi informado.</td>\n</tr>\n<tr>\n<td><code>assignment.companyPlaceId</code> ausente com categorização enviada</td>\n<td>O Local não foi Informado.</td>\n</tr>\n<tr>\n<td>Nenhuma matriz interna vinculada à equipe/catálogo</td>\n<td>Não foi encontrado o vínculo entre a Equipe e Catalogo informado.</td>\n</tr>\n<tr>\n<td>Mais de uma matriz interna vinculada à equipe/catálogo</td>\n<td>Foi encontrado mais de uma matriz de categoria vinculada ao catalogo.</td>\n</tr>\n<tr>\n<td><code>incidentTypeId</code> não vinculado à matriz encontrada</td>\n<td>O tipo de solicitação não está vinculado à matriz selecionada.</td>\n</tr>\n<tr>\n<td>Matriz encontrada não está liberada para a solicitação</td>\n<td>Matriz informada não pode ser usada nessa solicitação, verifique os dados informados.</td>\n</tr>\n<tr>\n<td>Catálogo enviado diverge do catálogo da matriz</td>\n<td>Catálogo de serviço não presente na matriz selecionada.</td>\n</tr>\n<tr>\n<td>Usuário autenticado fora da equipe de destino</td>\n<td>Usuário não pode atender este tipo de solicitação</td>\n</tr>\n<tr>\n<td><code>authenticationSiteCode</code> obrigatório e não informado</td>\n<td>Não foi informado Site para abertura de Protocolo Interno.</td>\n</tr>\n<tr>\n<td><code>authenticationAccessPointCode</code> obrigatório e não informado</td>\n<td>Não foi informado Ponto de Acesso para abertura de Protocolo Interno.</td>\n</tr>\n<tr>\n<td><code>authenticationSiteCode</code> não encontrado/inativo</td>\n<td>Site não encontrado para o código informado: {código}.</td>\n</tr>\n<tr>\n<td><code>authenticationAccessPointCode</code> não encontrado/inativo</td>\n<td>Ponto de acesso não encontrado para o código informado: {código}.</td>\n</tr>\n<tr>\n<td>Tipo de solicitação não encontrado</td>\n<td>Tipo de solicitação não encontrado.</td>\n</tr>\n<tr>\n<td><code>schedule</code> enviado sem <code>catalogServiceId</code></td>\n<td>CatalogServiceId é obrigatório para pré-agendamento.</td>\n</tr>\n<tr>\n<td><code>schedule</code> enviado para tipo que não permite agendamento</td>\n<td>O tipo de solicitação selecionado não permite agendamento.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para abertura de solicitações do tipo Externa, use \"Nova Solicitação Externa - Detalhada\".</li>\n<li>Depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\" para relatos e mudanças de status, e \"Realiza manutenção em solicitação\" para trocar a matriz de categorização.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opendetailedsolicitation"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"d8f850c0-5cf7-4b63-900c-46f04e72d82f","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"protocol\": 123,\n        \"assignmentId\": 456,\n        \"scheduleStatus\": \"OK\",\n        \"scheduleMessage\": null\n    },\n    \"elapsedTime\": null\n}"},{"id":"56d15d86-e402-4643-85c4-43b63b9d2900","name":"Erro — Site não encontrado para o código informado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"incidentStatusId\": 1,\n    \"personId\": 1234,\n    \"clientId\": 311234,\n    \"incidentTypeId\": 1,\n    \"contractServiceTagId\": 12345,\n    \"catalogServiceId\": 1,\n    \"serviceLevelAgreementId\": 6,\n    \"catalogServiceItemId\": 2,\n    \"catalogServiceItemClassId\": 1,\n    \"matrixType\": 1,\n    \"teamCode\": \"0123\",\n    \"authenticationSiteCode\": \"string\",\n    \"authenticationAccessPointCode\": \"string\",\n    \"assignment\": {\n        \"title\": \"teste\",\n        \"description\": \"teste\",\n        \"priority\": 1,\n        \"beginningDate\": \"\",\n        \"finalDate\": \"\",\n        \"report\": {\n            \"beginningDate\": \"\",\n            \"finalDate\": \"\",\n            \"description\": \"teste\"\n        },\n        \"companyPlaceId\": 1\n    },\n    \"contractServiceTagCategory\": \"string\",\n    \"solicitationServiceCategory1\": \"string\",\n    \"solicitationServiceCategory2\": \"string\",\n    \"solicitationServiceCategory3\": \"string\",\n    \"solicitationServiceCategory4\": \"string\",\n    \"solicitationServiceCategory5\": \"string\",\n    \"schedule\": {\n        \"date\": \"2026-09-20T08:00:00\",\n        \"typeSlot\": 1,\n        \"regionId\": null\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/opendetailedsolicitation","description":"## Propósito\nAbre uma nova solicitação do tipo **Interna** com controle detalhado sobre tipo de solicitação, catálogo, SLA, categorização por matriz interna, equipe, local, site/ponto de acesso e, opcionalmente, agendamento de campo (Field Service) já na abertura. Usa o mesmo endpoint de \"Nova Solicitação Externa - Detalhada\"; o que diferencia o fluxo Interno é `matrixType = 2`.\n\n## Pré-requisitos\n- Não é possível abrir solicitação que necessite de checklist inicial.\n- Não existe parametrização de matriz padrão para solicitação interna (diferente da Externa, que tem matriz/tipo padrão nos parâmetros).\n\n## Regras de negócio\n\n**Campos sempre obrigatórios** (validados antes de qualquer outra regra):\n- `personId`, `incidentTypeId`, `incidentStatusId`, `serviceLevelAgreementId`, `assignment.description`.\n- `assignment.priority` deve estar entre Normal e Alta.\n\n**incidentStatusId** — status da solicitação:\n- **1 - Abertura**\n- 2 - Andamento\n- 3 - Fechamento\n- 4 - Encerramento\n- **8 - Cancelado** (não é permitida a abertura já cancelada)\n- **9 - Ag. Classificação**\n\nRegra cruzada entre `incidentStatusId` e `assignment.report`:\n- Com status **1, 8 ou 9**: **não** é permitido enviar `report.description` preenchido.\n- Com qualquer outro status: é **obrigatório** enviar `report.description` preenchido. Para abrir com status de Abertura ou Ag. Classificação sem relato, envie `\"report\": { }` com `description: null`.\n\n**SLA**:\n- `serviceLevelAgreementId = 99` identifica o SLA do tipo \"Manual\": nesse caso é obrigatório informar `assignment.finalDate`, e não é permitido usá-lo junto com `incidentStatusId = 9`.\n- Com qualquer outro SLA, **não** é permitido informar `assignment.finalDate`.\n\n**matrixType**: enviar o valor **2** para identificar a solicitação como Interna. Com `matrixType = 2`, a busca de matriz de categoria não passa pela etiqueta de contrato: usa a combinação de `teamCode` + catálogo.\n\n**teamCode**: código da equipe que possui vínculo com o catálogo e com a matriz encontrada pelas categorias. Obrigatório quando `solicitationServiceCategory1` é enviado (fluxo com categorização por matriz).\n\n**Categorização por matriz interna** (`solicitationServiceCategory1..5`): usada apenas quando o estilo de atendimento ativo tem integração com categorias (Integration/WorkspaceV2/Workspace) e `solicitationServiceCategory1` é enviado.\n- `teamCode` e `assignment.companyPlaceId` são obrigatórios nesse fluxo.\n- A combinação de categorias precisa apontar para exatamente uma matriz do tipo Interno vinculada às categorias — nenhuma ou mais de uma matriz gera erro.\n- O `incidentTypeId` enviado precisa estar vinculado à matriz encontrada.\n- Além disso, a matriz encontrada precisa estar entre as matrizes internas liberadas para a solicitação (mesma checagem usada por \"Realiza manutenção em solicitação\").\n- A GUT (Gravidade/Urgência/Tendência) e o SLA usados na solicitação passam a ser os da matriz encontrada.\n- Se `catalogServiceId` for enviado e divergir do catálogo da matriz, a abertura falha.\n\n**Site / Ponto de acesso**: a solicitação interna pode ser vinculada a um site (local físico) ou a um ponto de acesso (equipamento), por código de negócio, resolvidos para o Id interno.\n- Se o tipo de solicitação tiver o parâmetro \"Obriga site\" marcado, `authenticationSiteCode` é obrigatório.\n- Se o tipo de solicitação tiver o parâmetro \"Obriga ponto de acesso\" marcado, `authenticationAccessPointCode` é obrigatório.\n- Um código informado que não existe (ou está inativo/excluído) gera erro específico com o código enviado na mensagem.\n- Quando site/ponto de acesso é resolvido e tem endereço com localização, a região da solicitação é resolvida automaticamente a partir desse endereço (usada, por exemplo, para o agendamento).\n\n**personId**: solicitante da solicitação. Para que um colaborador possa abrir a solicitação, o tipo de solicitação precisa ter o parâmetro \"Força Solicitante Interno\" habilitado (rotina \"Serviço / Cadastros / Solicitações - Tipos\" → Parâmetros → aba \"Abertura de Solicitação\").\n\n**incidentTypeId**: Id do tipo de solicitação (método \"Tipos de Solicitação\").\n\n**serviceLevelAgreementId**: Id do SLA (método \"Lista Catálogo de Serviços\"; cadastrado em \"Service Desk / Cadastros / Situações de Solicitações\").\n\n**assignment.beginningDate**: data de abertura. Só é considerada se a opção \"DT Abertura\" estiver marcada nos parâmetros, aba \"Abertura Solicitação\".\n\n**assignment.report**: obrigatória apenas para o status 4 - Encerramento; não deve ser enviada preenchida na abertura em outro status. Quando não houver relato, envie `\"report\": { }`.\n\n**assignment.companyPlaceId**: Id do local de atendimento (método \"Lista Locais\"). Para que a solicitação respeite as regras de abertura por local definidas no tipo de solicitação:\n- O tipo de solicitação precisa ter regra de abertura para o local;\n- O local enviado precisa ter vínculo com a equipe na regra de abertura do tipo de solicitação;\n- A equipe enviada também precisa estar vinculada ao catálogo de serviço enviado, para que o protocolo possa ser direcionado a ela.\n- Se alguma dessas condições não for atendida, o protocolo é aberto para o local enviado e a equipe definida como padrão no tipo de solicitação.\n\n**solicitationServiceCategory1..5**: código das categorias para a consulta da matriz.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| incidentStatusId | long | Sim | Status da solicitação (ver valores acima) |\n| personId | long | Sim | Id do solicitante |\n| clientId | long | Não | Id do cliente, quando aplicável |\n| incidentTypeId | long | Sim | Id do tipo de solicitação |\n| catalogServiceId | long | Condicional | Obrigatório se `schedule` for enviado, ou se o catálogo divergir do da matriz |\n| serviceLevelAgreementId | long | Sim | Id do SLA. `99` = Manual (exige `assignment.finalDate`) |\n| catalogServiceItemId | long | Não | Id do item do catálogo |\n| catalogServiceItemClassId | long | Não | Id do subitem do catálogo |\n| matrixType | int | Sim | Enviar `2` para solicitação Interna |\n| teamCode | string | Condicional | Obrigatório quando `solicitationServiceCategory1` é enviado |\n| authenticationSiteCode | string | Condicional | Obrigatório quando o tipo de solicitação exige site |\n| authenticationAccessPointCode | string | Condicional | Obrigatório quando o tipo de solicitação exige ponto de acesso |\n| assignment.title | string | Não | Título da solicitação |\n| assignment.description | string | Sim | Descrição da solicitação |\n| assignment.priority | int | Sim | Prioridade (faixa Normal–Alta) |\n| assignment.beginningDate | datetime | Condicional | Data de abertura, só se parametrizado |\n| assignment.finalDate | datetime | Condicional | Obrigatório se SLA Manual; proibido nos demais |\n| assignment.report.description | string | Condicional | Ver regra cruzada com `incidentStatusId` acima |\n| assignment.companyPlaceId | long | Não | Local de atendimento; ver regras de equipe/local acima |\n| solicitationServiceCategory1..5 | string | Condicional | Códigos das categorias para consulta de matriz |\n| schedule.date | datetime | Condicional | Obrigatório se `schedule` for enviado |\n| schedule.typeSlot | int | Condicional | Turno; obrigatório se `schedule` for enviado |\n| schedule.regionId | long | Não | Região; resolvida automaticamente pelo site/ponto de acesso se omitida |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.protocol` | long | Número do protocolo criado |\n| `response.assignmentId` | long | Id interno da tarefa da solicitação |\n| `response.scheduleStatus` | string\\|null | `\"OK\"` ou `\"FAILED\"`; só aparece quando `schedule` foi enviado |\n| `response.scheduleMessage` | string\\|null | Motivo da falha do agendamento, quando `scheduleStatus = \"FAILED\"` |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\nO HTTP retornado é sempre **200**, tanto em sucesso quanto em erro de negócio; verifique sempre `success`.\n\n## Erros comuns\n\n| Situação | Mensagem |\n|---|---|\n| Campo obrigatório ausente | Pessoa não informada. / Tipo de solicitação não informado. / Status da solicitação não informado. / Situação (SLA) não informada. / Descritivo da solicitação não informado. |\n| Abertura com status Cancelado | Não é permitida a abertura de solicitação já cancelada. |\n| Relato enviado com status 1, 8 ou 9 | Não é permitida a abertura de solicitação com relato e com o status informado. |\n| Relato ausente com status diferente de 1, 8 ou 9 | Nâo é permitida a abertura de uma solicitação sem relato. |\n| Prioridade fora da faixa Normal–Alta | Prioridade fora do escopo. |\n| SLA Manual com status Ag. Classificação | Não é permitida a seleção de sla manual em solicitações aguardando classificação. |\n| `assignment.finalDate` enviado com SLA diferente de Manual | Não é permitida a inclusão da data final com sla diferente de manual. |\n| `assignment.finalDate` ausente com SLA Manual | Data final (Prazo) da solicitação não informado |\n| Solicitante inválido (não é recurso/colaborador, não está na equipe do tipo, ou falta o parâmetro \"Força Solicitante Interno\") | Solicitante inválido para esta solicitação. |\n| `teamCode` ausente com categorização enviada | O código da equipe não foi informado. |\n| `assignment.companyPlaceId` ausente com categorização enviada | O Local não foi Informado. |\n| Nenhuma matriz interna vinculada à equipe/catálogo | Não foi encontrado o vínculo entre a Equipe e Catalogo informado. |\n| Mais de uma matriz interna vinculada à equipe/catálogo | Foi encontrado mais de uma matriz de categoria vinculada ao catalogo. |\n| `incidentTypeId` não vinculado à matriz encontrada | O tipo de solicitação não está vinculado à matriz selecionada. |\n| Matriz encontrada não está liberada para a solicitação | Matriz informada não pode ser usada nessa solicitação, verifique os dados informados. |\n| Catálogo enviado diverge do catálogo da matriz | Catálogo de serviço não presente na matriz selecionada. |\n| Usuário autenticado fora da equipe de destino | Usuário não pode atender este tipo de solicitação |\n| `authenticationSiteCode` obrigatório e não informado | Não foi informado Site para abertura de Protocolo Interno. |\n| `authenticationAccessPointCode` obrigatório e não informado | Não foi informado Ponto de Acesso para abertura de Protocolo Interno. |\n| `authenticationSiteCode` não encontrado/inativo | Site não encontrado para o código informado: {código}. |\n| `authenticationAccessPointCode` não encontrado/inativo | Ponto de acesso não encontrado para o código informado: {código}. |\n| Tipo de solicitação não encontrado | Tipo de solicitação não encontrado. |\n| `schedule` enviado sem `catalogServiceId` | CatalogServiceId é obrigatório para pré-agendamento. |\n| `schedule` enviado para tipo que não permite agendamento | O tipo de solicitação selecionado não permite agendamento. |\n\n## Fluxo relacionado\n- Para abertura de solicitações do tipo Externa, use \"Nova Solicitação Externa - Detalhada\".\n- Depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\" para relatos e mudanças de status, e \"Realiza manutenção em solicitação\" para trocar a matriz de categorização."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\"Site não encontrado para o código informado: ST-001.\"],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"59607a23-49bb-4e79-a1e6-ad90444f4e8c"},{"name":"Nova Solicitação - Simplificado","id":"e4da416c-29cd-4c88-9369-d3ce5c46b8eb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"clientId\": 1,\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1,\n    \"close\": false\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitation","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre uma nova solicitação de forma simplificada, com o cliente também como solicitante, usando o tipo de solicitação e o local padrão configurados no ERP para abertura via API.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Na rotina \"Suíte / Configurações / Parâmetros\", menu \"Service Desk\", item \"Abre Solicitação - Via API\", devem estar configurados:</p>\n<ul>\n<li>Tipo de solicitação;</li>\n<li>Local padrão.</li>\n</ul>\n<p>Sem essa parametrização, a API retorna erro.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>clientId</code> enviado é usado tanto como cliente quanto como solicitante (<code>personId</code>) da solicitação.</li>\n<li>A solicitação é sempre aberta com status <strong>1 - Abertura</strong>, exceto quando <code>close = true</code> (ver abaixo).</li>\n<li>Quando o tipo de solicitação parametrizado é do tipo <strong>Externa</strong>, é obrigatório informar <code>contractId</code> ou <code>contractServiceTagId</code>.</li>\n<li><strong>contractServiceTagId</strong>: se informado, é validado que a etiqueta existe e não está excluída. Se também for informado <code>contractId</code>, a etiqueta precisa pertencer a esse contrato.</li>\n<li><strong>contractId</strong>: se informado, é validado que o contrato existe e não está excluído.</li>\n<li>Se <strong>apenas</strong> <code>contractId</code> for informado (sem <code>contractServiceTagId</code>), o sistema resolve automaticamente a primeira etiqueta de serviço ativa e não excluída vinculada a esse contrato.</li>\n<li><code>close = true</code>: a solicitação já é aberta com status <strong>4 - Encerramento</strong>, com um relato automático \"Solicitação encerrada automaticamente.\" e o cliente como responsável pelo relato.</li>\n<li>Ao abrir a solicitação, a unidade de negócio do contrato (ou do contrato da etiqueta) é vinculada automaticamente à solicitação.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>description</td>\n<td>string</td>\n<td>Sim</td>\n<td>Descrição da solicitação</td>\n</tr>\n<tr>\n<td>clientId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do cliente; também usado como solicitante</td>\n</tr>\n<tr>\n<td>contractId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Id do contrato. Obrigatório (junto ou no lugar de <code>contractServiceTagId</code>) quando o tipo de solicitação parametrizado for Externa</td>\n</tr>\n<tr>\n<td>contractServiceTagId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Id da etiqueta de serviço do contrato. Mesma condição acima. Enviar vazio quando não for necessário</td>\n</tr>\n<tr>\n<td>close</td>\n<td>bool</td>\n<td>Sim</td>\n<td>Quando <code>true</code>, a solicitação já é aberta encerrada (status 4), com relato automático</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver campos abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td><code>\"OK\"</code> em sucesso, <code>\"ERROR\"</code> em erro de negócio</td>\n</tr>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo criado (presente apenas quando <code>status = \"OK\"</code>)</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Mensagem de erro (presente apenas quando <code>status = \"ERROR\"</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Esse método foge do padrão do envelope: em caso de erro de negócio, a mensagem <strong>não</strong> vai em <code>messages</code> (que permanece <code>null</code>) — ela vai dentro de <code>response.message</code>. O HTTP retornado é sempre <strong>200</strong>, mesmo em erro de negócio; verifique sempre <code>response.status</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno (<code>response.message</code>)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Parametrização \"Abre Solicitação - Via API\" ausente</td>\n<td>Parâmetros não configurados para abertura de solicitação.</td>\n</tr>\n<tr>\n<td>Tipo Externa sem contrato nem etiqueta</td>\n<td>Necessário informar um contrato ou etiqueta de serviço para abrir uma solicitação do tipo Externa</td>\n</tr>\n<tr>\n<td><code>contractServiceTagId</code> inexistente/excluído</td>\n<td>Etiqueta de serviço inválida</td>\n</tr>\n<tr>\n<td><code>contractId</code> inexistente/excluído</td>\n<td>Contrato inválido</td>\n</tr>\n<tr>\n<td>Etiqueta informada não pertence ao contrato informado</td>\n<td>Etiqueta de serviço não pertence ao contrato</td>\n</tr>\n<tr>\n<td>Falha inesperada ao criar a solicitação</td>\n<td>Erro ao abrir a solicitação.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para abertura com mais controle sobre tipo de solicitação, SLA, catálogo e categorização, use \"Nova Solicitação Externa - Detalhada\" ou \"Nova Solicitação Interna - Detalhada\".</li>\n<li>Para adicionar relatos e mudar o status depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opensolicitation"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"677c5130-127e-4be8-b943-7ef2daf0ca02","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"clientId\": 1,\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1,\n    \"close\": false\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/opensolicitation"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"protocol\": 111111\n    },\n    \"elapsedTime\": null\n}"},{"id":"78e06d49-bd47-4264-87d2-e2f40422a64f","name":"Erro — Parâmetros não configurados","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"clientId\": 1,\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1,\n    \"close\": false\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitation","description":"## Propósito\nAbre uma nova solicitação de forma simplificada, com o cliente também como solicitante, usando o tipo de solicitação e o local padrão configurados no ERP para abertura via API.\n\n## Pré-requisitos\nNa rotina \"Suíte / Configurações / Parâmetros\", menu \"Service Desk\", item \"Abre Solicitação - Via API\", devem estar configurados:\n- Tipo de solicitação;\n- Local padrão.\n\nSem essa parametrização, a API retorna erro.\n\n## Regras de negócio\n- O `clientId` enviado é usado tanto como cliente quanto como solicitante (`personId`) da solicitação.\n- A solicitação é sempre aberta com status **1 - Abertura**, exceto quando `close = true` (ver abaixo).\n- Quando o tipo de solicitação parametrizado é do tipo **Externa**, é obrigatório informar `contractId` ou `contractServiceTagId`.\n- **contractServiceTagId**: se informado, é validado que a etiqueta existe e não está excluída. Se também for informado `contractId`, a etiqueta precisa pertencer a esse contrato.\n- **contractId**: se informado, é validado que o contrato existe e não está excluído.\n- Se **apenas** `contractId` for informado (sem `contractServiceTagId`), o sistema resolve automaticamente a primeira etiqueta de serviço ativa e não excluída vinculada a esse contrato.\n- `close = true`: a solicitação já é aberta com status **4 - Encerramento**, com um relato automático \"Solicitação encerrada automaticamente.\" e o cliente como responsável pelo relato.\n- Ao abrir a solicitação, a unidade de negócio do contrato (ou do contrato da etiqueta) é vinculada automaticamente à solicitação.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| description | string | Sim | Descrição da solicitação |\n| clientId | long | Sim | Id do cliente; também usado como solicitante |\n| contractId | long | Condicional | Id do contrato. Obrigatório (junto ou no lugar de `contractServiceTagId`) quando o tipo de solicitação parametrizado for Externa |\n| contractServiceTagId | long | Condicional | Id da etiqueta de serviço do contrato. Mesma condição acima. Enviar vazio quando não for necessário |\n| close | bool | Sim | Quando `true`, a solicitação já é aberta encerrada (status 4), com relato automático |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object | Mesma estrutura em sucesso e erro — ver campos abaixo. |\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.status` | string | `\"OK\"` em sucesso, `\"ERROR\"` em erro de negócio |\n| `response.protocol` | long | Número do protocolo criado (presente apenas quando `status = \"OK\"`) |\n| `response.message` | string | Mensagem de erro (presente apenas quando `status = \"ERROR\"`) |\n\n⚠ Esse método foge do padrão do envelope: em caso de erro de negócio, a mensagem **não** vai em `messages` (que permanece `null`) — ela vai dentro de `response.message`. O HTTP retornado é sempre **200**, mesmo em erro de negócio; verifique sempre `response.status`.\n\n## Erros comuns\n\n| Situação | Retorno (`response.message`) |\n|---|---|\n| Parametrização \"Abre Solicitação - Via API\" ausente | Parâmetros não configurados para abertura de solicitação. |\n| Tipo Externa sem contrato nem etiqueta | Necessário informar um contrato ou etiqueta de serviço para abrir uma solicitação do tipo Externa |\n| `contractServiceTagId` inexistente/excluído | Etiqueta de serviço inválida |\n| `contractId` inexistente/excluído | Contrato inválido |\n| Etiqueta informada não pertence ao contrato informado | Etiqueta de serviço não pertence ao contrato |\n| Falha inesperada ao criar a solicitação | Erro ao abrir a solicitação. |\n\n## Fluxo relacionado\n- Para abertura com mais controle sobre tipo de solicitação, SLA, catálogo e categorização, use \"Nova Solicitação Externa - Detalhada\" ou \"Nova Solicitação Interna - Detalhada\".\n- Para adicionar relatos e mudar o status depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"ERROR\",\n        \"message\": \"Parâmetros não configurados para abertura de solicitação.\"\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"e4da416c-29cd-4c88-9369-d3ce5c46b8eb"},{"name":"Nova Solicitação CRM","id":"31418936-e13d-467b-910e-6b446a83a7b9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Obtido no método de autenticação</p>\n"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitationcrm","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre uma nova solicitação para o setor Comercial (CRM), usando o tipo de solicitação, local e responsável configurados no ERP para abertura via API a partir do CRM.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Na rotina \"Suíte / Configurações / Parâmetros\", menu \"CRM\", item \"Abre Solicitação para o Comercial - Via API\", devem estar configurados:</p>\n<ul>\n<li>Tipo de solicitação;</li>\n<li>Local padrão;</li>\n<li>Responsável.</li>\n</ul>\n<p>Sem essa parametrização, a API retorna erro.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O solicitante (<code>personId</code>) e o responsável da solicitação são sempre a pessoa parametrizada em \"Responsável\", não o <code>contractId</code>/<code>contractServiceTagId</code> enviado.</li>\n<li>Quando o tipo de solicitação parametrizado é do tipo <strong>Externa</strong>, é obrigatório informar <code>contractId</code> ou <code>contractServiceTagId</code>.</li>\n<li><strong>contractServiceTagId</strong>: se informado, é validado que a etiqueta existe e não está excluída. Se também for informado <code>contractId</code>, a etiqueta precisa pertencer a esse contrato.</li>\n<li><strong>contractId</strong>: se informado, é validado que o contrato existe e não está excluído.</li>\n<li>Se <strong>apenas</strong> <code>contractId</code> for informado (sem <code>contractServiceTagId</code>), o sistema resolve automaticamente a primeira etiqueta de serviço ativa e não excluída vinculada a esse contrato. Caso não seja necessário o uso de etiqueta, basta enviar o campo vazio.</li>\n<li>SLA: se o tipo de solicitação parametrizado não tiver um SLA/tipo de SLA fixo, o sistema busca uma restrição de SLA cadastrada na configuração extra do tipo de solicitação; se não houver nenhuma restrição cadastrada, a abertura falha.</li>\n<li>O protocolo criado é resolvido buscando a solicitação mais recente com a mesma <code>description</code> enviada — evite reaproveitar a mesma descrição em chamadas concorrentes para não haver ambiguidade na resolução do protocolo retornado.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>description</td>\n<td>string</td>\n<td>Sim</td>\n<td>Descrição da solicitação</td>\n</tr>\n<tr>\n<td>contractId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Id do contrato. Obrigatório (junto ou no lugar de <code>contractServiceTagId</code>) quando o tipo de solicitação parametrizado for Externa</td>\n</tr>\n<tr>\n<td>contractServiceTagId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Id da etiqueta de serviço do contrato. Mesma condição acima. Enviar vazio quando não for necessário</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver campos abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td><code>\"OK\"</code> em sucesso, <code>\"ERROR\"</code> em erro de negócio</td>\n</tr>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo criado (presente apenas quando <code>status = \"OK\"</code>)</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Mensagem de erro (presente apenas quando <code>status = \"ERROR\"</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Esse método foge do padrão do envelope: em caso de erro de negócio, a mensagem <strong>não</strong> vai em <code>messages</code> (que permanece <code>null</code>) — ela vai dentro de <code>response.message</code>. O HTTP retornado é sempre <strong>200</strong>, mesmo em erro de negócio; verifique sempre <code>response.status</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno (<code>response.message</code>)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Parametrização \"Abre Solicitação para o Comercial - Via API\" ausente</td>\n<td>Parâmetros não configurados para abertura de solicitação.</td>\n</tr>\n<tr>\n<td>Tipo Externa sem contrato nem etiqueta</td>\n<td>Necessário informar um contrato ou etiqueta de serviço para abrir uma solicitação do tipo Externa</td>\n</tr>\n<tr>\n<td><code>contractServiceTagId</code> inexistente/excluído</td>\n<td>Etiqueta de serviço inválida</td>\n</tr>\n<tr>\n<td><code>contractId</code> inexistente/excluído</td>\n<td>Contrato inválido</td>\n</tr>\n<tr>\n<td>Etiqueta informada não pertence ao contrato informado</td>\n<td>Etiqueta de serviço não pertence ao contrato</td>\n</tr>\n<tr>\n<td>Tipo de solicitação sem SLA fixo e sem restrição de SLA cadastrada</td>\n<td>Nenhuma restrição de SLA cadastrada no tipo de solicitação</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para abertura com mais controle sobre tipo de solicitação, SLA, catálogo e categorização, use \"Nova Solicitação Externa - Detalhada\".</li>\n<li>Para adicionar relatos e mudar o status depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opensolicitationcrm"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"51b5360b-7a6f-4249-acff-998252a48fbb","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/opensolicitationcrm"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"protocol\": 111111\n    },\n    \"elapsedTime\": null\n}"},{"id":"eca4bb58-da74-465b-87a2-8e585d899471","name":"Erro — Sem restrição de SLA cadastrada","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"Obtido no método de autenticação"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"description\": \"teste\",\n    \"contractId\": 1,\n    \"contractServiceTagId\": 1\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitationcrm","description":"## Propósito\nAbre uma nova solicitação para o setor Comercial (CRM), usando o tipo de solicitação, local e responsável configurados no ERP para abertura via API a partir do CRM.\n\n## Pré-requisitos\nNa rotina \"Suíte / Configurações / Parâmetros\", menu \"CRM\", item \"Abre Solicitação para o Comercial - Via API\", devem estar configurados:\n- Tipo de solicitação;\n- Local padrão;\n- Responsável.\n\nSem essa parametrização, a API retorna erro.\n\n## Regras de negócio\n- O solicitante (`personId`) e o responsável da solicitação são sempre a pessoa parametrizada em \"Responsável\", não o `contractId`/`contractServiceTagId` enviado.\n- Quando o tipo de solicitação parametrizado é do tipo **Externa**, é obrigatório informar `contractId` ou `contractServiceTagId`.\n- **contractServiceTagId**: se informado, é validado que a etiqueta existe e não está excluída. Se também for informado `contractId`, a etiqueta precisa pertencer a esse contrato.\n- **contractId**: se informado, é validado que o contrato existe e não está excluído.\n- Se **apenas** `contractId` for informado (sem `contractServiceTagId`), o sistema resolve automaticamente a primeira etiqueta de serviço ativa e não excluída vinculada a esse contrato. Caso não seja necessário o uso de etiqueta, basta enviar o campo vazio.\n- SLA: se o tipo de solicitação parametrizado não tiver um SLA/tipo de SLA fixo, o sistema busca uma restrição de SLA cadastrada na configuração extra do tipo de solicitação; se não houver nenhuma restrição cadastrada, a abertura falha.\n- O protocolo criado é resolvido buscando a solicitação mais recente com a mesma `description` enviada — evite reaproveitar a mesma descrição em chamadas concorrentes para não haver ambiguidade na resolução do protocolo retornado.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| description | string | Sim | Descrição da solicitação |\n| contractId | long | Condicional | Id do contrato. Obrigatório (junto ou no lugar de `contractServiceTagId`) quando o tipo de solicitação parametrizado for Externa |\n| contractServiceTagId | long | Condicional | Id da etiqueta de serviço do contrato. Mesma condição acima. Enviar vazio quando não for necessário |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object | Mesma estrutura em sucesso e erro — ver campos abaixo. |\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.status` | string | `\"OK\"` em sucesso, `\"ERROR\"` em erro de negócio |\n| `response.protocol` | long | Número do protocolo criado (presente apenas quando `status = \"OK\"`) |\n| `response.message` | string | Mensagem de erro (presente apenas quando `status = \"ERROR\"`) |\n\n⚠ Esse método foge do padrão do envelope: em caso de erro de negócio, a mensagem **não** vai em `messages` (que permanece `null`) — ela vai dentro de `response.message`. O HTTP retornado é sempre **200**, mesmo em erro de negócio; verifique sempre `response.status`.\n\n## Erros comuns\n\n| Situação | Retorno (`response.message`) |\n|---|---|\n| Parametrização \"Abre Solicitação para o Comercial - Via API\" ausente | Parâmetros não configurados para abertura de solicitação. |\n| Tipo Externa sem contrato nem etiqueta | Necessário informar um contrato ou etiqueta de serviço para abrir uma solicitação do tipo Externa |\n| `contractServiceTagId` inexistente/excluído | Etiqueta de serviço inválida |\n| `contractId` inexistente/excluído | Contrato inválido |\n| Etiqueta informada não pertence ao contrato informado | Etiqueta de serviço não pertence ao contrato |\n| Tipo de solicitação sem SLA fixo e sem restrição de SLA cadastrada | Nenhuma restrição de SLA cadastrada no tipo de solicitação |\n\n## Fluxo relacionado\n- Para abertura com mais controle sobre tipo de solicitação, SLA, catálogo e categorização, use \"Nova Solicitação Externa - Detalhada\".\n- Para adicionar relatos e mudar o status depois de aberta, use \"Adiciona Relato e altera Status da Solicitação\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"ERROR\",\n        \"message\": \"Nenhuma restrição de SLA cadastrada no tipo de solicitação\"\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"31418936-e13d-467b-910e-6b446a83a7b9"},{"name":"Nova Solicitação para Ponto de Acesso","id":"15078573-b230-4485-8b98-fbd0716c250f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitationpopeventerror/{{integrationCode}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre (ou reaproveita, se já em manutenção) uma solicitação de monitoramento vinculada a um ponto de acesso, identificado pelo código de integração na URL.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Só pode ser chamado a partir de um IP autorizado, se o tenant tiver uma lista de IPs configurada para pontos de acesso.</li>\n<li>O parâmetro de sistema de monitoramento de ponto de acesso precisa estar ativo, e os parâmetros de tipo de solicitação/filial/previsão de retorno/responsável precisam estar todos configurados no tenant.</li>\n<li>O tipo de solicitação configurado para ponto de acesso não pode ser do tipo Externa.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>integrationcode</code> (path)</td>\n<td>Sim</td>\n<td>Código de integração do ponto de acesso. Precisa existir cadastrado.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Não recebe corpo de requisição.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Se o ponto de acesso <strong>não</strong> estiver em manutenção, cria uma nova solicitação.</li>\n<li>Se <strong>já</strong> estiver em manutenção (por uma chamada anterior), reaproveita a mesma solicitação em vez de duplicar — chamar duas vezes seguidas não abre dois protocolos.</li>\n<li>SLA, tipo de SLA e status iniciais são sempre atribuídos automaticamente pelo sistema.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a solicitação é aberta ou reaproveitada; <code>false</code> nos erros listados em \"Erros comuns\" (sempre com HTTP 200).</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver campos abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td><code>\"OK\"</code> no sucesso, <code>\"ERROR\"</code> nos erros listados em \"Erros comuns\"</td>\n</tr>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo da solicitação aberta (ou reaproveitada, se já em manutenção). Só presente quando <code>status</code> é <code>\"OK\"</code></td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Texto do erro, um dos listados em \"Erros comuns\". Só presente quando <code>status</code> é <code>\"ERROR\"</code></td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Nos erros, <code>messages</code> vem como array, mas sem a mensagem de fato — o texto do erro está em <code>response.message</code>, não em <code>messages</code>. O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>IP de origem não autorizado (quando configurado)</td>\n<td>\"Tentativa de acesso bloqueado para o IP: {ip}\"</td>\n</tr>\n<tr>\n<td>Monitoramento de ponto de acesso não ativo</td>\n<td>\"O monitoramento de ponto de acesso não está ativo\"</td>\n</tr>\n<tr>\n<td>Código de integração não cadastrado</td>\n<td>\"Ponto de acesso não localizado para o código de integração {integrationcode}.\"</td>\n</tr>\n<tr>\n<td>Parâmetros de tenant não configurados</td>\n<td>\"Parâmetros não configurados para abertura de solicitação de monitoramento de ponto de acesso.\"</td>\n</tr>\n<tr>\n<td>Tipo de solicitação configurado é do tipo Externa</td>\n<td>\"O Tipo de Solicitação configurado não pode ser do tipo externa.\"</td>\n</tr>\n<tr>\n<td>Ponto de acesso em manutenção mas sem incidente ativo localizável</td>\n<td>\"O ponto de acesso está em manutenção, porém não foi possível localizar o incidente massivo.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Par de \"Encerra Solicitação para Ponto de Acesso\" — use o mesmo <code>integrationcode</code> para encerrar.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opensolicitationpopeventerror","{{integrationCode}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"8a73170e-587a-4cfc-a37f-f678ef66979d","name":"Nova Solicitação para Ponto de Acesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/opensolicitationpopeventerror/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"protocol\": 654321\n    },\n    \"dataResponseType\": \"<>f__AnonymousType524`2\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"15078573-b230-4485-8b98-fbd0716c250f"},{"name":"Realiza manutenção em solicitação","id":"6ef21253-d9d3-46c9-b19d-1a418b0f6492","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"protocol\": \"string\", // Número do protocolo\n    \"solicitationServiceMatrixCode\": \"string\",  // Código da matriz\n    \"incidentTypeCode\": \"string\", // Código do novo tipo de solicitação\n    \"report\": \"string \" // Texto para ser incluído no relato de manutenção\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/solicitationmaintenance","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Altera a matriz de categorização de um protocolo já aberto. Essa alteração também altera, em cascata, o tipo de solicitação, o SLA (prazo/situação) e a matriz GUT (Gravidade/Urgência/Tendência) do protocolo, registrando um relato automático com o resumo do que mudou.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>A matriz informada precisa existir, estar ativa, e ser do mesmo tipo (Interna/Externa) do tipo de solicitação atual do protocolo.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O protocolo não pode estar em execução, cancelado (status 8, ou <code>Assignment.Status = 9</code>) nem encerrado (status 4) — a manutenção é bloqueada nesses casos.</li>\n<li>A nova matriz precisa ser do mesmo tipo (Interna/Externa) do tipo de solicitação atual do protocolo.</li>\n<li>Se <code>incidentTypeCode</code> for informado, o tipo de solicitação buscado por esse código precisa:<ul>\n<li>existir, estar ativo e não excluído;</li>\n<li>ser compatível com o tipo da matriz (matriz Interna não aceita tipo de solicitação Externo e vice-versa);</li>\n<li>estar vinculado à matriz informada.</li>\n</ul>\n</li>\n<li>Se <code>incidentTypeCode</code> <strong>não</strong> for informado, o sistema usa o primeiro tipo de solicitação vinculado à matriz que seja compatível com o tipo dela (Interna/Externa).</li>\n<li>A matriz também precisa estar entre as matrizes liberadas para a solicitação: para matriz <strong>Interna</strong>, verificada pela combinação protocolo + catálogo (mesma checagem usada na abertura detalhada Interna); para matriz <strong>Externa</strong>, verificada pelo serviço vinculado à etiqueta de contrato do protocolo (se a etiqueta do protocolo não tiver serviço vinculado, a manutenção com matriz Externa falha).</li>\n<li>O SLA (data final) é recalculado a partir da matriz nova e da data de abertura do protocolo.</li>\n<li>É gerado automaticamente um relato no protocolo, com o texto informado em <code>report</code> como título (ou \"Manutenção do protocolo realizada via API\" quando <code>report</code> não é enviado) e um resumo das mudanças (tipo de solicitação, matriz, SLA, criticidade e peso GUT, de/para).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>protocol</td>\n<td>long/string</td>\n<td>Sim</td>\n<td>Número do protocolo</td>\n</tr>\n<tr>\n<td>solicitationServiceMatrixCode</td>\n<td>string</td>\n<td>Sim</td>\n<td>Código da nova matriz de categorização</td>\n</tr>\n<tr>\n<td>incidentTypeCode</td>\n<td>string</td>\n<td>Não</td>\n<td>Código do novo tipo de solicitação. Se omitido, usa o primeiro tipo compatível vinculado à matriz</td>\n</tr>\n<tr>\n<td>report</td>\n<td>string</td>\n<td>Não</td>\n<td>Texto do relato automático de manutenção. Se omitido, usa \"Manutenção do protocolo realizada via API\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>O HTTP retornado é sempre <strong>200</strong>, tanto em sucesso quanto em erro de negócio; verifique sempre <code>success</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>protocol</code> ausente ou zero</td>\n<td>É obrigatório informar o número do Protocolo.</td>\n</tr>\n<tr>\n<td><code>solicitationServiceMatrixCode</code> ausente</td>\n<td>É obrigatório informar o código da Matriz.</td>\n</tr>\n<tr>\n<td>Protocolo inexistente</td>\n<td>Protocolo não encontrado.</td>\n</tr>\n<tr>\n<td>Protocolo em execução</td>\n<td>Protocolo está em execução.</td>\n</tr>\n<tr>\n<td>Protocolo cancelado</td>\n<td>Protocolo está cancelado.</td>\n</tr>\n<tr>\n<td>Protocolo encerrado</td>\n<td>Protocolo está Encerrado.</td>\n</tr>\n<tr>\n<td>Matriz inexistente, inativa ou excluída</td>\n<td>Matriz não encontrada ou inativa.</td>\n</tr>\n<tr>\n<td>Matriz de tipo diferente do tipo de solicitação atual do protocolo</td>\n<td>Matriz informada não pode ser usada nessa solicitação, verifique os dados informados.</td>\n</tr>\n<tr>\n<td>Matriz não liberada para o protocolo (Interna: catálogo; Externa: etiqueta sem serviço vinculado)</td>\n<td>Matriz informada não pode ser usada nessa solicitação, verifique os dados informados. / Etiqueta do Protocolo não possui serviço vinculado.</td>\n</tr>\n<tr>\n<td><code>incidentTypeCode</code> inexistente, inativo ou excluído</td>\n<td>Tipo de solicitação não encontrada ou inativa.</td>\n</tr>\n<tr>\n<td><code>incidentTypeCode</code> incompatível com o tipo da matriz (Interna x Externa)</td>\n<td>Tipo da Matriz e da solicitação não são compatíveis, verifique os dados informados.</td>\n</tr>\n<tr>\n<td><code>incidentTypeCode</code> não vinculado à matriz informada</td>\n<td>Tipo de solicitação informado não pode ser usado na matriz informada.</td>\n</tr>\n<tr>\n<td>Solicitação possui projeto vinculado e o novo tipo não aceita uso em projeto</td>\n<td>Não é possível alterar o tipo de solicitação, pois a solicitação não aceita uso em projeto</td>\n</tr>\n<tr>\n<td>Mudança para status conclusivo (Fechamento/Encerramento/Cancelado/Improdutivo) com mensagem ativa pendente no protocolo</td>\n<td>Bloqueia a manutenção (mensagem de acordo com a regra de mensagem ativa)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para adicionar apenas um relato ou mudar o status sem trocar a categorização, use \"Adiciona Relato e altera Status da Solicitação\".</li>\n<li>Para abrir uma nova solicitação já categorizada, use \"Nova Solicitação Externa - Detalhada\" ou \"Nova Solicitação Interna - Detalhada\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","solicitationmaintenance"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"feb924bf-77a5-48f5-a790-0c0fb14e01c8","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"protocol\": \"12345\",\n    \"solicitationServiceMatrixCode\": \"001\", \n    \"incidentTypeCode\": \"1.2.3\",\n    \"report\": \"Manutenção realizada via API - Documentação \"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/solicitationmaintenance"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Manutenção de solicitação efetuada com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"7f773d3e-e2b0-4e5b-97b1-d30aafa99c0d","name":"Erro — Protocolo encerrado","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"protocol\": \"string\", // Número do protocolo\n    \"solicitationServiceMatrixCode\": \"string\",  // Código da matriz\n    \"incidentTypeCode\": \"string\", // Código do novo tipo de solicitação\n    \"report\": \"string \" // Texto para ser incluído no relato de manutenção\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/solicitationmaintenance","description":"## Propósito\nAltera a matriz de categorização de um protocolo já aberto. Essa alteração também altera, em cascata, o tipo de solicitação, o SLA (prazo/situação) e a matriz GUT (Gravidade/Urgência/Tendência) do protocolo, registrando um relato automático com o resumo do que mudou.\n\n## Pré-requisitos\nA matriz informada precisa existir, estar ativa, e ser do mesmo tipo (Interna/Externa) do tipo de solicitação atual do protocolo.\n\n## Regras de negócio\n- O protocolo não pode estar em execução, cancelado (status 8, ou `Assignment.Status = 9`) nem encerrado (status 4) — a manutenção é bloqueada nesses casos.\n- A nova matriz precisa ser do mesmo tipo (Interna/Externa) do tipo de solicitação atual do protocolo.\n- Se `incidentTypeCode` for informado, o tipo de solicitação buscado por esse código precisa:\n  - existir, estar ativo e não excluído;\n  - ser compatível com o tipo da matriz (matriz Interna não aceita tipo de solicitação Externo e vice-versa);\n  - estar vinculado à matriz informada.\n- Se `incidentTypeCode` **não** for informado, o sistema usa o primeiro tipo de solicitação vinculado à matriz que seja compatível com o tipo dela (Interna/Externa).\n- A matriz também precisa estar entre as matrizes liberadas para a solicitação: para matriz **Interna**, verificada pela combinação protocolo + catálogo (mesma checagem usada na abertura detalhada Interna); para matriz **Externa**, verificada pelo serviço vinculado à etiqueta de contrato do protocolo (se a etiqueta do protocolo não tiver serviço vinculado, a manutenção com matriz Externa falha).\n- O SLA (data final) é recalculado a partir da matriz nova e da data de abertura do protocolo.\n- É gerado automaticamente um relato no protocolo, com o texto informado em `report` como título (ou \"Manutenção do protocolo realizada via API\" quando `report` não é enviado) e um resumo das mudanças (tipo de solicitação, matriz, SLA, criticidade e peso GUT, de/para).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| protocol | long/string | Sim | Número do protocolo |\n| solicitationServiceMatrixCode | string | Sim | Código da nova matriz de categorização |\n| incidentTypeCode | string | Não | Código do novo tipo de solicitação. Se omitido, usa o primeiro tipo compatível vinculado à matriz |\n| report | string | Não | Texto do relato automático de manutenção. Se omitido, usa \"Manutenção do protocolo realizada via API\" |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Sempre `null`, tanto em sucesso quanto em erro. |\n\nO HTTP retornado é sempre **200**, tanto em sucesso quanto em erro de negócio; verifique sempre `success`.\n\n## Erros comuns\n\n| Situação | Mensagem |\n|---|---|\n| `protocol` ausente ou zero | É obrigatório informar o número do Protocolo. |\n| `solicitationServiceMatrixCode` ausente | É obrigatório informar o código da Matriz. |\n| Protocolo inexistente | Protocolo não encontrado. |\n| Protocolo em execução | Protocolo está em execução. |\n| Protocolo cancelado | Protocolo está cancelado. |\n| Protocolo encerrado | Protocolo está Encerrado. |\n| Matriz inexistente, inativa ou excluída | Matriz não encontrada ou inativa. |\n| Matriz de tipo diferente do tipo de solicitação atual do protocolo | Matriz informada não pode ser usada nessa solicitação, verifique os dados informados. |\n| Matriz não liberada para o protocolo (Interna: catálogo; Externa: etiqueta sem serviço vinculado) | Matriz informada não pode ser usada nessa solicitação, verifique os dados informados. / Etiqueta do Protocolo não possui serviço vinculado. |\n| `incidentTypeCode` inexistente, inativo ou excluído | Tipo de solicitação não encontrada ou inativa. |\n| `incidentTypeCode` incompatível com o tipo da matriz (Interna x Externa) | Tipo da Matriz e da solicitação não são compatíveis, verifique os dados informados. |\n| `incidentTypeCode` não vinculado à matriz informada | Tipo de solicitação informado não pode ser usado na matriz informada. |\n| Solicitação possui projeto vinculado e o novo tipo não aceita uso em projeto | Não é possível alterar o tipo de solicitação, pois a solicitação não aceita uso em projeto |\n| Mudança para status conclusivo (Fechamento/Encerramento/Cancelado/Improdutivo) com mensagem ativa pendente no protocolo | Bloqueia a manutenção (mensagem de acordo com a regra de mensagem ativa) |\n\n## Fluxo relacionado\n- Para adicionar apenas um relato ou mudar o status sem trocar a categorização, use \"Adiciona Relato e altera Status da Solicitação\".\n- Para abrir uma nova solicitação já categorizada, use \"Nova Solicitação Externa - Detalhada\" ou \"Nova Solicitação Interna - Detalhada\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Protocolo está Encerrado.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"6ef21253-d9d3-46c9-b19d-1a418b0f6492"},{"name":"Encerra Solicitação para Ponto de Acesso","id":"376a71e9-108f-4487-b954-141e6577d3fd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/closesolicitationpopeventerror/{{integrationCode}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Encerra a solicitação de monitoramento aberta anteriormente para um ponto de acesso, usando o mesmo código de integração da abertura.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Mesma restrição de IP autorizado de \"Nova Solicitação para Ponto de Acesso\", quando configurada.</li>\n<li>O parâmetro de sistema de monitoramento de ponto de acesso precisa estar ativo, e o parâmetro de responsável precisa estar configurado no tenant.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>integrationcode</code> (path)</td>\n<td>Sim</td>\n<td>Código de integração do ponto de acesso.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Não recebe corpo de requisição.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Só encerra um ponto de acesso que esteja <strong>atualmente em manutenção</strong> (ou seja, com uma solicitação aberta via \"Nova Solicitação para Ponto de Acesso\").</li>\n<li>Encerrar sem ter aberto antes (ou encerrar duas vezes seguidas) retorna a mesma mensagem de \"não localizado\" — essa mensagem não diferencia \"código de integração inexistente\" de \"ponto de acesso existe mas não está em manutenção\".</li>\n</ul>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Encerra o relato/protocolo (status alterado para Encerrado), zera a marcação de manutenção do ponto de acesso, e finaliza o incidente de monitoramento vinculado.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a solicitação é encerrada; <code>false</code> nos erros listados em \"Erros comuns\" (sempre com HTTP 200).</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver campos abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td><code>\"OK\"</code> no sucesso, <code>\"ERROR\"</code> nos erros listados em \"Erros comuns\"</td>\n</tr>\n<tr>\n<td><code>response.protocol</code></td>\n<td>long</td>\n<td>Número do protocolo da solicitação encerrada. Só presente quando <code>status</code> é <code>\"OK\"</code></td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Texto do erro, um dos listados em \"Erros comuns\". Só presente quando <code>status</code> é <code>\"ERROR\"</code></td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Nos erros, <code>messages</code> vem como array, mas sem a mensagem de fato — o texto do erro está em <code>response.message</code>, não em <code>messages</code>. O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>IP de origem não autorizado (quando configurado)</td>\n<td>\"Tentativa de acesso bloqueado para o IP: {ip}\"</td>\n</tr>\n<tr>\n<td>Monitoramento de ponto de acesso não ativo</td>\n<td>\"O monitoramento de ponto de acesso não está ativo\"</td>\n</tr>\n<tr>\n<td>Parâmetro de responsável não configurado</td>\n<td>\"Parâmetros não configurados para abertura de solicitação de monitoramento de ponto de acesso.\" (mensagem reaproveitada da abertura, mesmo sendo encerramento)</td>\n</tr>\n<tr>\n<td>Ponto de acesso não está em manutenção, ou <code>integrationcode</code> inexistente</td>\n<td>\"Ponto de acesso não localizado para o código de integração {integrationcode}.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Deve ser chamado após \"Nova Solicitação para Ponto de Acesso\", com o mesmo <code>integrationcode</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","closesolicitationpopeventerror","{{integrationCode}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"a56029f2-7990-4f23-a2f2-b6ecdeb35a08","name":"Encerra solicitação para Ponto de Acesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/closesolicitationpopeventerror/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"protocol\": 123456\n    },\n    \"dataResponseType\": \"<>f__AnonymousType524`2\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"376a71e9-108f-4487-b954-141e6577d3fd"},{"name":"Nova Solicitação para Cliente","id":"127919dd-fdcc-4df7-bdc4-3d029b783813","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/opensolicitationclienteventerror/{{clientId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Abre uma nova solicitação de monitoramento vinculada a um cliente, identificado pelo Id na URL.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Os parâmetros de tipo de solicitação/filial/previsão de retorno/responsável para monitoramento de cliente precisam estar todos configurados no tenant.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientid</code> (path)</td>\n<td>Sim</td>\n<td>Id do cliente para o qual a solicitação será aberta.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Não recebe corpo de requisição.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><strong>Não permite abrir duas solicitações simultâneas para o mesmo cliente</strong>: se já existir uma solicitação de monitoramento em aberto para o cliente, a chamada é rejeitada (diferente do endpoint equivalente de Ponto de Acesso, que reaproveita em vez de rejeitar).</li>\n<li>Se o tipo de solicitação configurado for do tipo Externa, o cliente precisa ter contrato ativo com etiqueta de serviço aprovada.</li>\n<li>SLA, tipo de SLA e status iniciais são sempre atribuídos automaticamente pelo sistema.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Mensagem de confirmação textual (<code>\"Solicitação aberta com sucesso\"</code>), sem outros dados estruturados.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Parâmetros de tenant não configurados</td>\n<td>\"Parâmetros não configurados para abertura de solicitação de monitoramento de cliente.\"</td>\n</tr>\n<tr>\n<td>Já existe solicitação aberta para o cliente</td>\n<td>\"Já existe uma solicitação de monitoramento aberta para esse cliente\"</td>\n</tr>\n<tr>\n<td>Cliente não encontrado</td>\n<td>\"Cliente não encontrado\"</td>\n</tr>\n<tr>\n<td>Tipo de solicitação Externa sem contrato ativo</td>\n<td>\"Não foi possível abrir uma solicitação do tipo Externa pois cliente não tem contrato ativo\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Par de \"Encerra Solicitação para Cliente\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","opensolicitationclienteventerror","{{clientId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"18c73df5-6d2c-4001-922a-2d20e9b8fa6f","name":"Nova Solicitação para Cliente","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/opensolicitationclienteventerror/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": \"Solicitação aberta com sucesso\",\n    \"dataResponseType\": \"String\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"127919dd-fdcc-4df7-bdc4-3d029b783813"},{"name":"Encerra Solicitação para Cliente","id":"baca389e-e793-43ec-9ea1-b68159d63d52","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/closesolicitationclienteventerror/{{clientId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Encerra a solicitação de monitoramento aberta anteriormente para um cliente.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientid</code> (path)</td>\n<td>Sim</td>\n<td>Id do cliente.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Não recebe corpo de requisição.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Só encerra uma solicitação que esteja de fato em aberto para o cliente.</li>\n</ul>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Encerra o relato/protocolo com uma descrição automática (\"Evento de retorno gerado automaticamente via monitoramento de cliente.\").</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Mensagem de confirmação textual (<code>\"Solicitação encerrada com sucesso\"</code>), sem outros dados estruturados.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Não há solicitação de monitoramento aberta para o cliente</td>\n<td>\"Não foi possível encontrar uma solicitação de monitoramento aberta para esse cliente\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive no erro acima.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Deve ser chamado após \"Nova Solicitação para Cliente\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","closesolicitationclienteventerror","{{clientId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"1cce2479-cf5e-4f6d-9e71-292013db14cd","name":"Encerra Solicitação para Cliente","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/closesolicitationclienteventerror/123456"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": \"Solicitação encerrada com sucesso\",\n    \"dataResponseType\": \"String\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"baca389e-e793-43ec-9ea1-b68159d63d52"},{"name":"Adiciona Apontamento em Solicitação","id":"09416dd0-2942-4654-8518-fe7d8763eefc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0,\n    \"personId\": 0,\n    \"title\": \"string\",\n    \"description\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/solicitationnewnote","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Adiciona um apontamento (nota) em uma solicitação, em nome de uma pessoa informada. O apontamento é espelhado como <strong>comentário público, visível ao cliente final</strong> — não é uma nota interna.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>assignmentId</code></td>\n<td>Sim (validado)</td>\n<td>Id da solicitação/protocolo.</td>\n</tr>\n<tr>\n<td><code>personId</code></td>\n<td>Sim (validado)</td>\n<td>Id de qualquer pessoa cadastrada no sistema. Não precisa ser técnico/atendente nem ter usuário vinculado — é usada só como autor do apontamento.</td>\n</tr>\n<tr>\n<td><code>title</code></td>\n<td>Não validado</td>\n<td>Título do apontamento.</td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>Não validado</td>\n<td>Texto do apontamento. Se vazio, o registro é criado mas <strong>não gera nenhum comentário visível</strong> para o cliente.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Não é possível registrar apontamento em uma solicitação já encerrada ou cancelada (quando ela tem um protocolo de fato associado).</li>\n<li><code>personId</code> não precisa pertencer à equipe do protocolo — qualquer pessoa cadastrada pode ser usada como autor.</li>\n</ul>\n<h2 id=\"atenção--comportamento-de-erro-não-convencional\">Atenção — comportamento de erro não convencional</h2>\n<blockquote>\n<p><strong>Este endpoint sempre retorna <code>success: true</code> no corpo da resposta, mesmo em erro de negócio.</strong> O único indicador confiável de erro é o campo aninhado <code>response.Status</code> (<code>\"ERROR\"</code> vs <code>\"OK\"</code>) — <strong>não use o campo <code>success</code> de nível superior para checar sucesso/falha neste endpoint específico</strong>, diferente de todos os outros endpoints desta collection.</p>\n</blockquote>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><strong>Sempre <code>true</code>, inclusive nos erros de negócio listados em \"Erros comuns\"</strong> — este endpoint não usa este campo para indicar falha (ver \"Atenção — comportamento de erro não convencional\" acima).</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver campos abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.status</code></td>\n<td>string</td>\n<td><code>\"OK\"</code> quando o apontamento foi registrado; <code>\"ERROR\"</code> nos erros listados em \"Erros comuns\". Único indicador confiável de falha.</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td><code>\"Apontamento realizado com sucesso\"</code> quando <code>status</code> é <code>\"OK\"</code>; um dos textos listados em \"Erros comuns\" quando <code>status</code> é <code>\"ERROR\"</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno (em <code>response.Status</code> / <code>response.Message</code>, com <code>success: true</code> no topo)</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Solicitação não encontrada</td>\n<td>\"Solicitação não encontrada\"</td>\n</tr>\n<tr>\n<td>Pessoa não encontrada</td>\n<td>\"Pessoa não encontrada\"</td>\n</tr>\n<tr>\n<td>Solicitação já encerrada ou cancelada</td>\n<td>\"Não é possível registrar apontamentos em protocolos que já foram cancelados ou encerrados.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","solicitationnewnote"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"a87f3f98-6c9e-48d8-80d5-8194866a70b1","name":"Adiciona Apontamento em Solicitação","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0,\n    \"personId\": 0,\n    \"title\": \"string\",\n    \"description\": \"string\"\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/solicitationnewnote"},"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"status\": \"OK\",\n        \"message\": \"Apontamento realizado com sucesso\"\n    },\n    \"dataResponseType\": \"<>f__AnonymousType485`2\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"09416dd0-2942-4654-8518-fe7d8763eefc"},{"name":"Adiciona Relato e altera Status da Solicitação","id":"7601412f-dba6-4a6a-820a-cbd7435b3d30","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0,\n    \"protocol\": 0,\n    \"incidentStatusId\": 0,\n    \"description\": \"string\",\n    \"progress\": 0,\n    \"priority\": 0,\n    \"notificationTarget\": 0,\n    \"privateReport\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/createsolicitationreport","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Adiciona um relato em um protocolo e, opcionalmente, altera seu status. Pode ser usado apenas para lançar um relato sem mexer no andamento da solicitação.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>A solicitação (via <code>assignmentId</code> ou <code>protocol</code>) precisa existir e não estar Encerrada/Cancelada (status 4/8) nem Aguardando Classificação (status 9).</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Informe <strong><code>assignmentId</code></strong> (Id interno da tarefa) <strong>ou</strong> <code>protocol</code> (número do protocolo) — pelo menos um dos dois é obrigatório. Quando só <code>protocol</code> é enviado, o <code>assignmentId</code> correspondente é resolvido internamente.</li>\n<li><strong><code>incidentStatusId</code> é opcional</strong>: quando <strong>não</strong> é enviado, o relato é gravado sem movimentar a solicitação — status, progresso, execução em andamento e data de encerramento continuam como estão. Quando é enviado, o comportamento abaixo se aplica.</li>\n<li><strong>Atenção: esse método não permite reabrir um protocolo</strong> — se a solicitação já estiver Encerrada, Cancelada ou Aguardando Classificação, a chamada falha independentemente do <code>incidentStatusId</code> enviado.</li>\n<li>Status <strong>3 - Fechamento</strong>: a solicitação é automaticamente encaminhada — ao gerente da equipe atual (regra padrão), ou à equipe/pessoa configurada em \"Encaminhar no fechamento\" do tipo de solicitação, quando parametrizado.</li>\n<li>Status <strong>4 - Encerramento</strong>: progresso vai para 100% e a data de conclusão é preenchida com o momento atual.</li>\n<li><strong><code>progress</code></strong>: progresso de 0 a 100. Só é relevante para tarefas; é forçado a 100% ou \"Cancelado\" quando <code>incidentStatusId</code> é 4 ou 8, respectivamente.</li>\n<li><strong><code>priority</code></strong>: prioridade do relato.</li>\n<li><strong><code>notificationTarget</code></strong>: quem recebe notificação sobre o relato — 0 Ninguém, 1 Responsável, 2 Responsável e Gerente, 3 Gerente e Equipe, 4 Responsável e Equipe, 5 Gerente, 6 Gerente de estoque.</li>\n<li><strong><code>privateReport</code></strong>: quando <code>true</code>, o relato só é visível internamente (o cliente não vê).</li>\n<li><strong><code>actAsPersonId</code></strong> (opcional): Id de uma pessoa do tenant (People.Id) que assina o relato como autor no lugar do próprio integrador. Só é aceita uma pessoa que: exista e não esteja excluída; tenha usuário de sistema vinculado, ativo e não excluído; e tenha CPF/CNPJ cadastrado. Quando não informado, o autor do relato é o próprio integrador (usuário da autenticação).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>assignmentId</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Id interno da tarefa da solicitação. Um dos dois (<code>assignmentId</code>/<code>protocol</code>) é obrigatório</td>\n</tr>\n<tr>\n<td>protocol</td>\n<td>long</td>\n<td>Condicional</td>\n<td>Número do protocolo. Um dos dois (<code>assignmentId</code>/<code>protocol</code>) é obrigatório</td>\n</tr>\n<tr>\n<td>incidentStatusId</td>\n<td>long</td>\n<td>Não</td>\n<td>Novo status da solicitação. Omitido = relato sem movimentação. Valores: 1 Abertura, 2 Andamento, 3 Fechamento, 4 Encerramento, 8 Cancelado, 9 Ag. Classificação</td>\n</tr>\n<tr>\n<td>description</td>\n<td>string</td>\n<td>Sim</td>\n<td>Texto do relato</td>\n</tr>\n<tr>\n<td>progress</td>\n<td>int</td>\n<td>Não</td>\n<td>Progresso de 0 a 100 (tarefas)</td>\n</tr>\n<tr>\n<td>priority</td>\n<td>int</td>\n<td>Não</td>\n<td>Prioridade do relato</td>\n</tr>\n<tr>\n<td>notificationTarget</td>\n<td>int</td>\n<td>Não</td>\n<td>Alvo da notificação (ver valores acima)</td>\n</tr>\n<tr>\n<td>privateReport</td>\n<td>bool</td>\n<td>Não</td>\n<td><code>true</code> = relato privado, visível só internamente</td>\n</tr>\n<tr>\n<td>actAsPersonId</td>\n<td>long</td>\n<td>Não</td>\n<td>Id da pessoa do tenant que assina o relato como autor</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.reportId</code></td>\n<td>long</td>\n<td>Id do relato criado.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Esse método usa dois status HTTP diferentes: <strong>200</strong> para sucesso e para a maioria dos erros de negócio (verifique <code>success</code>); e <strong>400 Bad Request</strong> especificamente quando <code>actAsPersonId</code> é informado e a pessoa não é aceita como ator — nesse caso a mensagem vem prefixada com o código <code>ACT_AS_UNRESOLVED</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem/retorno</th>\n<th>HTTP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nem <code>assignmentId</code> nem <code>protocol</code> informados</td>\n<td>ID ou número da solicitação não informado</td>\n<td>200</td>\n</tr>\n<tr>\n<td><code>protocol</code> informado não encontra a solicitação</td>\n<td>Solicitação não encontrada.</td>\n<td>200</td>\n</tr>\n<tr>\n<td>Solicitação Encerrada ou Cancelada (status 4/8)</td>\n<td>A solicitação já se encontra encerrada e não permite relatos.</td>\n<td>200</td>\n</tr>\n<tr>\n<td>Solicitação Aguardando Classificação (status 9)</td>\n<td>A solicitação já se está em aguardando classificação e não permite relatos.</td>\n<td>200</td>\n</tr>\n<tr>\n<td><code>actAsPersonId</code> não encontra pessoa, pessoa excluída, sem usuário vinculado, usuário inativo/excluído, ou sem CPF/CNPJ cadastrado</td>\n<td>ACT_AS_UNRESOLVED: não foi possível utilizar a pessoa informada como responsável pela operação.</td>\n<td><strong>400</strong></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para trocar a matriz de categorização (o que também recalcula tipo, SLA e GUT), use \"Realiza manutenção em solicitação\".</li>\n<li>Para abrir uma nova solicitação, use \"Nova Solicitação Externa - Detalhada\", \"Nova Solicitação Interna - Detalhada\", \"Nova Solicitação - Simplificado\" ou \"Nova Solicitação CRM\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","createsolicitationreport"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"14b0c3c6-15d3-43f4-8e1a-fec57145c7c5","name":"Sucesso — via assignmentId","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 418335,\n    \"incidentStatusId\": 3,\n    \"description\": \"Texto de relato\",\n    \"progress\": 0,\n    \"priority\": 35,\n    \"notificationTarget\": 0,\n    \"privateReport\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/projects/createsolicitationreport"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [\n    {\n      \"message\": \"Relato criado com sucesso\",\n      \"code\": null,\n      \"type\": \"Success\"\n    }\n  ],\n  \"response\": {\n    \"reportId\": 987654\n  },\n  \"elapsedTime\": null\n}"},{"id":"4524b05b-3eef-4ccb-a42b-060d52f99c93","name":"Sucesso — via protocol","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"protocol\": 398520,\n    \"incidentStatusId\": 2,\n    \"description\": \"Teste\",\n    \"progress\": 20,\n    \"priority\": 3,\n    \"notificationTarget\": 1,\n    \"privateReport\": true\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/projects/createsolicitationreport"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Relato criado com sucesso\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"reportId\": 987655\n    },\n    \"elapsedTime\": null\n}"},{"id":"bbf74be2-233f-42e4-bc44-d70fd1bc370f","name":"Erro — Ator (actAsPersonId) não resolvido","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0,\n    \"protocol\": 0,\n    \"incidentStatusId\": 0,\n    \"description\": \"string\",\n    \"progress\": 0,\n    \"priority\": 0,\n    \"notificationTarget\": 0,\n    \"privateReport\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/createsolicitationreport","description":"## Propósito\nAdiciona um relato em um protocolo e, opcionalmente, altera seu status. Pode ser usado apenas para lançar um relato sem mexer no andamento da solicitação.\n\n## Pré-requisitos\nA solicitação (via `assignmentId` ou `protocol`) precisa existir e não estar Encerrada/Cancelada (status 4/8) nem Aguardando Classificação (status 9).\n\n## Regras de negócio\n- Informe **`assignmentId`** (Id interno da tarefa) **ou** `protocol` (número do protocolo) — pelo menos um dos dois é obrigatório. Quando só `protocol` é enviado, o `assignmentId` correspondente é resolvido internamente.\n- **`incidentStatusId` é opcional**: quando **não** é enviado, o relato é gravado sem movimentar a solicitação — status, progresso, execução em andamento e data de encerramento continuam como estão. Quando é enviado, o comportamento abaixo se aplica.\n- **Atenção: esse método não permite reabrir um protocolo** — se a solicitação já estiver Encerrada, Cancelada ou Aguardando Classificação, a chamada falha independentemente do `incidentStatusId` enviado.\n- Status **3 - Fechamento**: a solicitação é automaticamente encaminhada — ao gerente da equipe atual (regra padrão), ou à equipe/pessoa configurada em \"Encaminhar no fechamento\" do tipo de solicitação, quando parametrizado.\n- Status **4 - Encerramento**: progresso vai para 100% e a data de conclusão é preenchida com o momento atual.\n- **`progress`**: progresso de 0 a 100. Só é relevante para tarefas; é forçado a 100% ou \"Cancelado\" quando `incidentStatusId` é 4 ou 8, respectivamente.\n- **`priority`**: prioridade do relato.\n- **`notificationTarget`**: quem recebe notificação sobre o relato — 0 Ninguém, 1 Responsável, 2 Responsável e Gerente, 3 Gerente e Equipe, 4 Responsável e Equipe, 5 Gerente, 6 Gerente de estoque.\n- **`privateReport`**: quando `true`, o relato só é visível internamente (o cliente não vê).\n- **`actAsPersonId`** (opcional): Id de uma pessoa do tenant (People.Id) que assina o relato como autor no lugar do próprio integrador. Só é aceita uma pessoa que: exista e não esteja excluída; tenha usuário de sistema vinculado, ativo e não excluído; e tenha CPF/CNPJ cadastrado. Quando não informado, o autor do relato é o próprio integrador (usuário da autenticação).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| assignmentId | long | Condicional | Id interno da tarefa da solicitação. Um dos dois (`assignmentId`/`protocol`) é obrigatório |\n| protocol | long | Condicional | Número do protocolo. Um dos dois (`assignmentId`/`protocol`) é obrigatório |\n| incidentStatusId | long | Não | Novo status da solicitação. Omitido = relato sem movimentação. Valores: 1 Abertura, 2 Andamento, 3 Fechamento, 4 Encerramento, 8 Cancelado, 9 Ag. Classificação |\n| description | string | Sim | Texto do relato |\n| progress | int | Não | Progresso de 0 a 100 (tarefas) |\n| priority | int | Não | Prioridade do relato |\n| notificationTarget | int | Não | Alvo da notificação (ver valores acima) |\n| privateReport | bool | Não | `true` = relato privado, visível só internamente |\n| actAsPersonId | long | Não | Id da pessoa do tenant que assina o relato como autor |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.reportId` | long | Id do relato criado. |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n⚠ Esse método usa dois status HTTP diferentes: **200** para sucesso e para a maioria dos erros de negócio (verifique `success`); e **400 Bad Request** especificamente quando `actAsPersonId` é informado e a pessoa não é aceita como ator — nesse caso a mensagem vem prefixada com o código `ACT_AS_UNRESOLVED`.\n\n## Erros comuns\n\n| Situação | Mensagem/retorno | HTTP |\n|---|---|---|\n| Nem `assignmentId` nem `protocol` informados | ID ou número da solicitação não informado | 200 |\n| `protocol` informado não encontra a solicitação | Solicitação não encontrada. | 200 |\n| Solicitação Encerrada ou Cancelada (status 4/8) | A solicitação já se encontra encerrada e não permite relatos. | 200 |\n| Solicitação Aguardando Classificação (status 9) | A solicitação já se está em aguardando classificação e não permite relatos. | 200 |\n| `actAsPersonId` não encontra pessoa, pessoa excluída, sem usuário vinculado, usuário inativo/excluído, ou sem CPF/CNPJ cadastrado | ACT_AS_UNRESOLVED: não foi possível utilizar a pessoa informada como responsável pela operação. | **400** |\n\n## Fluxo relacionado\n- Para trocar a matriz de categorização (o que também recalcula tipo, SLA e GUT), use \"Realiza manutenção em solicitação\".\n- Para abrir uma nova solicitação, use \"Nova Solicitação Externa - Detalhada\", \"Nova Solicitação Interna - Detalhada\", \"Nova Solicitação - Simplificado\" ou \"Nova Solicitação CRM\"."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"ACT_AS_UNRESOLVED: não foi possível utilizar a pessoa informada como responsável pela operação.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"06bc149b-48f7-4fe5-948a-e4c638e05c46","name":"Erro — Solicitação encerrada não permite relatos","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"assignmentId\": 0,\n    \"protocol\": 0,\n    \"incidentStatusId\": 0,\n    \"description\": \"string\",\n    \"progress\": 0,\n    \"priority\": 0,\n    \"notificationTarget\": 0,\n    \"privateReport\": true\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/createsolicitationreport","description":"## Propósito\nAdiciona um relato em um protocolo e, opcionalmente, altera seu status. Pode ser usado apenas para lançar um relato sem mexer no andamento da solicitação.\n\n## Pré-requisitos\nA solicitação (via `assignmentId` ou `protocol`) precisa existir e não estar Encerrada/Cancelada (status 4/8) nem Aguardando Classificação (status 9).\n\n## Regras de negócio\n- Informe **`assignmentId`** (Id interno da tarefa) **ou** `protocol` (número do protocolo) — pelo menos um dos dois é obrigatório. Quando só `protocol` é enviado, o `assignmentId` correspondente é resolvido internamente.\n- **`incidentStatusId` é opcional**: quando **não** é enviado, o relato é gravado sem movimentar a solicitação — status, progresso, execução em andamento e data de encerramento continuam como estão. Quando é enviado, o comportamento abaixo se aplica.\n- **Atenção: esse método não permite reabrir um protocolo** — se a solicitação já estiver Encerrada, Cancelada ou Aguardando Classificação, a chamada falha independentemente do `incidentStatusId` enviado.\n- Status **3 - Fechamento**: a solicitação é automaticamente encaminhada — ao gerente da equipe atual (regra padrão), ou à equipe/pessoa configurada em \"Encaminhar no fechamento\" do tipo de solicitação, quando parametrizado.\n- Status **4 - Encerramento**: progresso vai para 100% e a data de conclusão é preenchida com o momento atual.\n- **`progress`**: progresso de 0 a 100. Só é relevante para tarefas; é forçado a 100% ou \"Cancelado\" quando `incidentStatusId` é 4 ou 8, respectivamente.\n- **`priority`**: prioridade do relato.\n- **`notificationTarget`**: quem recebe notificação sobre o relato — 0 Ninguém, 1 Responsável, 2 Responsável e Gerente, 3 Gerente e Equipe, 4 Responsável e Equipe, 5 Gerente, 6 Gerente de estoque.\n- **`privateReport`**: quando `true`, o relato só é visível internamente (o cliente não vê).\n- **`actAsPersonId`** (opcional): Id de uma pessoa do tenant (People.Id) que assina o relato como autor no lugar do próprio integrador. Só é aceita uma pessoa que: exista e não esteja excluída; tenha usuário de sistema vinculado, ativo e não excluído; e tenha CPF/CNPJ cadastrado. Quando não informado, o autor do relato é o próprio integrador (usuário da autenticação).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| assignmentId | long | Condicional | Id interno da tarefa da solicitação. Um dos dois (`assignmentId`/`protocol`) é obrigatório |\n| protocol | long | Condicional | Número do protocolo. Um dos dois (`assignmentId`/`protocol`) é obrigatório |\n| incidentStatusId | long | Não | Novo status da solicitação. Omitido = relato sem movimentação. Valores: 1 Abertura, 2 Andamento, 3 Fechamento, 4 Encerramento, 8 Cancelado, 9 Ag. Classificação |\n| description | string | Sim | Texto do relato |\n| progress | int | Não | Progresso de 0 a 100 (tarefas) |\n| priority | int | Não | Prioridade do relato |\n| notificationTarget | int | Não | Alvo da notificação (ver valores acima) |\n| privateReport | bool | Não | `true` = relato privado, visível só internamente |\n| actAsPersonId | long | Não | Id da pessoa do tenant que assina o relato como autor |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.reportId` | long | Id do relato criado. |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n⚠ Esse método usa dois status HTTP diferentes: **200** para sucesso e para a maioria dos erros de negócio (verifique `success`); e **400 Bad Request** especificamente quando `actAsPersonId` é informado e a pessoa não é aceita como ator — nesse caso a mensagem vem prefixada com o código `ACT_AS_UNRESOLVED`.\n\n## Erros comuns\n\n| Situação | Mensagem/retorno | HTTP |\n|---|---|---|\n| Nem `assignmentId` nem `protocol` informados | ID ou número da solicitação não informado | 200 |\n| `protocol` informado não encontra a solicitação | Solicitação não encontrada. | 200 |\n| Solicitação Encerrada ou Cancelada (status 4/8) | A solicitação já se encontra encerrada e não permite relatos. | 200 |\n| Solicitação Aguardando Classificação (status 9) | A solicitação já se está em aguardando classificação e não permite relatos. | 200 |\n| `actAsPersonId` não encontra pessoa, pessoa excluída, sem usuário vinculado, usuário inativo/excluído, ou sem CPF/CNPJ cadastrado | ACT_AS_UNRESOLVED: não foi possível utilizar a pessoa informada como responsável pela operação. | **400** |\n\n## Fluxo relacionado\n- Para trocar a matriz de categorização (o que também recalcula tipo, SLA e GUT), use \"Realiza manutenção em solicitação\".\n- Para abrir uma nova solicitação, use \"Nova Solicitação Externa - Detalhada\", \"Nova Solicitação Interna - Detalhada\", \"Nova Solicitação - Simplificado\" ou \"Nova Solicitação CRM\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"A solicitação já se encontra encerrada e não permite relatos.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"7601412f-dba6-4a6a-820a-cbd7435b3d30"},{"name":"Upload de anexo em uma solicitação","id":"f8708378-3ea3-49ae-bf82-01edea159c5f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads?protocol={{Número do protocolo}}&documentationTypeCode={{Código do tipo de documento}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Anexa um ou mais arquivos a uma solicitação já existente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>A solicitação (protocolo) precisa existir.</li>\n<li>O tipo de documento (<code>documentationTypeCode</code>) precisa existir, estar ativo e não excluído. É cadastrado na rotina de Tipos de Documentação do ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Requisição <code>multipart/form-data</code>; o(s) arquivo(s) vão no campo <code>File</code>.</li>\n<li>Tamanho máximo por arquivo: <strong>10 MB</strong>. Arquivos maiores são recusados.</li>\n<li>Extensões aceitas: <code>.csv</code>, <code>.doc</code>, <code>.docx</code>, <code>.gif</code>, <code>.gz</code>, <code>.jpeg</code>, <code>.jpg</code>, <code>.mkv</code>, <code>.mp4</code>, <code>.pdf</code>, <code>.png</code>, <code>.ppt</code>, <code>.pptx</code>, <code>.rar</code>, <code>.tar</code>, <code>.txt</code>, <code>.xls</code>, <code>.xlsx</code>, <code>.zip</code>. Outras extensões são recusadas.</li>\n<li>O nome do arquivo é normalizado (minúsculas, sem acentos/caracteres especiais, espaços viram <code>_</code>) antes de ser salvo.</li>\n<li>É possível enviar mais de um arquivo na mesma chamada; cada um vira um anexo independente da solicitação e gera um evento de \"anexo adicionado\" separado.</li>\n<li>Se qualquer arquivo da leva falhar na validação (extensão ou tamanho), a chamada inteira é interrompida nesse arquivo — os arquivos processados antes dele na mesma chamada já ficam persistidos.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>protocol</td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Número do protocolo da solicitação</td>\n</tr>\n<tr>\n<td>documentationTypeCode</td>\n<td>Query string</td>\n<td>string</td>\n<td>Sim</td>\n<td>Código do tipo de documento, previamente cadastrado e ativo</td>\n</tr>\n<tr>\n<td>File</td>\n<td>Form-data (body)</td>\n<td>arquivo</td>\n<td>Sim</td>\n<td>Arquivo a ser anexado (repita a chave <code>File</code> para enviar mais de um)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code>, tanto em sucesso quanto em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mesma estrutura em sucesso e erro.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem/retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>protocol</code>, <code>documentationTypeCode</code> ou arquivo não informados</td>\n<td>Valores não repassados ao controlador.</td>\n</tr>\n<tr>\n<td>Protocolo não encontrado</td>\n<td>Protocolo não encontrado.</td>\n</tr>\n<tr>\n<td><code>documentationTypeCode</code> não encontrado, inativo ou excluído</td>\n<td>Tipo de documento não encontrado.</td>\n</tr>\n<tr>\n<td>Extensão de arquivo não permitida</td>\n<td>Arquivo {nome do arquivo} possui extensão desconhecida.</td>\n</tr>\n<tr>\n<td>Arquivo maior que 10 MB</td>\n<td>Arquivo {nome do arquivo} excede 10 MB.</td>\n</tr>\n<tr>\n<td>Falha ao gravar o arquivo em disco</td>\n<td>Arquivo não pode ser salvo!</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para baixar um anexo já enviado, use \"Download de um anexo de uma solicitação\".</li>\n<li>Para listar os anexos de uma solicitação, use \"Busca de anexos de uma solicitação\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads"],"host":["{{URL}}"],"query":[{"key":"protocol","value":"{{Número do protocolo}}"},{"key":"documentationTypeCode","value":"{{Código do tipo de documento}}"},{"disabled":true,"key":"","value":""}],"variable":[]}},"response":[{"id":"5f150afe-a174-4670-8c37-4d9c2463c647","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads?protocol={{Número do protocolo}}&documentationTypeCode={{Código do tipo de documento}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads"],"query":[{"key":"protocol","value":"{{Número do protocolo}}"},{"key":"documentationTypeCode","value":"{{Código do tipo de documento}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Operação realizada com sucesso!\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"f0c5d769-4aa4-4d4f-a55c-d4e824ed6ce5","name":"Erro — Extensão de arquivo não permitida","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"Token obtido no método de autenticação"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads?protocol={{Número do protocolo}}&documentationTypeCode={{Código do tipo de documento}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads"],"query":[{"key":"protocol","value":"{{Número do protocolo}}"},{"key":"documentationTypeCode","value":"{{Código do tipo de documento}}"},{"key":"","value":"","disabled":true}]},"description":"## Propósito\nAnexa um ou mais arquivos a uma solicitação já existente.\n\n## Pré-requisitos\n- A solicitação (protocolo) precisa existir.\n- O tipo de documento (`documentationTypeCode`) precisa existir, estar ativo e não excluído. É cadastrado na rotina de Tipos de Documentação do ERP.\n\n## Regras de negócio\n- Requisição `multipart/form-data`; o(s) arquivo(s) vão no campo `File`.\n- Tamanho máximo por arquivo: **10 MB**. Arquivos maiores são recusados.\n- Extensões aceitas: `.csv`, `.doc`, `.docx`, `.gif`, `.gz`, `.jpeg`, `.jpg`, `.mkv`, `.mp4`, `.pdf`, `.png`, `.ppt`, `.pptx`, `.rar`, `.tar`, `.txt`, `.xls`, `.xlsx`, `.zip`. Outras extensões são recusadas.\n- O nome do arquivo é normalizado (minúsculas, sem acentos/caracteres especiais, espaços viram `_`) antes de ser salvo.\n- É possível enviar mais de um arquivo na mesma chamada; cada um vira um anexo independente da solicitação e gera um evento de \"anexo adicionado\" separado.\n- Se qualquer arquivo da leva falhar na validação (extensão ou tamanho), a chamada inteira é interrompida nesse arquivo — os arquivos processados antes dele na mesma chamada já ficam persistidos.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n|---|---|---|---|---|\n| protocol | Query string | long | Sim | Número do protocolo da solicitação |\n| documentationTypeCode | Query string | string | Sim | Código do tipo de documento, previamente cadastrado e ativo |\n| File | Form-data (body) | arquivo | Sim | Arquivo a ser anexado (repita a chave `File` para enviar mais de um) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi concluída com sucesso. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Sempre `null`, tanto em sucesso quanto em erro. |\n\nMesma estrutura em sucesso e erro.\n\n## Erros comuns\n\n| Situação | Mensagem/retorno |\n|---|---|\n| `protocol`, `documentationTypeCode` ou arquivo não informados | Valores não repassados ao controlador. |\n| Protocolo não encontrado | Protocolo não encontrado. |\n| `documentationTypeCode` não encontrado, inativo ou excluído | Tipo de documento não encontrado. |\n| Extensão de arquivo não permitida | Arquivo {nome do arquivo} possui extensão desconhecida. |\n| Arquivo maior que 10 MB | Arquivo {nome do arquivo} excede 10 MB. |\n| Falha ao gravar o arquivo em disco | Arquivo não pode ser salvo! |\n\n## Fluxo relacionado\n- Para baixar um anexo já enviado, use \"Download de um anexo de uma solicitação\".\n- Para listar os anexos de uma solicitação, use \"Busca de anexos de uma solicitação\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Arquivo exemplo.exe possui extensão desconhecida.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"f8708378-3ea3-49ae-bf82-01edea159c5f"},{"name":"Download de um anexo de  uma solicitação","id":"eda43514-3dfe-4fdd-b12a-8c1d01b2e38c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads/getfile?id={{Id do Anexo}}&assignmentId={{Id da Solicitação}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Baixa o conteúdo binário de um anexo vinculado a uma solicitação.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>O anexo (<code>id</code>) precisa existir, não estar excluído, pertencer à solicitação informada (<code>assignmentId</code>), e a solicitação em si não pode estar excluída.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>id</code> é o identificador do anexo (<code>AssignmentsUploads.Id</code>), <strong>não</strong> o Id da solicitação.</li>\n<li><code>assignmentId</code> é o Id interno da tarefa da solicitação (mesmo valor retornado como <code>assignmentId</code> na abertura da solicitação, não o número de protocolo).</li>\n<li>É sempre validado que o anexo enviado em <code>id</code> pertence à solicitação enviada em <code>assignmentId</code>; se não pertencer, ou se qualquer um dos dois não existir (ou estiver excluído), a resposta é um erro — nunca retorna o conteúdo de um anexo de outra solicitação.</li>\n<li>Em caso de sucesso, o corpo da resposta é o <strong>conteúdo binário do arquivo</strong> (não é JSON), com <code>Content-Type</code> igual ao MIME type gravado no upload (ou <code>application/octet-stream</code> quando não há MIME registrado) e o nome original do arquivo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>id</td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do anexo</td>\n</tr>\n<tr>\n<td>assignmentId</td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id interno da solicitação (tarefa) à qual o anexo pertence</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Esse método <strong>não</strong> segue o envelope padrão (<code>success</code>/<code>messages</code>/<code>response</code>):</p>\n<ul>\n<li><strong>Sucesso (200 OK)</strong>: o corpo é o arquivo em binário, não um JSON. O <code>Content-Type</code> do cabeçalho reflete o MIME do arquivo.</li>\n<li><strong>Erro (400 Bad Request)</strong>: o corpo é <strong>texto puro</strong> com a mensagem de erro (não é um JSON com <code>messages</code>/<code>response</code>).</li>\n</ul>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n<th>HTTP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code> não pertence a <code>assignmentId</code>, anexo excluído, ou anexo/solicitação inexistente</td>\n<td>Registro não encontrado.</td>\n<td>400 (texto puro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Para anexar um novo arquivo, use \"Upload de anexo em uma solicitação\".</li>\n<li>Para listar os anexos disponíveis (e obter os <code>id</code>s de anexo), use \"Busca de anexos de uma solicitação\".</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads","getfile"],"host":["{{URL}}"],"query":[{"disabled":true,"key":"","value":""},{"key":"id","value":"{{Id do Anexo}}"},{"key":"assignmentId","value":"{{Id da Solicitação}}"}],"variable":[]}},"response":[{"id":"86907f46-95c6-498d-a1ae-acf59682e380","name":"Erro — Anexo não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads/getfile?id={{Id do Anexo}}&assignmentId={{Id da Solicitação}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads","getfile"],"query":[{"key":"","value":"","disabled":true},{"key":"id","value":"{{Id do Anexo}}"},{"key":"assignmentId","value":"{{Id da Solicitação}}"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":"Registro não encontrado."},{"id":"b33a1398-3ec6-4d21-8833-9774cd669b0e","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/projects/assignmentsuploads/getfile?id={{Id do Anexo}}&assignmentId={{Id da Solicitação}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","projects","assignmentsuploads","getfile"],"query":[{"key":"","value":"","disabled":true},{"key":"id","value":"{{Id do Anexo}}"},{"key":"assignmentId","value":"{{Id da Solicitação}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""}],"_postman_id":"eda43514-3dfe-4fdd-b12a-8c1d01b2e38c"}],"id":"7015eb4e-5332-4f8d-9375-76123688176f","_postman_id":"7015eb4e-5332-4f8d-9375-76123688176f","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"ISP | Telecom","item":[{"name":"Atualiza Conexão","id":"72035b8b-82cb-4a42-a8a9-53f70fb3db97","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0,\n    \"fiberMac\": \"string\",\n    \"mac\": \"string\",\n    \"password\": \"string\",\n    \"equipmentType\": 0,\n    \"oltId\": 0,\n    \"slotOlt\": 0,\n    \"portOlt\": 0,\n    \"equipmentSerialNumber\": \"string\",\n    \"ipType\": 0,\n    \"equipmentUser\": \"string\",\n    \"equipmentPassword\": \"string\",\n    \"authenticationSplitterId\": 0,\n    \"port\": 0,\n    \"wifiName\": \"string\",\n    \"wifiPassword\": \"string\",\n    \"technologyType\": 0,\n    \"authenticationAccessPointId\": 0,\n    \"updateConnectionParameter\": true,\n    \"shouldMacUpdate\": true,\n    \"user\": \"string\",\n    \"isIPoE\": true,\n    \"complement\": \"string\"\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/updateconnection/{{ID}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Atualiza os dados técnicos de uma conexão (contrato de autenticação) já existente: equipamento, MAC, senha, splitter/OLT, ponto de acesso, IP, Wi-Fi e status de provisionamento. É uma atualização parcial — apenas os campos enviados (e diferentes do valor atual) são alterados.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>A conexão (<code>id</code> na URL) deve existir.</li>\n<li>O <code>id</code> da URL deve ser igual ao <code>id</code> enviado no corpo.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><strong>Senha (<code>password</code>)</strong>: obrigatória, exceto quando <code>isIPoE = true</code> (a senha é sempre zerada nesse caso e não deve ser enviada).</li>\n<li><strong>MAC (<code>mac</code>) / MAC da ONU (<code>fiberMac</code>)</strong>: quando informados, devem ter exatamente 17 caracteres (formato <code>XX:XX:XX:XX:XX:XX</code>); caso contrário, são rejeitados.</li>\n<li><strong>Limpeza do MAC</strong>: para limpar o MAC da conexão, envie <code>setMacClean: true</code> com <code>mac</code> vazio/omitido. Enviar <code>setMacClean: true</code> com <code>mac</code> preenchido é rejeitado.</li>\n<li><strong>Forçar atualização do MAC (<code>shouldMacUpdate</code>)</strong>: quando <code>true</code>, força o reprocessamento/gravação do MAC mesmo que o valor enviado seja igual ao atual ou esteja vazio — é o campo usado para garantir que o MAC seja reprocessado. Não deve ser confundido com <code>setMacClean</code> (que é o campo dedicado a limpar/zerar o MAC).</li>\n<li><strong>Splitter (<code>authenticationSplitterId</code> + <code>port</code>)</strong>: são <strong>opcionais</strong>, mas devem ser enviados <strong>em conjunto</strong> para vincular a conexão a uma porta de splitter; se apenas um dos dois for enviado, é ignorado silenciosamente.</li>\n<li><strong>Troca de ponto de acesso (<code>authenticationAccessPointId</code>)</strong>: não é permitida quando a conexão já está vinculada a um splitter, a menos que <code>clearSplitter: true</code> seja enviado na mesma requisição (desvincula o splitter antes de trocar o ponto de acesso).</li>\n<li><strong>OLT (<code>oltId</code>)</strong>: só é considerado quando <code>equipmentType</code> for um dos fabricantes de ONU/OLT geridos por script (Zte, Intelbras, Parks, Huawei, DATACOM, Nokia, Gigatelco, Raisecom, FiberHome) — para Mikrotik, Ubiquiti, Digistar ou \"Não Informado\" o campo é ignorado.</li>\n<li><strong>Tipo de IP (<code>ipType</code>)</strong>: só os valores <code>1</code> (Fixo) e <code>2</code> (Por Concentrador) disparam atualização; <code>0</code> (Não definido) e <code>3</code> (Pool de IP) são ignorados.</li>\n<li><strong>Status de provisionamento (<code>provisionStatus</code>)</strong>: só aceita <code>1</code> (Provisionada) ou <code>2</code> (Não provisionada); outros valores são ignorados.</li>\n<li>A troca de senha ou de ponto de acesso pode desconectar o cliente ativo (evento de desconexão/replicação é disparado automaticamente).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>id</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Deve ser igual ao <code>id</code> da URL.</td>\n</tr>\n<tr>\n<td><code>fiberMac</code></td>\n<td>string</td>\n<td>Não</td>\n<td>MAC da ONU. 17 caracteres se informado.</td>\n</tr>\n<tr>\n<td><code>mac</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Endereço MAC do equipamento. 17 caracteres se informado.</td>\n</tr>\n<tr>\n<td><code>password</code></td>\n<td>string</td>\n<td>Condicional</td>\n<td>Obrigatória, exceto quando <code>isIPoE = true</code>.</td>\n</tr>\n<tr>\n<td><code>equipmentType</code></td>\n<td>int</td>\n<td>Não</td>\n<td>Fabricante do equipamento: <code>0</code> Não Informado, <code>1</code> Mikrotik, <code>2</code> Ubiquiti, <code>3</code> Intelbras, <code>4</code> Parks, <code>5</code> Huawei, <code>6</code> FiberHome, <code>7</code> Zte, <code>8</code> DATACOM, <code>14</code> Digistar, <code>15</code> Nokia, <code>16</code> Gigatelco, <code>17</code> Raisecom.</td>\n</tr>\n<tr>\n<td><code>oltId</code></td>\n<td>int</td>\n<td>Não</td>\n<td>Id da ONU/OLT. Só é aplicado para os fabricantes listados na regra acima.</td>\n</tr>\n<tr>\n<td><code>slotOlt</code> / <code>portOlt</code></td>\n<td>int</td>\n<td>Não</td>\n<td>Slot/porta da OLT.</td>\n</tr>\n<tr>\n<td><code>equipmentSerialNumber</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Número de série do equipamento.</td>\n</tr>\n<tr>\n<td><code>ipType</code></td>\n<td>int</td>\n<td>Não</td>\n<td><code>0</code> Não definido, <code>1</code> IP Fixo, <code>2</code> Por Concentrador, <code>3</code> Pool de IP. Só <code>1</code> e <code>2</code> disparam alteração.</td>\n</tr>\n<tr>\n<td><code>equipmentUser</code> / <code>equipmentPassword</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Credenciais de acesso ao equipamento (diferentes da senha de autenticação).</td>\n</tr>\n<tr>\n<td><code>authenticationSplitterId</code> / <code>port</code></td>\n<td>long</td>\n<td>Não (juntos)</td>\n<td>Vincula a conexão a uma porta de splitter. Devem ser enviados em conjunto.</td>\n</tr>\n<tr>\n<td><code>wifiName</code> / <code>wifiPassword</code></td>\n<td>string</td>\n<td>Não</td>\n<td>SSID e senha do Wi-Fi.</td>\n</tr>\n<tr>\n<td><code>technologyType</code></td>\n<td>int</td>\n<td>Não</td>\n<td><code>2</code> Cable Modem, <code>3</code> Spread Spectrum, <code>8</code> Fibra-FTTH, <code>10</code> HFC, <code>11</code> WIMAX, <code>12</code> LTE, <code>13</code> Ethernet, <code>16</code> Fibra-FTTB.</td>\n</tr>\n<tr>\n<td><code>authenticationAccessPointId</code></td>\n<td>long</td>\n<td>Não</td>\n<td>Altera o ponto de acesso (bloqueado se houver splitter vinculado, salvo com <code>clearSplitter</code>).</td>\n</tr>\n<tr>\n<td><code>updateConnectionParameter</code></td>\n<td>bool</td>\n<td>Não</td>\n<td>Força a replicação da conexão para o Radius mesmo sem outras mudanças.</td>\n</tr>\n<tr>\n<td><code>shouldMacUpdate</code></td>\n<td>bool</td>\n<td>Não</td>\n<td>Força a atualização/reprocessamento do MAC mesmo com valor igual/vazio. Default <code>false</code>.</td>\n</tr>\n<tr>\n<td><code>setMacClean</code></td>\n<td>bool</td>\n<td>Não</td>\n<td><code>true</code> limpa o MAC da conexão — só pode ser enviado com <code>mac</code> vazio.</td>\n</tr>\n<tr>\n<td><code>user</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Usuário de autenticação.</td>\n</tr>\n<tr>\n<td><code>isIPoE</code></td>\n<td>bool</td>\n<td>Não</td>\n<td>Indica conexão IPoE — zera a senha automaticamente e proíbe enviá-la no payload.</td>\n</tr>\n<tr>\n<td><code>clearSplitter</code></td>\n<td>bool</td>\n<td>Não</td>\n<td>Desvincula o splitter atual, permitindo trocar o ponto de acesso na mesma requisição.</td>\n</tr>\n<tr>\n<td><code>complement</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Informação complementar da conexão.</td>\n</tr>\n<tr>\n<td><code>provisionStatus</code></td>\n<td>int</td>\n<td>Não</td>\n<td><code>1</code> Provisionada, <code>2</code> Não provisionada. Outros valores são ignorados.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint <strong>não segue</strong> o padrão comum do GW. O campo <code>response</code> recebe o booleano de sucesso da operação (e não um objeto de dados), e a mensagem descritiva vem em <code>dataResponseType</code> — não em <code>messages</code>.</p>\n<p>⚠ <strong><code>success</code> não é confiável neste fluxo.</strong> No código-fonte (<code>ConnectionAppService.UpdateConnection</code>), tanto o sucesso quanto o erro de domínio (ex.: troca de ponto de acesso bloqueada, falha inesperada do <code>ConnectionService</code>) retornam pela mesma linha <code>new ResponseMessage(result.Success, result.Data)</code> — e esse construtor específico do GW fixa <code>success: true</code> internamente, <strong>independente do valor real do resultado</strong>. Ou seja, mesmo quando a atualização falha no domain service, a resposta vem com <code>success: true</code> <strong>e</strong> <code>response: false</code> ao mesmo tempo. <strong>Use o campo <code>response</code> (não <code>success</code>) para detectar esse tipo de erro.</strong> Essa limitação não se aplica aos erros de validação prévios (corpo não enviado, <code>id</code> divergente, regras de senha/MAC) — esses usam o envelope padrão com <code>success: false</code> real, pois caem num <code>catch</code> diferente antes de chamar o domain service. Em todos os casos (sucesso, erro de validação, erro de domínio), o status HTTP retornado é sempre <strong>200 (OK)</strong> — o controller sempre devolve <code>Ok(...)</code>, sem nenhum branch de erro mapeado para 4xx/5xx.</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Em erros de validação prévios (ver \"Erros comuns\"), reflete o resultado real. Nos demais casos (sucesso e erro de domínio), vem sempre <code>true</code> por limitação do GW — ver nota acima.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Normalmente <code>null</code> neste endpoint (ver nota abaixo).</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>boolean</td>\n<td><code>true</code>/<code>false</code> conforme o resultado real da atualização — é este campo, e não <code>success</code>, que deve ser usado para detectar erro de domínio.</td>\n</tr>\n<tr>\n<td><code>dataResponseType</code></td>\n<td>string</td>\n<td>Mensagem descritiva do resultado (sucesso ou erro).</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Para os erros de validação verificados antes de chamar a atualização (corpo não enviado, <code>id</code> divergente, regras de senha/MAC citadas acima), o retorno <strong>segue o padrão comum</strong> (<code>messages[].message</code>, <code>response: null</code>, <code>success: false</code> real) em vez do formato acima — ver \"Erros comuns\".</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Corpo não enviado</td>\n<td><code>success: false</code>, <code>messages</code>: \"Valores não repassados ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>id</code> da URL diferente do <code>id</code> do corpo</td>\n<td><code>success: false</code>, <code>messages</code>: \"Registro não confere com o valor enviado no modelo.\"</td>\n</tr>\n<tr>\n<td>Senha não informada (e não é IPoE)</td>\n<td><code>success: false</code>, <code>messages</code>: \"Senha não informada.\"</td>\n</tr>\n<tr>\n<td>Senha enviada com <code>isIPoE = true</code></td>\n<td><code>success: false</code>, <code>messages</code>: \"Quando a conexão for de IPoE a senha não pode ser enviada.\"</td>\n</tr>\n<tr>\n<td><code>setMacClean: true</code> com <code>mac</code> preenchido</td>\n<td><code>success: false</code>, <code>messages</code>: \"Endereço de mac preenchido, mas solicitando limpeza. Favor verificar os valores repassados ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>mac</code> ou <code>fiberMac</code> com tamanho diferente de 17</td>\n<td><code>success: false</code>, <code>messages</code>: \"Endereço Mac inválido ou não preenchido.\" / \"Endereço Mac Onu inválido ou não preenchido.\"</td>\n</tr>\n<tr>\n<td>Troca de ponto de acesso com splitter vinculado (sem <code>clearSplitter</code>)</td>\n<td><code>success: true</code> (!), <code>response: false</code>, <code>dataResponseType</code>: \"Erro ao atualizar conexão: Não é possível alterar o ponto de acesso, pois a conexão já está vinculada a um Splitter ou está sendo informado para atualização.\"</td>\n</tr>\n<tr>\n<td>Falha inesperada na atualização</td>\n<td><code>success: true</code> (!), <code>response: false</code>, <code>dataResponseType</code>: \"Erro ao atualizar conexão: {mensagem da falha}\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todas as situações acima retornam <strong>HTTP 200</strong>, inclusive os erros de validação e os erros de domínio — nunca 4xx/5xx.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use \"Lista as conexões por Cliente\" para localizar a conexão e \"Busca Status do PE por Contrato\" / \"Busca Status do PE por Usuário\" para conferir o ponto de acesso antes de alterá-lo. Após atualizar o equipamento, utilize \"Lista scripts de provisionamento por Conexão\" e \"Provisiona uma conexão\" se for necessário reprovisionar.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","updateconnection","{{ID}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"e81698c4-a3ea-4626-aefc-3d84f05e0aff","name":"Sucesso","originalRequest":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","name":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"id\": 0,\n    \"fiberMac\": \"string\", //MAC da ONU\n    \"mac\": \"string\", //Endereço MAC\n    \"password\": \"string\", //Senha do equipamento\n    \"equipmentType\": 0, //Fabricante do equipamento*\n    \"oltId\": 0, //ID da ONU*\n    \"slotOlt\": 0, //Slot da ONU \n    \"portOlt\": 0, // Porta do ONU\n    \"equipmentSerialNumber\": \"string\", //Número de série do equipamento\n    \"ipType\": 0, //Tipo do IP\n    \"equipmentUser\": \"string\", //Usuário do equipamento\n    \"equipmentPassword\": \"string\", //Senha do equipamento\n    \"authenticationSplitterId\": 0, //ID do Splitter - Obrigatório\n    \"port\": 0, //Porta do Splitter - Obrigatório\n    \"wifiName\": \"string\", //WIFI SSID\n    \"wifiPassword\": \"string\", //Senha da WIFI\n    \"technologyType\": 0, //Tipo de tecnologia*\n    \"authenticationAccessPointId\": 0, //Altera ponto de acesso\n    \"updateConnectionParameter\": true, //Força a replicação da conexão para o Radius\n    \"shouldMacUpdate\": true,\n    \"user\": \"string\", //Usuário\n    \"complement\": \"string\", //Informação complementar \n    \"isIPoE\": true //Identifica se a conexão é isIPoE\n}","options":{"raw":{"language":"json"}}},"url":"http://erp.cliente.com.br:45715/external/integrations/thirdparty/updateconnection/X"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": true,\n    \"dataResponseType\": \"Conexão atualizada com sucesso.\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"72035b8b-82cb-4a42-a8a9-53f70fb3db97"},{"name":"Busca Status do PE por Contrato","id":"a28c15fe-6a2b-4603-b026-1aa5dd25c164","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/getaccesspointstatusbycontract/{{contractId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Consulta o status do ponto de acesso (PE/OLT) vinculado à conexão de um contrato específico — se está em manutenção e se está ativo.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Contrato (<code>contractId</code>) com uma conexão (contrato de autenticação) vinculada a um ponto de acesso.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Busca a conexão do contrato que tenha um ponto de acesso vinculado (<code>authenticationAccessPointId</code> preenchido); se não encontrar, retorna erro \"Registro não encontrado.\"</li>\n<li>Retorna <strong>um único objeto</strong> (não uma lista) — o ponto de acesso da conexão encontrada.</li>\n<li><code>maintenance</code> só é preenchido quando o ponto de acesso está com o indicador de manutenção exatamente igual a \"em manutenção\"; caso contrário (inclusive quando <code>inMaintenance = true</code> por outro estado), vem <code>null</code>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (path)</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>contractId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador do contrato.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.title</code></td>\n<td>string</td>\n<td>Nome do Ponto de Acesso (PE/OLT)</td>\n</tr>\n<tr>\n<td><code>response.inMaintenance</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o indicador de manutenção do PE for diferente de 0</td>\n</tr>\n<tr>\n<td><code>response.maintenance</code></td>\n<td>object|null</td>\n<td>Preenchido com <code>{returnDate, description}</code> apenas quando o indicador de manutenção for exatamente 1 (\"Em manutenção\"); <code>null</code> nos demais casos</td>\n</tr>\n<tr>\n<td><code>response.active</code></td>\n<td>boolean</td>\n<td>Indica se o Ponto de Acesso está ativo</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato sem conexão com ponto de acesso vinculado</td>\n<td><code>success: false</code>, mensagem \"Registro não encontrado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use \"Lista as conexões por Cliente\" para os dados completos da conexão do contrato. Compare com \"Busca Status do PE por Usuário\", que retorna uma <strong>lista</strong> de pontos de acesso por cliente.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getaccesspointstatusbycontract","{{contractId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"62a9db6f-e32d-4159-a786-1219c58ccc21","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getaccesspointstatusbycontract/0000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"title\": \"Ponto de Acesso Padrão\", // Nome do Ponto de Acesso (PE/OLT)\n        \"inMaintenance\": false, // true quando o indicador de manutenção do PE for diferente de 0\n        \"maintenance\": null, // Preenchido com {returnDate, description} apenas quando o indicador de manutenção for exatamente 1 (\"Em manutenção\")\n        \"active\": false // Se o Ponto de Acesso está ativo\n    },\n    \"dataResponseType\": \"<>f__AnonymousType514`4\", // campo interno de tipagem do .NET; não deve ser usado/interpretado por integradores, o valor pode mudar entre versões\n    \"elapsedTime\": null\n}"}],"_postman_id":"a28c15fe-6a2b-4603-b026-1aa5dd25c164"},{"name":"Busca Status do PE por Usuário","id":"fb4c731f-1ba2-45e6-9e63-e7b7a14291dc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/getaccesspointstatusbyclient/{{clientId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Consulta o status de todos os pontos de acesso (PE/OLT) vinculados às conexões de um cliente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Cliente (<code>clientId</code>) com uma ou mais conexões cadastradas.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna <strong>uma lista</strong> com o ponto de acesso de cada conexão do cliente que tenha um ponto de acesso vinculado.</li>\n<li>Se o cliente não tiver nenhuma conexão com ponto de acesso vinculado, a API retorna sucesso com lista vazia (<code>response: []</code>) — este endpoint nunca retorna erro de \"não encontrado\".</li>\n<li><code>maintenance</code> só é preenchido quando o ponto de acesso está com o indicador de manutenção exatamente igual a \"em manutenção\"; caso contrário, vem <code>null</code>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (path)</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>clientId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador do cliente.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Sempre <code>true</code> neste endpoint (não há cenário de erro de negócio mapeado).</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome do Ponto de Acesso (PE/OLT)</td>\n</tr>\n<tr>\n<td><code>response[].inMaintenance</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o indicador de manutenção do PE for diferente de 0</td>\n</tr>\n<tr>\n<td><code>response[].maintenance</code></td>\n<td>object|null</td>\n<td>Preenchido com <code>{returnDate, description}</code> apenas quando o indicador de manutenção for exatamente 1 (\"Em manutenção\"); <code>null</code> nos demais casos</td>\n</tr>\n<tr>\n<td><code>response[].active</code></td>\n<td>boolean</td>\n<td>Indica se o Ponto de Acesso está ativo</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>response</code> pode vir como lista vazia (<code>[]</code>) quando o cliente não tem nenhuma conexão com ponto de acesso vinculado.</p>\n<p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Não há cenário de erro de negócio mapeado para este endpoint (ver \"Erros comuns\").</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Não há cenários de erro de negócio específicos mapeados para este endpoint — cliente inválido ou sem conexões resulta em <code>response: []</code> (lista vazia), não em erro.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Compare com \"Busca Status do PE por Contrato\", que retorna um único objeto para um contrato específico. Use \"Lista as conexões por Cliente\" para o detalhe completo de cada conexão.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getaccesspointstatusbyclient","{{clientId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"ed9229f1-0a43-4e83-945f-e181011fc99f","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.br:45715/external/integrations/thirdparty/getaccesspointstatusbyclient/00000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"title\": \"OLT-FIBERHOMEGTC\", // Nome do Ponto de Acesso (PE/OLT)\n            \"inMaintenance\": false, // true quando o indicador de manutenção do PE for diferente de 0\n            \"maintenance\": null, // Preenchido com {returnDate, description} apenas quando o indicador de manutenção for exatamente 1 (\"Em manutenção\")\n            \"active\": true // Se o Ponto de Acesso está ativo\n        }\n    ],\n    \"dataResponseType\": \"List<String>\", // campo interno de tipagem do .NET; não deve ser usado/interpretado por integradores, o valor pode mudar entre versões\n    \"elapsedTime\": null\n}"}],"_postman_id":"fb4c731f-1ba2-45e6-9e63-e7b7a14291dc"},{"name":"Registrar Tráfego de Usuário","id":"a8b4928c-0fe7-43d8-9dba-2f8a068ea841","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"user\": \"cliente@provedor\",\n    \"date\": \"2025-12-11T10:30:00.000Z\",\n    \"download\": 524288000,\n    \"upload\": 104857600,\n    \"totalDownload\": 10737418240,\n    \"totalUpload\": 2147483648\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/isp/authentication_contracts/traffic","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Registra ou atualiza os dados de tráfego (download/upload) diário de um usuário autenticado em uma conexão ISP, permitindo que sistemas externos enviem informações de consumo de banda coletadas fora do SynGW.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>O usuário informado (<code>user</code>) deve corresponder ao usuário de autenticação (PPPoE) de uma conexão já cadastrada no ERP.</li>\n<li>A coleta automática de tráfego (rotina agendada do SynGW/SynMiddleware) não pode estar ativa — ver regra abaixo.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Se existir uma tarefa agendada ativa do tipo coleta automática de tráfego, a API bloqueia a chamada — o registro manual via esta API e a coleta automática não podem coexistir.</li>\n<li>A data (<code>date</code>) deve ser <strong>anterior</strong> à data atual (não aceita hoje nem datas futuras).</li>\n<li>Todos os campos de volume (<code>download</code>, <code>upload</code>, <code>totalDownload</code>, <code>totalUpload</code>) devem ser maiores ou iguais a zero, em <strong>bytes</strong>.</li>\n<li>Criação ou atualização: se já existir um registro para o mesmo <code>user</code> dentro do mesmo dia (00:00:00 a 23:59:59 da data informada, e não excluído), os campos de volume são <strong>atualizados</strong>; caso contrário, um <strong>novo registro</strong> é criado.</li>\n<li>Ao criar um novo registro (nenhum registro prévio no dia), o usuário informado precisa existir em alguma conexão cadastrada — caso contrário, é rejeitado.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>user</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>Usuário PPPoE / identificador da conexão. Deve existir em uma conexão cadastrada.</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>ISO 8601 string</td>\n<td>Sim</td>\n<td>Data do tráfego. Deve ser anterior à data atual.</td>\n</tr>\n<tr>\n<td><code>download</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Volume de download no período, em bytes. ≥ 0.</td>\n</tr>\n<tr>\n<td><code>upload</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Volume de upload no período, em bytes. ≥ 0.</td>\n</tr>\n<tr>\n<td><code>totalDownload</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Volume total acumulado de download, em bytes. ≥ 0.</td>\n</tr>\n<tr>\n<td><code>totalUpload</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Volume total acumulado de upload, em bytes. ≥ 0.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Este endpoint não retorna os dados do registro criado/atualizado no corpo da resposta — apenas a mensagem em <code>messages</code>. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ O HTTP status retornado é sempre <strong>200 (OK)</strong>, inclusive nos cenários de erro listados abaixo — o resultado real deve ser lido em <code>success</code>. O <code>messages[].code</code> também não é um status HTTP: é um código interno de classificação do GW. Todas as validações deste endpoint retornam <code>code: 1000</code> (código genérico de exceção, pois o método não distingue os tipos de erro internamente).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem retornada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Coleta automática de tráfego ativa</td>\n<td>\"A coleta automática de dados de tráfego está ativa, desta forma não é possível utilizar esta API.\"</td>\n</tr>\n<tr>\n<td>Corpo não enviado/ilegível</td>\n<td>\"Ocorreu um erro ao ler os dados enviados. Por favor, verifique a documentação.\"</td>\n</tr>\n<tr>\n<td><code>user</code> não informado</td>\n<td>\"O campo usuário é obrigatório e não pode estar vazio.\"</td>\n</tr>\n<tr>\n<td><code>date</code> não informado</td>\n<td>\"O campo data é obrigatório e não pode estar vazio.\"</td>\n</tr>\n<tr>\n<td><code>date</code> igual ou posterior à data atual</td>\n<td>\"A data informada deve ser anterior à data atual.\"</td>\n</tr>\n<tr>\n<td><code>download</code>, <code>upload</code>, <code>totalDownload</code> ou <code>totalUpload</code> negativo</td>\n<td>\"O campo <code>&lt;nome&gt;</code> deve ser maior ou igual a zero.\"</td>\n</tr>\n<tr>\n<td><code>user</code> não encontrado em nenhuma conexão (apenas ao criar um registro novo)</td>\n<td>\"O usuário informado não foi encontrado no sistema.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Endpoint alternativo à coleta automática de tráfego do SynGW/SynMiddleware — use um ou outro, nunca os dois simultaneamente para o mesmo contrato.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","isp","authentication_contracts","traffic"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"22dced9d-939b-422b-a768-2e8a950d6274","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"user\": \"cliente@provedor\",\n    \"date\": \"2025-12-11T10:30:00.000Z\",\n    \"download\": 524288000,\n    \"upload\": 104857600,\n    \"totalDownload\": 10737418240,\n    \"totalUpload\": 2147483648\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/isp/authentication_contracts/traffic"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Registro atualizado com sucesso.\", // \"Registro criado com sucesso.\" quando não existir registro prévio para o usuário/dia\n            \"code\": null,\n            \"type\": \"success\"\n        }\n    ],\n    \"response\": null, // este endpoint não retorna os dados do registro no corpo da resposta\n    \"elapsedTime\": null\n}"},{"id":"a0e25492-e630-4c07-b0fc-fbea600ea095","name":"Erro — Coleta automática de tráfego ativa","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"user\": \"cliente@provedor\",\n    \"date\": \"2025-12-11T10:30:00.000Z\",\n    \"download\": 524288000,\n    \"upload\": 104857600,\n    \"totalDownload\": 10737418240,\n    \"totalUpload\": 2147483648\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/isp/authentication_contracts/traffic"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"A coleta automática de dados de tráfego está ativa, desta forma não é possível utilizar esta API.\",\n            \"code\": 1000, // código interno genérico do GW, não é um status HTTP\n            \"type\": \"error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"771edcdb-7703-4ce8-858f-94949dec7c86","name":"Erro — Campo obrigatório não informado","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"date\": \"2025-12-11T10:30:00.000Z\",\n    \"download\": 524288000,\n    \"upload\": 104857600,\n    \"totalDownload\": 10737418240,\n    \"totalUpload\": 2147483648\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/isp/authentication_contracts/traffic"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"O campo usuário é obrigatório e não pode estar vazio.\", // mesma estrutura para 'date', 'download', 'upload', 'totalDownload' e 'totalUpload' — ver seção \"Erros comuns\" da description\n            \"code\": 1000, // código interno genérico do GW, não é um status HTTP\n            \"type\": \"error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"a8b4928c-0fe7-43d8-9dba-2f8a068ea841"},{"name":"Lista as conexões por Cliente","id":"a3034173-8c4e-8e32-9ffe-c6c6ef439445","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/authentication-contract?clientId=1123&contractServiceTagId=3121","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os dados técnicos da conexão (contrato de autenticação) ativa vinculada a um cliente e a uma etiqueta de serviço (<code>contractServiceTagId</code>) específicos — usuário/senha de autenticação, equipamento, splitter, ponto de acesso e limites de banda contratados.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Cliente (<code>clientId</code>) e etiqueta de serviço do contrato (<code>contractServiceTagId</code>) existentes no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas a(s) conexão(ões) <strong>ativa(s)</strong> (<code>Active = true</code>) vinculada(s) ao par cliente + etiqueta de serviço informado.</li>\n<li>Se não existir conexão ativa para o par informado, a API responde com sucesso e lista vazia (<code>response: []</code>) — isso não é tratado como erro.</li>\n<li><code>clientId</code> e <code>contractServiceTagId</code> são obrigatórios e devem ser maiores que zero.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (query)</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>clientId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador do cliente. Deve ser maior que zero.</td>\n</tr>\n<tr>\n<td><code>contractServiceTagId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador da etiqueta de serviço do contrato. Deve ser maior que zero.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].user</code></td>\n<td>string</td>\n<td>Usuário de autenticação da conexão</td>\n</tr>\n<tr>\n<td><code>response[].password</code></td>\n<td>string</td>\n<td>Senha de autenticação da conexão</td>\n</tr>\n<tr>\n<td><code>response[].ip</code></td>\n<td>string|null</td>\n<td>IP fixo, quando aplicável (<code>ipType = FixedIp</code>)</td>\n</tr>\n<tr>\n<td><code>response[].ipType</code></td>\n<td>string</td>\n<td>Tipo de IP: <code>Undefined</code>, <code>FixedIp</code>, <code>ByConcentrator</code> ou <code>IpPool</code></td>\n</tr>\n<tr>\n<td><code>response[].macEquipment</code></td>\n<td>string</td>\n<td>MAC do equipamento (roteador/ONU) da conexão</td>\n</tr>\n<tr>\n<td><code>response[].equipmentType</code></td>\n<td>string</td>\n<td>Fabricante do equipamento</td>\n</tr>\n<tr>\n<td><code>response[].concentratorTitle</code></td>\n<td>string|null</td>\n<td>Nome do concentrador, quando <code>ipType = ByConcentrator</code></td>\n</tr>\n<tr>\n<td><code>response[].authenticationAccessPointTitle</code></td>\n<td>string</td>\n<td>Nome do Ponto de Acesso (PE) vinculado</td>\n</tr>\n<tr>\n<td><code>response[].splitter</code></td>\n<td>object|null</td>\n<td>Splitter vinculado à conexão (<code>null</code> quando não houver): <code>title</code>, <code>slotOlt</code>, <code>portOlt</code>, <code>port</code></td>\n</tr>\n<tr>\n<td><code>response[].slotOlt</code> / <code>response[].portOlt</code></td>\n<td>int</td>\n<td>Slot e porta da OLT (mesma informação do splitter, repetida no nível superior)</td>\n</tr>\n<tr>\n<td><code>response[].condominiumTitle</code></td>\n<td>string|null</td>\n<td>Nome do condomínio, quando a conexão estiver vinculada a um</td>\n</tr>\n<tr>\n<td><code>response[].equipmentSerialNumber</code></td>\n<td>string</td>\n<td>Número de série do equipamento</td>\n</tr>\n<tr>\n<td><code>response[].contractTag</code></td>\n<td>string</td>\n<td>Código da etiqueta de serviço (<code>contractServiceTagId</code>)</td>\n</tr>\n<tr>\n<td><code>response[].contractTagDescription</code></td>\n<td>string</td>\n<td>Descrição da etiqueta de serviço</td>\n</tr>\n<tr>\n<td><code>response[].uploadMaxLimit</code> / <code>response[].downloadMaxLimit</code></td>\n<td>int</td>\n<td>Limites de upload/download contratados, em Kbps</td>\n</tr>\n<tr>\n<td><code>response[].ipv6IngressPoliceName</code> / <code>response[].ipv6EgressPoliceName</code></td>\n<td>string|null</td>\n<td>Perfis de política de entrada/saída IPv6, quando configurados</td>\n</tr>\n<tr>\n<td><code>response[].huaweiProfileName</code></td>\n<td>string|null</td>\n<td>Perfil de velocidade Huawei, quando aplicável</td>\n</tr>\n<tr>\n<td><code>response[].address</code> / <code>response[].addressComplement</code></td>\n<td>string</td>\n<td>Endereço formatado e complemento da conexão</td>\n</tr>\n<tr>\n<td><code>response[].equipmentUser</code> / <code>response[].equipmentPassword</code></td>\n<td>string</td>\n<td>Usuário e senha de acesso ao equipamento</td>\n</tr>\n<tr>\n<td><code>response[].complement</code></td>\n<td>string</td>\n<td>Informação complementar da conexão</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>response</code> pode vir como lista vazia (<code>[]</code>) quando não há conexão ativa para o par cliente + etiqueta de serviço informado.</p>\n<p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientId</code> não informado ou ≤ 0</td>\n<td><code>success: false</code>, mensagem \"Identificador do cliente não informado.\"</td>\n</tr>\n<tr>\n<td><code>contractServiceTagId</code> não informado ou ≤ 0</td>\n<td><code>success: false</code>, mensagem \"Identificador da etiqueta não informado.\"</td>\n</tr>\n<tr>\n<td>Nenhuma conexão ativa para o par informado</td>\n<td><code>success: true</code>, <code>response: []</code> (não é erro)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use esta API para localizar o <code>authenticationContractId</code> da conexão e, em seguida: \"Lista scripts de provisionamento por Conexão\" e \"Provisiona uma conexão\" para reprovisionar o equipamento, ou \"Atualiza Conexão\" para editar os dados da conexão.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contracts","authentication-contract"],"host":["{{URL}}"],"query":[{"key":"clientId","value":"1123"},{"key":"contractServiceTagId","value":"3121"}],"variable":[]}},"response":[{"id":"96508cee-5130-ee7b-bba5-78fee23e33b0","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contracts/authentication-contract?clientId=1123&contractServiceTagId=3121","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contracts","authentication-contract"],"query":[{"key":"clientId","value":"1123"},{"key":"contractServiceTagId","value":"3121"}]},"description":"## Propósito\nRetorna os dados técnicos da conexão (contrato de autenticação) ativa vinculada a um cliente e a uma etiqueta de serviço (`contractServiceTagId`) específicos — usuário/senha de autenticação, equipamento, splitter, ponto de acesso e limites de banda contratados.\n\n## Pré-requisitos\n- Autenticação via Bearer Token.\n- Cliente (`clientId`) e etiqueta de serviço do contrato (`contractServiceTagId`) existentes no ERP.\n\n## Regras de negócio\n- Retorna apenas a(s) conexão(ões) **ativa(s)** (`Active = true`) vinculada(s) ao par cliente + etiqueta de serviço informado.\n- Se não existir conexão ativa para o par informado, a API responde com sucesso e lista vazia (`response: []`) — isso não é tratado como erro.\n- `clientId` e `contractServiceTagId` são obrigatórios e devem ser maiores que zero.\n\n## Campos obrigatórios e valores aceitos\n\n| Parâmetro (query) | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `clientId` | long | Sim | Identificador do cliente. Deve ser maior que zero. |\n| `contractServiceTagId` | long | Sim | Identificador da etiqueta de serviço do contrato. Deve ser maior que zero. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi bem-sucedida. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].user` | string | Usuário de autenticação da conexão |\n| `response[].password` | string | Senha de autenticação da conexão |\n| `response[].ip` | string\\|null | IP fixo, quando aplicável (`ipType = FixedIp`) |\n| `response[].ipType` | string | Tipo de IP: `Undefined`, `FixedIp`, `ByConcentrator` ou `IpPool` |\n| `response[].macEquipment` | string | MAC do equipamento (roteador/ONU) da conexão |\n| `response[].equipmentType` | string | Fabricante do equipamento |\n| `response[].concentratorTitle` | string\\|null | Nome do concentrador, quando `ipType = ByConcentrator` |\n| `response[].authenticationAccessPointTitle` | string | Nome do Ponto de Acesso (PE) vinculado |\n| `response[].splitter` | object\\|null | Splitter vinculado à conexão (`null` quando não houver): `title`, `slotOlt`, `portOlt`, `port` |\n| `response[].slotOlt` / `response[].portOlt` | int | Slot e porta da OLT (mesma informação do splitter, repetida no nível superior) |\n| `response[].condominiumTitle` | string\\|null | Nome do condomínio, quando a conexão estiver vinculada a um |\n| `response[].equipmentSerialNumber` | string | Número de série do equipamento |\n| `response[].contractTag` | string | Código da etiqueta de serviço (`contractServiceTagId`) |\n| `response[].contractTagDescription` | string | Descrição da etiqueta de serviço |\n| `response[].uploadMaxLimit` / `response[].downloadMaxLimit` | int | Limites de upload/download contratados, em Kbps |\n| `response[].ipv6IngressPoliceName` / `response[].ipv6EgressPoliceName` | string\\|null | Perfis de política de entrada/saída IPv6, quando configurados |\n| `response[].huaweiProfileName` | string\\|null | Perfil de velocidade Huawei, quando aplicável |\n| `response[].address` / `response[].addressComplement` | string | Endereço formatado e complemento da conexão |\n| `response[].equipmentUser` / `response[].equipmentPassword` | string | Usuário e senha de acesso ao equipamento |\n| `response[].complement` | string | Informação complementar da conexão |\n\n`response` pode vir como lista vazia (`[]`) quando não há conexão ativa para o par cliente + etiqueta de serviço informado.\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `clientId` não informado ou ≤ 0 | `success: false`, mensagem \"Identificador do cliente não informado.\" |\n| `contractServiceTagId` não informado ou ≤ 0 | `success: false`, mensagem \"Identificador da etiqueta não informado.\" |\n| Nenhuma conexão ativa para o par informado | `success: true`, `response: []` (não é erro) |\n\n## Fluxo relacionado\nUse esta API para localizar o `authenticationContractId` da conexão e, em seguida: \"Lista scripts de provisionamento por Conexão\" e \"Provisiona uma conexão\" para reprovisionar o equipamento, ou \"Atualiza Conexão\" para editar os dados da conexão."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"user\": \"\", // Usuário de autenticação da conexão\n            \"password\": \"\", // Senha de autenticação\n            \"ip\": null, // IP fixo, quando aplicável (ipType = FixedIp)\n            \"ipType\": \"\", // Descrição do tipo de IP: Undefined | FixedIp | ByConcentrator | IpPool\n            \"macEquipment\": \"\", // MAC do equipamento (roteador/ONU) da conexão\n            \"equipmentType\": \"\", // Descrição do fabricante do equipamento\n            \"concentratorTitle\": \"\", // Nome do concentrador, quando ipType = ByConcentrator\n            \"authenticationAccessPointTitle\": \"\", // Nome do Ponto de Acesso (PE) vinculado\n            \"splitter\": { // Splitter vinculado à conexão (null quando não houver)\n                \"title\": \"\",\n                \"slotOlt\": 1,\n                \"portOlt\": 4,\n                \"port\": 11\n            },\n            \"slotOlt\": 1,\n            \"portOlt\": 4,\n            \"condominiumTitle\": null, // Nome do condomínio, quando a conexão estiver vinculada a um\n            \"equipmentSerialNumber\": \"\",\n            \"contractTag\": \"\", // Código da etiqueta de serviço (contractServiceTagId)\n            \"contractTagDescription\": \"-1150\",\n            \"uploadMaxLimit\": 51200, // Limite de upload contratado (Kbps)\n            \"downloadMaxLimit\": 102400, // Limite de download contratado (Kbps)\n            \"ipv6IngressPoliceName\": \"\", // Perfil de política de entrada IPv6, quando configurado\n            \"ipv6EgressPoliceName\": \"\", // Perfil de política de saída IPv6, quando configurado\n            \"huaweiProfileName\": \"\", // Perfil de velocidade Huawei, quando aplicável\n            \"address\": \"\", // Endereço formatado (logradouro, número, bairro - cidade/UF, CEP)\n            \"addressComplement\": \"\",\n            \"equipmentUser\": \"\",\n            \"equipmentPassword\": \"\",\n            \"complement\": \"\" // Informação complementar da conexão\n        }\n    ],\n    \"elapsedTime\": null\n}"}],"_postman_id":"a3034173-8c4e-8e32-9ffe-c6c6ef439445"},{"name":"Lista scripts de provisionamento por Conexão","id":"f9d8abe7-20d5-1738-3556-65dde0445d92","request":{"method":"GET","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/script-provisioning-authentication-contract?authenticationContractId=3121","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista os scripts de provisionamento disponíveis para o fabricante de equipamento configurado em uma conexão (contrato de autenticação) específica.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Conexão (<code>authenticationContractId</code>) ativa e com fabricante de equipamento (<code>equipmentType</code>) já definido.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A conexão é buscada apenas entre as <strong>ativas</strong>; se não encontrada, retorna erro \"Conexão não encontrada.\"</li>\n<li>Se a conexão não tiver fabricante de equipamento definido, retorna erro \"Tipo de equipamento não definido para a conexão.\"</li>\n<li>Os scripts retornados são filtrados pelo fabricante (<code>equipmentType</code>) da conexão.</li>\n<li>Se o fabricante não tiver nenhum script de provisionamento cadastrado, a API responde com <code>success: false</code> e a mensagem \"Nenhum script de provisionamento encontrado para este tipo de equipamento.\" — é um retorno de negócio (lista vazia), não uma falha técnica.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (query)</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>authenticationContractId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador da conexão. Deve ser maior que zero.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida. ⚠ Quando não há scripts cadastrados para o fabricante, vem <code>false</code> mesmo não sendo um erro técnico — trate essa mensagem especificamente antes de reportar falha ao usuário final.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>long</td>\n<td>Identificador do script de provisionamento</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Nome/descrição do script</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request (inclusive no cenário \"nenhum script encontrado\", em que <code>success: false</code> não representa falha técnica — ver nota acima e \"Erros comuns\").</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>authenticationContractId</code> não informado ou ≤ 0</td>\n<td>\"Identificador da conexão não informado.\"</td>\n</tr>\n<tr>\n<td>Conexão não encontrada/inativa</td>\n<td>\"Conexão não encontrada.\"</td>\n</tr>\n<tr>\n<td>Conexão sem fabricante definido</td>\n<td>\"Tipo de equipamento não definido para a conexão.\"</td>\n</tr>\n<tr>\n<td>Fabricante sem scripts cadastrados</td>\n<td><code>success: false</code>, \"Nenhum script de provisionamento encontrado para este tipo de equipamento.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use \"Lista as conexões por Cliente\" para obter o <code>authenticationContractId</code>, esta API para consultar os scripts disponíveis para o fabricante, e \"Provisiona uma conexão\" para executar o provisionamento com os <code>scriptsIds</code> escolhidos.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contracts","script-provisioning-authentication-contract"],"host":["{{URL}}"],"query":[{"key":"authenticationContractId","value":"3121"}],"variable":[]}},"response":[{"id":"039bebf4-3449-3c92-abd2-ffeaeaf5f145","name":"Sucesso","originalRequest":{"method":"GET","header":[{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contracts/script-provisioning-authentication-contract?authenticationContractId=3121","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contracts","script-provisioning-authentication-contract"],"query":[{"key":"authenticationContractId","value":"3121"}]},"description":"## Propósito\nLista os scripts de provisionamento disponíveis para o fabricante de equipamento configurado em uma conexão (contrato de autenticação) específica.\n\n## Pré-requisitos\n- Autenticação via Bearer Token.\n- Conexão (`authenticationContractId`) ativa e com fabricante de equipamento (`equipmentType`) já definido.\n\n## Regras de negócio\n- A conexão é buscada apenas entre as **ativas**; se não encontrada, retorna erro \"Conexão não encontrada.\"\n- Se a conexão não tiver fabricante de equipamento definido, retorna erro \"Tipo de equipamento não definido para a conexão.\"\n- Os scripts retornados são filtrados pelo fabricante (`equipmentType`) da conexão.\n- Se o fabricante não tiver nenhum script de provisionamento cadastrado, a API responde com `success: false` e a mensagem \"Nenhum script de provisionamento encontrado para este tipo de equipamento.\" — é um retorno de negócio (lista vazia), não uma falha técnica.\n\n## Campos obrigatórios e valores aceitos\n\n| Parâmetro (query) | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `authenticationContractId` | long | Sim | Identificador da conexão. Deve ser maior que zero. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi bem-sucedida. ⚠ Quando não há scripts cadastrados para o fabricante, vem `false` mesmo não sendo um erro técnico — trate essa mensagem especificamente antes de reportar falha ao usuário final. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | long | Identificador do script de provisionamento |\n| `response[].title` | string | Nome/descrição do script |\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request (inclusive no cenário \"nenhum script encontrado\", em que `success: false` não representa falha técnica — ver nota acima e \"Erros comuns\").\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `authenticationContractId` não informado ou ≤ 0 | \"Identificador da conexão não informado.\" |\n| Conexão não encontrada/inativa | \"Conexão não encontrada.\" |\n| Conexão sem fabricante definido | \"Tipo de equipamento não definido para a conexão.\" |\n| Fabricante sem scripts cadastrados | `success: false`, \"Nenhum script de provisionamento encontrado para este tipo de equipamento.\" |\n\n## Fluxo relacionado\nUse \"Lista as conexões por Cliente\" para obter o `authenticationContractId`, esta API para consultar os scripts disponíveis para o fabricante, e \"Provisiona uma conexão\" para executar o provisionamento com os `scriptsIds` escolhidos."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 0, // Identificador do script de provisionamento\n            \"title\": \"\" // Nome/descrição do script\n        }\n    ],\n    \"elapsedTime\": null\n}"}],"_postman_id":"f9d8abe7-20d5-1738-3556-65dde0445d92"},{"name":"Provisiona uma conexão","id":"20d0d63c-9465-9cd0-ca25-804f52b9b8e0","request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"authenticationContractId\": 123,\n    \"scriptsIds\": [\n        1,\n        23\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/provisioning-authentication-contract","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Executa o provisionamento de uma conexão (autenticação) já cadastrada, enviando um ou mais scripts de provisionamento para o equipamento de rede do cliente. A chamada é <strong>síncrona</strong>: a resposta HTTP só retorna depois que o provisionamento no equipamento (via sessão Telnet real) termina.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>A conexão (<code>authenticationContractId</code>) precisa existir e estar ativa.</li>\n<li>Recomenda-se consultar antes \"Lista scripts de provisionamento por Conexão\" para saber quais <code>scriptsIds</code> são válidos para o fabricante do equipamento dessa conexão — este endpoint não valida se o script pertence ao fabricante correto.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>authenticationContractId</code></td>\n<td>Sim</td>\n<td>Id da conexão (autenticação) a provisionar.</td>\n</tr>\n<tr>\n<td><code>scriptsIds</code></td>\n<td>Sim</td>\n<td>Lista de Ids de scripts de provisionamento a enviar ao equipamento. Pelo menos um item.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Cada <code>scriptId</code> enviado precisa existir, não estar deletado e estar ativo — mas o sistema <strong>não verifica se o script pertence ao fabricante do equipamento da conexão</strong>; um script de outro fabricante pode passar nesta validação e falhar só na execução real.</li>\n<li>O provisionamento executa uma sessão real no equipamento de rede do cliente antes de qualquer retorno de erro — uma falha reportada pode significar que parte do script já foi aplicada no equipamento antes de travar. A operação não é transacional do ponto de vista do equipamento físico.</li>\n<li>Toda chamada, com sucesso ou falha, grava um evento no histórico da conexão.</li>\n</ul>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Executa uma ação real no equipamento de rede do cliente — não é uma operação apenas de banco de dados.</li>\n<li>Atualiza o status interno de provisionamento da conexão conforme o resultado.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o provisionamento foi executado com sucesso no equipamento.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>—</td>\n<td>Não está presente nesta operação — a resposta só traz <code>success</code>/<code>messages</code>; o resultado do provisionamento é reportado apenas pelo texto da mensagem. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>scriptsIds</code> vazio</td>\n<td>\"É necessário informar pelo menos um script para provisionamento.\"</td>\n</tr>\n<tr>\n<td>Conexão não encontrada ou inativa</td>\n<td>\"Conexão não encontrada.\"</td>\n</tr>\n<tr>\n<td>Script inválido, inexistente ou inativo</td>\n<td>\"Script de provisionamento {scriptId} não encontrado ou inativo.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima — inclusive quando o provisionamento falha no equipamento. Verifique sempre o corpo da resposta (<code>success</code>/<code>messages</code>), nunca só o status HTTP.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Use \"Lista scripts de provisionamento por Conexão\" antes, para obter os <code>scriptsIds</code> válidos para o fabricante do equipamento dessa conexão.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contracts","provisioning-authentication-contract"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"3b8d22d1-b9de-8080-31d2-c61d01703138","name":"Provisiona uma conexão","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"authenticationContractId\": 123,\n    \"scriptsIds\": [\n        1,\n        23\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/provisioning-authentication-contract","description":"## Propósito\nExecuta o provisionamento de uma conexão (autenticação) já cadastrada, enviando um ou mais scripts de provisionamento para o equipamento de rede do cliente. A chamada é **síncrona**: a resposta HTTP só retorna depois que o provisionamento no equipamento (via sessão Telnet real) termina.\n\n## Pré-requisitos\n- A conexão (`authenticationContractId`) precisa existir e estar ativa.\n- Recomenda-se consultar antes \"Lista scripts de provisionamento por Conexão\" para saber quais `scriptsIds` são válidos para o fabricante do equipamento dessa conexão — este endpoint não valida se o script pertence ao fabricante correto.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `authenticationContractId` | Sim | Id da conexão (autenticação) a provisionar. |\n| `scriptsIds` | Sim | Lista de Ids de scripts de provisionamento a enviar ao equipamento. Pelo menos um item. |\n\n## Regras de negócio\n- Cada `scriptId` enviado precisa existir, não estar deletado e estar ativo — mas o sistema **não verifica se o script pertence ao fabricante do equipamento da conexão**; um script de outro fabricante pode passar nesta validação e falhar só na execução real.\n- O provisionamento executa uma sessão real no equipamento de rede do cliente antes de qualquer retorno de erro — uma falha reportada pode significar que parte do script já foi aplicada no equipamento antes de travar. A operação não é transacional do ponto de vista do equipamento físico.\n- Toda chamada, com sucesso ou falha, grava um evento no histórico da conexão.\n\n## Efeitos colaterais\n- Executa uma ação real no equipamento de rede do cliente — não é uma operação apenas de banco de dados.\n- Atualiza o status interno de provisionamento da conexão conforme o resultado.\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o provisionamento foi executado com sucesso no equipamento. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | — | Não está presente nesta operação — a resposta só traz `success`/`messages`; o resultado do provisionamento é reportado apenas pelo texto da mensagem. Mesma estrutura em sucesso e erro. |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `scriptsIds` vazio | \"É necessário informar pelo menos um script para provisionamento.\" |\n| Conexão não encontrada ou inativa | \"Conexão não encontrada.\" |\n| Script inválido, inexistente ou inativo | \"Script de provisionamento {scriptId} não encontrado ou inativo.\" |\n\n> O status HTTP é sempre 200, inclusive nos erros acima — inclusive quando o provisionamento falha no equipamento. Verifique sempre o corpo da resposta (`success`/`messages`), nunca só o status HTTP.\n\n## Fluxo relacionado\nUse \"Lista scripts de provisionamento por Conexão\" antes, para obter os `scriptsIds` válidos para o fabricante do equipamento dessa conexão."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\"success\":true,\"messages\":[{\"message\":\"Provisionamento executado com sucesso.\",\"code\":null,\"type\":\"Success\"}]}"}],"_postman_id":"20d0d63c-9465-9cd0-ca25-804f52b9b8e0"}],"id":"70cc1fef-2c52-451d-aac7-90aba3d6beeb","_postman_id":"70cc1fef-2c52-451d-aac7-90aba3d6beeb","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Faturamento","item":[{"name":"Consultas","item":[{"name":"Busca de anexos de um contrato","id":"4380bef3-7770-40d1-89cc-c0a623158a82","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads?contractNumber={{Número do contrato}}&pageNumber={{Página}}&pageSize={{Registros por página}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista, de forma paginada, os anexos (arquivos) associados a um contrato.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>contractNumber</code></td>\n<td>Sim</td>\n<td>Número do contrato cujos anexos serão listados.</td>\n</tr>\n<tr>\n<td><code>pageNumber</code></td>\n<td>Sim</td>\n<td>Número da página de resultados.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>Sim</td>\n<td>Quantidade de registros por página.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi concluída com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>–</td>\n<td>Id do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].title</code></td>\n<td>–</td>\n<td>Título do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].name</code></td>\n<td>–</td>\n<td>Nome do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].description</code></td>\n<td>–</td>\n<td>Descrição do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].contractId</code> / <code>response.data[].contract.id</code> / <code>response.data[].contract.contractNumber</code> / <code>response.data[].contract.description</code></td>\n<td>–</td>\n<td>Dados do contrato ao qual o anexo pertence.</td>\n</tr>\n<tr>\n<td><code>response.data[].documentationTypeId</code> / <code>response.data[].documentationType.id</code> / <code>response.data[].documentationType.code</code> / <code>response.data[].documentationType.title</code></td>\n<td>–</td>\n<td>Tipo de documentação do anexo.</td>\n</tr>\n<tr>\n<td><code>response.data[].dir</code></td>\n<td>–</td>\n<td>Diretório/caminho interno de armazenamento do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].size</code></td>\n<td>–</td>\n<td>Tamanho do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].mimetype</code></td>\n<td>–</td>\n<td>Tipo MIME do arquivo.</td>\n</tr>\n<tr>\n<td><code>response.data[].validity</code></td>\n<td>–</td>\n<td>Indica se o documento possui controle de vigência (<code>begin</code>/<code>final</code>).</td>\n</tr>\n<tr>\n<td><code>response.data[].clientView</code></td>\n<td>–</td>\n<td>Indica se o anexo é visível para o cliente.</td>\n</tr>\n<tr>\n<td><code>response.data[].begin</code> / <code>response.data[].final</code></td>\n<td>–</td>\n<td>Início e fim da vigência do documento, quando aplicável.</td>\n</tr>\n<tr>\n<td><code>response.data[].hasFile</code></td>\n<td>–</td>\n<td>Indica se o anexo possui arquivo de fato armazenado (nome e diretório preenchidos).</td>\n</tr>\n<tr>\n<td><code>response.data[].created</code> / <code>response.data[].createdBy</code></td>\n<td>–</td>\n<td>Data de criação do registro e Id do usuário responsável.</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de anexos encontrados para o contrato.</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual.</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Registros retornados nesta página.</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar a \"Upload de anexo em um contrato\" e \"Download de um anexo de um contrato\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["","external","integrations","thirdparty","contract","contractuploads"],"host":["{{URL}}"],"query":[{"key":"contractNumber","value":"{{Número do contrato}}"},{"key":"pageNumber","value":"{{Página}}"},{"key":"pageSize","value":"{{Registros por página}}"}],"variable":[]}},"response":[{"id":"edfe7816-d6f2-4656-b9eb-9a971f59a07c","name":"Busca de anexos de um contrato","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/contractuploads?contractNumber=123&pageNumber=1&pageSize=10","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["","external","integrations","thirdparty","contract","contractuploads"],"query":[{"key":"contractNumber","value":"123"},{"key":"pageNumber","value":"1"},{"key":"pageSize","value":"10"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":""}],"_postman_id":"4380bef3-7770-40d1-89cc-c0a623158a82"},{"name":"Busca de contratos paginada","id":"e5d7186e-7a2d-42a6-87b1-6fa2fb73ff7a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Token obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"txId\": \"string\", // CPF/CNPJ do cliente do contrato\n  \"txIdType\": 0, // 1 - Pessoa jurídica 2 - Pessoa Física\n  \"companyPlaceTxId\": \"string\", // Local do contrato\n  \"contractNumber\": \"string\", // Número do contrato\n  \"contractTypeCode\": \"string\", // Código do tipo de contrato\n  \"serviceProductCode\": \"string\", // Código do serviço\n  \"onlyActiveContracts\": true, // Apenas contratos ativos\n  \"page\": 0, // Página da consulta\n  \"pageSize\": 0 // Número de registros por página\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/getpaged","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca contratos cadastrados no ERPVoalle de forma paginada, retornando dados do contrato, do cliente titular e dos serviços vinculados a cada contrato.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Para consultar todos os contratos da base, os campos <code>page</code> e <code>pageSize</code> são obrigatórios. <code>pageSize</code> aceita apenas os valores <strong>5, 10, 20, 25, 50 ou 100</strong> — qualquer outro valor é rejeitado.</li>\n<li>Para uma consulta mais afunilada, os campos <code>contractNumber</code> ou <code>txId</code> (CPF/CNPJ do cliente titular) podem ser usados; quando informados, <code>page</code> e <code>pageSize</code> deixam de ser obrigatórios (assumem, por padrão, página 1 e 10 registros por página).</li>\n<li>Os demais campos funcionam como filtros opcionais, aplicados em conjunto com os anteriores: <code>onlyActiveContracts</code>, <code>serviceProductCode</code>, <code>contractTypeCode</code>, <code>companyPlaceTxId</code>, <code>txIdType</code>.</li>\n<li>Contratos excluídos (removidos logicamente) nunca são retornados.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>txId</code></td>\n<td>string</td>\n<td>Não</td>\n<td>CPF/CNPJ do cliente titular do contrato</td>\n</tr>\n<tr>\n<td><code>txIdType</code></td>\n<td>int</td>\n<td>Não</td>\n<td>1 - Pessoa jurídica, 2 - Pessoa física</td>\n</tr>\n<tr>\n<td><code>companyPlaceTxId</code></td>\n<td>string</td>\n<td>Não</td>\n<td>CNPJ do Local do contrato</td>\n</tr>\n<tr>\n<td><code>contractNumber</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Número do contrato</td>\n</tr>\n<tr>\n<td><code>contractTypeCode</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Código do tipo de contrato</td>\n</tr>\n<tr>\n<td><code>serviceProductCode</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Código do serviço</td>\n</tr>\n<tr>\n<td><code>onlyActiveContracts</code></td>\n<td>bool</td>\n<td>Não</td>\n<td>Filtra apenas contratos ativos</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>int</td>\n<td>Sim, exceto se <code>contractNumber</code> ou <code>txId</code> informados</td>\n<td>Página da consulta</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>int</td>\n<td>Sim, exceto se <code>contractNumber</code> ou <code>txId</code> informados</td>\n<td>Tamanho de página — apenas 5, 10, 20, 25, 50 ou 100</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data</code></td>\n<td>array</td>\n<td>Lista de contratos da página atual</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>number</td>\n<td>Total de contratos encontrados</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>number</td>\n<td>Página atual</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>number</td>\n<td>Registros retornados nesta página</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>number</td>\n<td>Total de páginas</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>contractStage</code> (estágio do contrato):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td>Pré-Contrato</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Em Aprovação</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Aprovado</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Rejeitado</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Cancelado</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>contractStatus</code> (situação do contrato):</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Em Cancelamento</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Normal</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Demonstração</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Cortesia</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Cancelado</td>\n</tr>\n<tr>\n<td>5</td>\n<td>Suspenso</td>\n</tr>\n<tr>\n<td>6</td>\n<td>Bloqueio Financeiro</td>\n</tr>\n<tr>\n<td>7</td>\n<td>Bloqueio Administrativo</td>\n</tr>\n<tr>\n<td>9</td>\n<td>Encerrado</td>\n</tr>\n</tbody>\n</table>\n</div><p>Os demais campos de cada contrato (dados do cliente, endereço, vendedores e serviços) estão comentados diretamente no exemplo de sucesso.</p>\n<p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>pageSize</code> fora dos valores permitidos</td>\n<td><code>success:false</code>, mensagem \"Tamanho de página {pageSize} não permitido, tente um dos seguintes valores: 5, 10, 20, 25, 50, 100\" (HTTP 200)</td>\n</tr>\n<tr>\n<td>Corpo da requisição não enviado/inválido</td>\n<td><code>success:false</code>, mensagem \"Dados da requisição inválidos, verifique as informações enviadas e tente novamente.\" (HTTP 200)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Após localizar o contrato, é possível operá-lo com os demais endpoints de Faturamento: <strong>Aprovar Contrato</strong>, <strong>Suspender Contrato</strong>, <strong>Trocar Titular do Contrato</strong>, <strong>Gerar pedido de venda</strong> e <strong>Cria valor eventual</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","getpaged"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"2fb2e338-595a-4ef0-b824-9eed6fc94f96","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}","description":"Token obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"txId\": \"string\", // CPF/CNPJ do cliente do contrato\n  \"txIdType\": 0, // 1 - Pessoa jurídica 2 - Pessoa Física\n  \"companyPlaceTxId\": \"string\", // Local do contrato\n  \"contractNumber\": \"string\", // Número do contrato\n  \"contractTypeCode\": \"string\", // Código do tipo de contrato\n  \"serviceProductCode\": \"string\", // Código do serviço\n  \"onlyActiveContracts\": true, // Apenas contratos ativos\n  \"page\": 0, // Página da consulta\n  \"pageSize\": 0 // Número de registros por página\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/getpaged"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": 0, // ID do contrato\n                \"contractType\": \"Contratos PF - Mensal\", // Tipo de contrato\n                \"companyPlaceTxId\": \"0000000000000\", // CNPJ do local do contrato\n                \"clientType\": \"Comercial\", // Tipo de cliente do contrato\n                \"description\": \"Contrato 100 - Contratos PF - Mensal - Cliente Teste\", // Descrição do contrato\n                \"contractNumber\": \"100\", // Número do contrato\n                \"fingerprint\": \"92cc7763-4133-4fde-9480-5360926cbe35\", // Hash de identificação\n                \"creationDate\": \"2022-01-01T00:00:00\", // Data de criação\n                \"monthsDuration\": 0, // Quantidade de meses da duração\n                \"automaticBlocking\": true, // Identifica se o bloqueio automático do contrato está habilitado\n                \"alertPayment\": true, // Identfica se esse contrato irá para a rotina de Comunicação de Faturamento\n                \"contractDateManagementCode\": \"01\", // Código do ciclo de faturamento, caso seja utilizado\n                \"contractDateManagement\": \"Vencimento Dia 5\", // Descrição do ciclo de faturamento, caso seja utilizado\n                \"expirationDocket\": \"Mês seguinte\", // Vencimento do boleto\n                \"collectionDay\": 5, // Dia de Vencimento padão da fatura do contrato\n                \"cutDay\": 30, // Dia de Corte\n                \"billingDay\": 26, // Dia de Faturamento\n                \"beginningDate\": \"2022-01-01T00:00:00\", // Inicido da vigência\n                \"finalDate\": \"2022-01-01T00:00:00\", // Final da vigência\n                \"billingBeginningDate\": \"2022-01-01T00:00:00\", //  Inicio da vigência de faturamento\n                \"billingFinalDate\": \"2023-01-01T00:00:00\", // Final da vigência de faturamento\n                \"financialCollectionType\": \"\", // Tipo da cobrança\n                \"specialBillingType\": \"\", // Tipo de faturamento especial\n                \"nextAdjustmentDate\": \"2022-01-01T00:00:00\", // Data agendada para o próximo reajuste\n                \"contractStage\": 5, // Estágio atual do contrato. 1 - Pré-Contrato, 2 - Em Aprovação, 3 - Aprovado, 4 - Rejeitado, 5 - Cancelado\n                \"contractStatus\": 3, // Status atual do contrato. 1 - Normal, 2 - Demonstração, 3 - Cortesia, 4 - Cancelado, 5 - Suspenso, 6 - Bloqueio Financeiro, 7 - Bloqueio Administrativo, 9 - Encerrado, 0 - Em Cancelamento\n                \"seller1\": {\n                    \"TxId\": \"\", // CPF/CNPJ do vendedor 1 do contrato\n                    \"Name\": \"\" // Nome do vendedor 1 do contrato\n                },\n                \"seller2\": { // (campo novo)\n                    \"TxId\": \"\", // CPF/CNPJ do vendedor 2 do contrato\n                    \"Name\": \"\" // Nome do vendedor 2 do contrato\n                },\n                \"contractAddressInformation\": {\n                    \"postalCode\": \"97000000\", // CEP do endereço\n                    \"street\": \"\", // Logradouro\n                    \"streetType\": \"\", // Tipo do logradouro\n                    \"number\": \"\", // Número\n                    \"neighborhood\": \"String\", // Bairro\n                    \"addressComplement\": \"\", // Complemento\n                    \"addressReference\": \"\", // Referência\n                    \"residenceType\": \"\", //  Tipo de residência\n                    \"state\":\"\", // UF\n                    \"city\":\"\" // Cidade\n                },\n                \"clientInformation\": {\n                    \"clientTxId\": \"00000000000\", // CPF ou CNPJ do cliente\n                    \"name\": \"\", // Nome ou Razão Social do cliente\n                    \"typeTxId\": \"CPF\", // Tipo de docuemnto\n                    \"phone\": \"\", // Número de telefone \n                    \"cellPhone1\": \"\", // Celular\n                    \"email\": \"\", // Email\n                    \"birthDate\": \"2022-01-01T00:00:00\", // Data de nascimento ou data de fundação\n                    \"identity\": \"\", // RG\n                    \"mainAddressInformation\": null // Informação do endereço principal desse cliente\n                },\n                \"servicesInformation\": [\n                    {\n                        \"id\": 0, // Identificado do banco do serviço\n                        \"serviceProductCode\": \"0010\", // Código amigável do serviço\n                        \"description\":\"string\", // Descrição do item de contrato\n                        \"quantity\": 1, // Quantidade de itens\n                        \"amount\": 10.0, // Valor por item\n                        \"type\": \"Serviço\", // Tipo de serviço\n                        \"iccId\": \"\", // ICCID vinculado ao serviço, caso seja um serviço de MVNO\n                        \"msisdn\": \"\", // MSISDN vinculado ao serviço, caso seja um serviço de MVNO\n                        \"phoneNumber\": \"\", // Núemro de telefone, caso seja um serviço STFC\n                        \"integrationCode\": \"\", // Código de integração do serviço\n                        \"fingerprint\": \"d30e1b87-3a57-4a18-98e3-df590c737c13\", // Hash de identificação do item\n                        \"contractServiceTag\": \"\", // Etiqueta de serviço\n                        \"isCombination\": true, // Identifica se o serviço é um Combo\n                        \"servicesCombination\": [ // Informações dos serviços contidos no combo\n                            {\n                                \"serviceProductCode\": \"0010.1\",\n                                \"description\":\"string\",\n                                \"quantity\": 2,\n                                \"amount\": 5.00,\n                                \"type\": \"Serviço STFC\",\n                                \"iccId\": \"\",\n                                \"msisdn\": \"\",\n                                \"phoneNumber\": \"5533333333\",\n                                \"integrationCode\": \"123321\",\n                                \"fingerprint\": \"3caab94b-b001-4916-80c9-d8e50a089004\",\n                                \"contractServiceTag\": \"5AKXCZBA\",\n                                \"isCombination\": false,\n                                \"servicesCombination\": [],\n                                \"isComposition\": false,\n                                \"servicesComposition\": []\n                            }\n                        ],\n                        \"isComposition\": false, // Identifica se o serviço é um serviço composto\n                        \"servicesComposition\": [] // Informações dos serviços que compoem a composição\n                    }\n                ]\n            }\n        ],\n        \"totalRecords\": 1, // Quantidade totais de contratos encontrados\n        \"page\": 1, // Página atual da consulta\n        \"pageSize\": 10, // Quantidade de registros nessa página\n        \"totalPages\": 1 // Quantidade de páginas totais\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"e5d7186e-7a2d-42a6-87b1-6fa2fb73ff7a"}],"id":"5aa3d97a-e84f-41a7-bc09-250af4272962","_postman_id":"5aa3d97a-e84f-41a7-bc09-250af4272962","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Gerar contrato","id":"f0e6db07-a217-4e4c-80f6-43fd0fb4563a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"clientInformation\": { // OBRIGATÓRIO\n        \"clientTxid\": \"string\", // OBRIGATÓRIO — CPF do cliente\n        \"name\": \"string\", // OBRIGATÓRIO — Nome do cliente\n        \"typeTxId\": 1, // OBRIGATÓRIO — Tipo da pessoa 1-CNPJ ou 2-CPF\n        \"phone\": \"string\", // opcional — Número de telefone do cliente\n        \"cellPhone1\": \"string\", // opcional — Número do celular do cliente\n        \"email\": \"string\", // opcional — E-mail do cliente\n        \"emailNfe\": \"string\", // opcional — E-mail para envio de faturamento\n        \"birthDate\": \"2024-03-26\", // opcional — Data de nascimento do cliente\n        \"gender\": 1, // opcional — Gênero do cliente 1 - masculino e 2- feminino\n        \"civilStatus\": 1, // opcional — Estado civil 1 - solteiro 2 - casado  3 - divorciado 4 - viúvo 5 - união estável 6 - divorciado\n        \"identity\": \"string\", // opcional — RG\n        \"parentsName\": \"string\", // opcional — Nome da mãe\n        \"stateRegistration\": \"string\", // opcional — Inscrição estadual\n        \"municipalRegistration\": \"string\", // opcional — Inscrição municipal\n        \"stateRegistrationType\": 1, // opcional — Tipos de inscrição estadual 1-Contribuinte 2-Isento 9-Não contribuinte\n        \"addressInformation\": { // OBRIGATÓRIO\n            \"postalCode\": \"string\", // OBRIGATÓRIO — CEP\n            \"street\": \"string\", // OBRIGATÓRIO — Rua\n            \"streetType\": 0, // OBRIGATÓRIO — Tipo da logradouro\n            \"number\": \"string\", // OBRIGATÓRIO — Número\n            \"neighborhood\": \"string\", // OBRIGATÓRIO — Bairro\n            \"state\": \"string\", // OBRIGATÓRIO — Estado\n            \"city\": \"string\", // OBRIGATÓRIO — Cidade\n            \"addressComplement\": \"string\", // opcional — Complemento\n            \"addressReference\": \"string\", // opcional — Referência\n            \"residenceTypeCode\": \"string\" // opcional — Tipo de resistência\n        }\n    },\n    \"contractInformation\": { // OBRIGATÓRIO\n        \"contractTypeCode\": \"string\", // OBRIGATÓRIO — Código do tipo de contrato\n        \"companyPlaceTxid\": \"string\", // OBRIGATÓRIO — CNPJ do local vinculado ao contrato\n        \"companyPlaceBusinessUnitCode\": \"string\", // opcional — Código da Unidade de Negócio\n        \"clientType\": 1, // OBRIGATÓRIO — Tipo do cliente\n        \"description\": \"string\", // opcional — Descrição do contrato\n        \"date\": \"2024-03-26\", // opcional — Data de criação\n        \"monthsDuration\": 0, // opcional — Duração do contrato em meses\n        \"automaticBlocking\": true, // opcional — Ativa ou desativa do bloqueio do contrato\n        \"alertPayment\": true, // opcional — Ativa ou desativa a comunicação de faturamento\n        \"contractDateManagementCode\": \"string\", // opcional — Código do ciclo de faturamento\n        \"expirationDocket\": 0, // opcional — Vencimento do boleto 0 - Mês atual 1 - Mês seguinte\n        \"collectionDay\": 0, // opcional — Dia de vencimento do boleto\n        \"cutDay\": 0, // opcional — Dia de corte do contrato\n        \"billingDay\": 0, // opcional — Dia de faturamento\n        \"beginningDate\": \"2024-03-26\", // OBRIGATÓRIO — Inicio da vigencia\n        \"finalDate\": \"2024-03-26\", // OBRIGATÓRIO — Final da viigência\n        \"billingBeginningDate\": \"2024-03-26\", // OBRIGATÓRIO — Inicio do faturamento\n        \"billingFinalDate\": \"2024-03-26\", // OBRIGATÓRIO — Final do faturamento\n        \"financialCollectionTypeCode\": \"string\", // OBRIGATÓRIO — Código do tipo de cobrança\n        \"financialOperationCode\": \"string\", // OBRIGATÓRIO — Código da operação\n        \"financersNatureCode\": \"string\", // OBRIGATÓRIO — Código da natureza financeira\n        \"paymentConditionCode\": \"string\", // OBRIGATÓRIO — Código da condição de pagamento\n        \"specialBillingTypeCode\": \"string\", // opcional — Código do tipo de faturamento especial\n        \"nextAdjustmentDate\": \"2024-03-26\", // OBRIGATÓRIO — Data do próximo reajuste\n        \"contractObservations\": \"string\", // opcional — Observação do contrato\n        \"contractStage\": 1 // opcional — Estágio do contrato\n    },\n    \"servicesInformation\": [ // OBRIGATÓRIO — deve conter ao menos 1 item\n        {\n            \"serviceCode\": \"string\", // OBRIGATÓRIO — Código do serviço\n            \"serviceQuantity\": 0, // OBRIGATÓRIO — Quantidade\n            \"serviceAmount\": 0.0, // OBRIGATÓRIO — Valor do serviço\n            \"phoneGroupId\": \"string\", // condicional — Id publico do grupo de telefone\n            \"PhoneNumberInformations\": [ // condicional — obrigatório quando o serviço exige números de telefone\n                {\n                    \"PhoneNumber\": \"55999999999\", // OBRIGATÓRIO — Número a ser vinculado ao item de contrato\n                    \"PhoneNumberType\": \"0\", // OBRIGATÓRIO — Tipo de número 0 - Fixo, 1 - Celular, 2 - Outro\n                    \"IsPortability\": true // OBRIGATÓRIO — Identifica se é uma portabilidade ou não\n                }\n            ]\n        }\n    ],\n    \"activationInformation\": { // opcional — se omitido, o contrato é criado sem protocolo de ativação\n        \"teamCode\": \"string\", // opcional — Código da equipe\n        \"solicitationTypeCode\": \"string\", // OBRIGATÓRIO —  Código do tipo de solicitação\n        \"description\": \"string\", // OBRIGATÓRIO — Descrição da solicitação de ativação\n        \"activationDate\": \"2024-03-26\", // OBRIGATÓRIO — Data da ativação\n        \"matrixCode\": \"string\" // condicional — Código da Matriz (obrigatório para regiões de Field Service)\n    },\n    \"integratorInformation\": { // OBRIGATÓRIO\n        \"integratorIdentification\": \"string\" // OBRIGATÓRIO — Alias do integrador\n    }\n}"},"url":"{{URL}}:45715/external/billing/contracts/create","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria um novo contrato (e, opcionalmente, um protocolo de ativação) no ERPVoalle. Através do CPF/CNPJ informado, valida se já existe um cliente cadastrado ou se é necessário cadastrar um novo.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Caso não seja enviada a descrição do contrato, é gerada no padrão <code>Contrato {número} - {Tipo de contrato} - {Nome do Cliente}</code>.</li>\n<li>Caso não seja enviado o campo <code>monthsDuration</code>, é assumido o valor parametrizado no tipo de contrato.</li>\n<li>Os ciclos de cobrança (<code>contractDateManagementCode</code>) só são aceitos quando vinculados ao tipo de contrato enviado.</li>\n<li><code>automaticBlocking</code> e <code>alertPayment</code>, quando não informados, assumem <code>true</code>.</li>\n<li>Caso não informado, <code>specialBillingTypeCode</code> usa o padrão \"Tipo Padrão\".</li>\n<li>Os tipos de contrato permitidos são os mesmos configurados no cadastro de Locais.</li>\n<li><code>servicesInformation</code> é uma lista — podem ser enviados diversos serviços. São aceitos apenas serviços SVA e de internet; devem estar vinculados ao Tipo de Contrato enviado.</li>\n<li><code>expirationDocket</code>, <code>collectionDay</code> e <code>cutDay</code> só são obrigatórios quando <code>contractDateManagementCode</code> não é enviado; quando enviado, prevalecem os valores do ciclo de faturamento do ERP.</li>\n<li>Caso não seja informado <code>contractStage</code>, o contrato é gerado conforme o parâmetro padrão do CRM.</li>\n<li>Para que a solicitação de ativação caia no fluxo do Field Service Management, é obrigatório o uso de Matrizes (<code>matrixCode</code>) na categorização do protocolo.</li>\n<li>É validado se <code>solicitationTypeCode</code> tem permissão para abertura de protocolo no Local do contrato (<code>companyPlaceTxId</code>); se não, a abertura do protocolo de ativação é impedida — o mesmo vale para o uso de Matrizes.</li>\n<li><code>solicitationTypeCode</code> da ativação deve ser referente a um Tipo de Solicitação Externa, caso contrário retorna: \"A solicitação de ativação exige um tipo de solicitação do tipo Externo.\"</li>\n<li>Para serviços STFC, é obrigatório informar um número de telefone vinculado ao item de contrato: o número deve existir no Grupo de Telefone (<code>phoneGroupId</code>) informado; em caso de portabilidade com número inexistente, ele é cadastrado nesse mesmo grupo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Bloco</th>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientInformation</code></td>\n<td><code>clientTxid</code>, <code>name</code>, <code>typeTxId</code></td>\n<td>Sim</td>\n<td>CPF/CNPJ, nome e tipo de pessoa (1-CNPJ, 2-CPF)</td>\n</tr>\n<tr>\n<td><code>clientInformation</code></td>\n<td>demais campos (<code>phone</code>, <code>email</code>, <code>birthDate</code>, <code>gender</code>, <code>civilStatus</code> etc.)</td>\n<td>Não</td>\n<td>Ver comentários no corpo de exemplo</td>\n</tr>\n<tr>\n<td><code>clientInformation.addressInformation</code></td>\n<td><code>postalCode</code>, <code>street</code>, <code>streetType</code>, <code>number</code>, <code>neighborhood</code>, <code>state</code>, <code>city</code></td>\n<td>Sim</td>\n<td>Endereço do cliente</td>\n</tr>\n<tr>\n<td><code>contractInformation</code></td>\n<td><code>contractTypeCode</code>, <code>companyPlaceTxid</code>, <code>clientType</code>, <code>beginningDate</code>, <code>finalDate</code>, <code>billingBeginningDate</code>, <code>billingFinalDate</code>, <code>financialCollectionTypeCode</code>, <code>financialOperationCode</code>, <code>financersNatureCode</code>, <code>paymentConditionCode</code>, <code>nextAdjustmentDate</code></td>\n<td>Sim</td>\n<td>Dados do contrato</td>\n</tr>\n<tr>\n<td><code>contractInformation</code></td>\n<td>demais campos (<code>description</code>, <code>monthsDuration</code>, <code>automaticBlocking</code>, <code>contractDateManagementCode</code>, <code>expirationDocket</code>, <code>collectionDay</code>, <code>cutDay</code>, <code>billingDay</code>, <code>specialBillingTypeCode</code>, <code>contractObservations</code>, <code>contractStage</code>)</td>\n<td>Não/condicional</td>\n<td>Ver regras de negócio acima</td>\n</tr>\n<tr>\n<td><code>servicesInformation[]</code></td>\n<td><code>serviceCode</code>, <code>serviceQuantity</code>, <code>serviceAmount</code></td>\n<td>Sim (ao menos 1 item)</td>\n<td>Serviços do contrato</td>\n</tr>\n<tr>\n<td><code>servicesInformation[].PhoneNumberInformations[]</code></td>\n<td><code>PhoneNumber</code>, <code>PhoneNumberType</code>, <code>IsPortability</code></td>\n<td>Condicional</td>\n<td>Obrigatório quando o serviço exige número de telefone (STFC)</td>\n</tr>\n<tr>\n<td><code>activationInformation</code></td>\n<td><code>solicitationTypeCode</code>, <code>description</code>, <code>activationDate</code></td>\n<td>Condicional</td>\n<td>Obrigatórios apenas se o bloco <code>activationInformation</code> for enviado (senão o contrato é criado sem protocolo de ativação)</td>\n</tr>\n<tr>\n<td><code>integratorInformation</code></td>\n<td><code>integratorIdentification</code></td>\n<td>Sim</td>\n<td>Alias do integrador</td>\n</tr>\n</tbody>\n</table>\n</div><p>Tabelas de domínio (<code>clientType</code> e <code>streetType</code>) e a regra de <code>phoneNumberType</code> estão detalhadas nos comentários do corpo de exemplo da requisição.</p>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o contrato foi criado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.contractNumber</code></td>\n<td>string</td>\n<td>Número do contrato criado</td>\n</tr>\n<tr>\n<td><code>response.activationAssignment</code></td>\n<td>number|null</td>\n<td>Número do protocolo de ativação gerado (quando <code>activationInformation</code> enviado)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Serviço de telefonia móvel enviado sem suporte</td>\n<td>\"Serviços de telefonia móvel não é suportado.\"</td>\n</tr>\n<tr>\n<td><code>solicitationTypeCode</code> não é do tipo Externo</td>\n<td>\"A solicitação de ativação exige um tipo de solicitação do tipo Externo.\"</td>\n</tr>\n<tr>\n<td>Dados obrigatórios ausentes/inválidos</td>\n<td>\"Dados não informados na requisição.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Após a criação, o contrato pode ser consultado em <strong>Busca de contratos paginada</strong>, aprovado em <strong>Aprovar Contrato</strong>, ou operado com <strong>Suspender Contrato</strong>, <strong>Trocar Titular do Contrato</strong>, <strong>Cria valor eventual</strong> e <strong>Gerar pedido de venda</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","billing","contracts","create"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"3e348912-55ff-42af-a9cb-c34143a33b00","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n  \"clientInformation\": {\n    \"clientTxid\": \"00000000000\",\n    \"name\": \"Cliente teste\",\n    \"typeTxId\": 2,\n    \"phone\": \"5533221122\",\n    \"cellPhone1\": \"55999999999\",\n    \"email\": \"teste@email.com.br\",\n    \"emailNfe\": \"teste@email.com.br\",\n    \"birthDate\": \"2000-01-01\",\n    \"gender\": 1,\n    \"civilStatus\": 1,\n    \"identity\": \"0011229933\",\n    \"parentsName\": \"Mãe do cliente\",\n    \"stateRegistration\": \"01921\",\n    \"municipalRegistration\": \"5215616\",\n    \"stateRegistrationType\": 1,\n    \"addressInformation\": {\n      \"postalCode\": \"97050800\",\n      \"street\": \"Rua de teste\",\n      \"streetType\": 1,\n      \"number\": \"1000\",\n      \"neighborhood\": \"Centro\",\n      \"state\": \"Rio Grande do Sul\",\n      \"city\": \"Porto Alegre\",\n      \"addressComplement\": \"Ap\",\n      \"addressReference\": \"EM frente do\",\n      \"residenceTypeCode\": \"01\"\n    }\n  },\n  \"contractInformation\": {\n    \"contractTypeCode\": \"string\",\n    \"companyPlaceTxid\": \"string\",\n    \"companyPlaceBusinessUnitCode\":\"string\",\n    \"clientType\": 1,\n    \"description\": \"string\",\n    \"date\": \"2024-03-26\",\n    \"monthsDuration\": 0,\n    \"automaticBlocking\": true,\n    \"alertPayment\": true,\n    \"contractDateManagementCode\": \"string\", \n    \"expirationDocket\": 0,\n    \"collectionDay\": 0,\n    \"cutDay\": 0,\n    \"billingDay\": 0,\n    \"beginningDate\": \"2024-03-26\",\n    \"finalDate\": \"2024-03-26\",\n    \"billingBeginningDate\": \"2024-03-26\",\n    \"billingFinalDate\": \"2024-03-26\",\n    \"financialCollectionTypeCode\": \"string\",\n    \"financialOperationCode\": \"string\",\n    \"financersNatureCode\": \"string\",\n    \"paymentConditionCode\": \"string\",\n    \"specialBillingTypeCode\": \"string\",\n    \"nextAdjustmentDate\": \"2024-03-26\",\n    \"contractObservations\": \"string\",\n    \"contractStage\": 1\n  },\n  \"servicesInformation\": [\n    {\n      \"serviceCode\": \"001\",\n      \"serviceQuantity\": 1,\n      \"serviceAmount\": 10.99\n    }\n  ],\n  \"activationInformation\": {\n    \"teamCode\": \"string\",\n    \"solicitationTypeCode\": \"string\",\n    \"description\": \"string\",\n    \"activationDate\": \"2024-03-26\",\n    \"matrixCode\":\"0123\"\n  },\n  \"integratorInformation\": {\n    \"integratorIdentification\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/billing/contracts/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"contractNumber\":\"123\",\n        \"activationAssignment\":321\n    },\n    \"dataResponseType\":\"ContractFromExternalReturn\",\n    \"elapsedTime\": null\n}"},{"id":"41626a1c-c367-4c0d-9863-550bd871bc34","name":"Erro — Serviço de telefonia móvel não suportado","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n  \"clientInformation\": {\n    \"clientTxid\": \"00000000000\",\n    \"name\": \"Cliente teste\",\n    \"typeTxId\": 2,\n    \"phone\": \"5533221122\",\n    \"cellPhone1\": \"55999999999\",\n    \"email\": \"teste@email.com.br\",\n    \"emailNfe\": \"teste@email.com.br\",\n    \"birthDate\": \"2000-01-01\",\n    \"gender\": 1,\n    \"civilStatus\": 1,\n    \"identity\": \"0011229933\",\n    \"parentsName\": \"Mãe do cliente\",\n    \"stateRegistration\": \"01921\",\n    \"municipalRegistration\": \"5215616\",\n    \"stateRegistrationType\": 1,\n    \"addressInformation\": {\n      \"postalCode\": \"97050800\",\n      \"street\": \"Rua de teste\",\n      \"streetType\": 1,\n      \"number\": \"1000\",\n      \"neighborhood\": \"Centro\",\n      \"state\": \"Rio Grande do Sul\",\n      \"city\": \"Porto Alegre\",\n      \"addressComplement\": \"Ap\",\n      \"addressReference\": \"EM frente do\",\n      \"residenceTypeCode\": \"01\"\n    }\n  },\n  \"contractInformation\": {\n    \"contractTypeCode\": \"string\",\n    \"companyPlaceTxid\": \"string\",\n    \"companyPlaceBusinessUnitCode\":\"string\",\n    \"clientType\": 1,\n    \"description\": \"string\",\n    \"date\": \"2024-03-26\",\n    \"monthsDuration\": 0,\n    \"automaticBlocking\": true,\n    \"alertPayment\": true,\n    \"contractDateManagementCode\": \"string\", \n    \"expirationDocket\": 0,\n    \"collectionDay\": 0,\n    \"cutDay\": 0,\n    \"billingDay\": 0,\n    \"beginningDate\": \"2024-03-26\",\n    \"finalDate\": \"2024-03-26\",\n    \"billingBeginningDate\": \"2024-03-26\",\n    \"billingFinalDate\": \"2024-03-26\",\n    \"financialCollectionTypeCode\": \"string\",\n    \"financialOperationCode\": \"string\",\n    \"financersNatureCode\": \"string\",\n    \"paymentConditionCode\": \"string\",\n    \"specialBillingTypeCode\": \"string\",\n    \"nextAdjustmentDate\": \"2024-03-26\",\n    \"contractObservations\": \"string\",\n    \"contractStage\": 1\n  },\n  \"servicesInformation\": [\n    {\n      \"serviceCode\": \"001\",\n      \"serviceQuantity\": 1,\n      \"serviceAmount\": 10.99\n    }\n  ],\n  \"activationInformation\": {\n    \"teamCode\": \"string\",\n    \"solicitationTypeCode\": \"string\",\n    \"description\": \"string\",\n    \"activationDate\": \"2024-03-26\",\n    \"matrixCode\":\"0123\"\n  },\n  \"integratorInformation\": {\n    \"integratorIdentification\": \"string\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/billing/contracts/create"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\":\"Serviços de telefonia móvel não é suportado.\",\n            \"code\":\"1000\",\n            \"type\":\"Error\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\":\"ContractFromExternalReturn\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"f0e6db07-a217-4e4c-80f6-43fd0fb4563a"},{"name":"Gerar pedido de venda","id":"51002c15-fad9-4c3c-8aaa-ac7003650695","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n   \"companyPlaceTxId\":\"00.000.000/0000-00\", // CNPJ do cadastro de Locais\n   \"clientTxId\":\"12345678900\", // CPF/CNPJ do cliente\n   \"contractNumber\":\"12345\", // Número do contrato\n   \"priceListId\":\"1bf0394c-75ea-5b74-a2cd-625ea053c876\", // Id público da lista de preço \n   \"financialCollectionTypeId\":\"7d4c8755-2aa8-e178-6d4a-05088dcea805\", // Id público do Tipo de Cobrança\n   \"paymentConditionId\":\"ea100f2a-4ff8-6a3b-1f74-9f932ee914ae\", // Id público da condição de pagamento\n   \"items\":[\n      {\n         \"id\":\"1d78d244-e090-bbe6-6e6e-6620e2af4ef2\", // Id público do produto/serviço\n         \"quantity\":1, // Quantidade\n         \"unitValue\": 10 // Valor de cada unidade do item\n      }, \n      {\n         \"id\":\"349817cf-7a5d-fd76-fd57-3857880b92a8\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      },\n    \n      {\n         \"id\":\"39a01b82-7470-cee8-60f2-f9947fc67aec\",\n         \"quantity\":1,\n         \"unitValue\": 23.5\n      },\n      {\n         \"id\":\"44b72fd0-3493-214b-a80f-bffcefceb94c\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/salerequest","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria e fatura um pedido de venda no ERPVoalle, vinculado a um cliente (e opcionalmente a um contrato), respeitando as regras de faturamento por Local de cada item incluído no pedido.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O cliente (<code>clientTxId</code>) deve ser uma pessoa já cadastrada no ERPVoalle, com situação <strong>Efetiva</strong>, ativa e com o atributo <strong>Cliente</strong> marcado.</li>\n<li><code>contractNumber</code> não é obrigatório; se não informado, o pedido é vinculado apenas ao cliente. Se informado, o contrato precisa existir, não estar cancelado, em cancelamento ou encerrado, e o cliente informado precisa ser o titular do contrato.</li>\n<li>O Local (<code>companyPlaceTxId</code>) informado precisa estar ativo; o Tipo de Cobrança (<code>financialCollectionTypeId</code>) precisa estar vinculado a esse Local (a menos que o parâmetro \"usar tipo de cobrança de local diferente\" esteja habilitado).</li>\n<li>O pedido de venda sempre gera uma cobrança e nunca gera \"Apenas Títulos\" — o Tipo de Cobrança informado precisa ser diferente de Fatura (<code>ScripturalBilling</code>).</li>\n<li>Cada Produto ou Serviço informado nos itens (<code>items[].id</code>) deve possuir Regras de Faturamento (<code>ServiceBillingConfigurations</code>) cadastradas para o Local informado.</li>\n<li>Produtos vendáveis (<code>Vendible = true</code>) com controle de estoque (<code>InventoryUpdate = true</code>) precisam ter saldo disponível suficiente no Local de faturamento da regra; produtos configurados para gerar objeto (<code>GeneratePatrimony</code>) não são aceitos neste endpoint.</li>\n<li>A Lista de Preço (<code>priceListId</code>) precisa estar ativa e dentro do período de vigência.</li>\n<li>A Condição de Pagamento (<code>paymentConditionId</code>) precisa estar ativa.</li>\n<li>Caso qualquer validação falhe, nenhum item é processado (a validação é feita antes da criação do pedido).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>companyPlaceTxId</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>CNPJ do Local do pedido</td>\n</tr>\n<tr>\n<td><code>clientTxId</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>CPF/CNPJ do cliente</td>\n</tr>\n<tr>\n<td><code>contractNumber</code></td>\n<td>string</td>\n<td>Não</td>\n<td>Número do contrato a ser vinculado</td>\n</tr>\n<tr>\n<td><code>priceListId</code></td>\n<td>guid</td>\n<td>Sim</td>\n<td>Id público da Lista de Preço</td>\n</tr>\n<tr>\n<td><code>financialCollectionTypeId</code></td>\n<td>guid</td>\n<td>Sim</td>\n<td>Id público do Tipo de Cobrança (não pode ser do tipo Fatura)</td>\n</tr>\n<tr>\n<td><code>paymentConditionId</code></td>\n<td>guid</td>\n<td>Sim</td>\n<td>Id público da Condição de Pagamento</td>\n</tr>\n<tr>\n<td><code>items[].id</code></td>\n<td>guid</td>\n<td>Sim</td>\n<td>Id público do Produto/Serviço</td>\n</tr>\n<tr>\n<td><code>items[].quantity</code></td>\n<td>number</td>\n<td>Sim</td>\n<td>Quantidade</td>\n</tr>\n<tr>\n<td><code>items[].unitValue</code></td>\n<td>number</td>\n<td>Sim</td>\n<td>Valor unitário</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o pedido foi criado e faturado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.salesOrderNumber</code></td>\n<td>string</td>\n<td>Id do pedido de venda gerado</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Diferente da maioria dos endpoints da API, em caso de falha de validação este endpoint retorna <strong>HTTP 400 Bad Request</strong> (não 200) com <code>success:false</code>.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CNPJ do Local inválido/inativo</td>\n<td>\"Não foi possível gerar o pedido de venda, o CNPJ do Local informado está inválido, está inativo ou não foi encontrado um Local correspondente.\"</td>\n</tr>\n<tr>\n<td>Cliente inválido/inativo/não é Cliente</td>\n<td>\"Não foi possível gerar o pedido de venda, o CPF/CNPJ do Cliente informado é inválido, está inativo, não é um Cliente ou não foi encontrado um registro correspondente.\"</td>\n</tr>\n<tr>\n<td>Contrato não encontrado/inativo</td>\n<td>\"Não foi possível gerar o pedido de venda, o Número de Contrato informado não foi encontrado ou não está ativo.\"</td>\n</tr>\n<tr>\n<td>Cliente não é titular do contrato</td>\n<td>\"O cliente informado é diferente do titular do contrato.\"</td>\n</tr>\n<tr>\n<td>Lista de preço não encontrada/vigência expirada</td>\n<td>\"Não foi possível gerar o pedido de venda, a Lista de Preço informada não foi encontrada, está inativa ou está fora do período de vigência.\"</td>\n</tr>\n<tr>\n<td>Condição de pagamento inválida</td>\n<td>\"Não foi possível gerar o pedido de venda, a Condição de Pagamento informada não foi encontrada ou está inativa.\"</td>\n</tr>\n<tr>\n<td>Tipo de cobrança inválido</td>\n<td>\"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado não foi encontrado.\"</td>\n</tr>\n<tr>\n<td>Tipo de cobrança de Local diferente do pedido</td>\n<td>\"Não foi possível gerar o pedido de venda, o Tipo de cobrança informado não está vinculado ao local do Pedido de venda.\"</td>\n</tr>\n<tr>\n<td>Tipo de cobrança do tipo Fatura</td>\n<td>\"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado é do tipo Fatura.\"</td>\n</tr>\n<tr>\n<td>Produto/Serviço não encontrado/inativo</td>\n<td>\"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não foi encontrado ou está inativo.\"</td>\n</tr>\n<tr>\n<td>Produto não vendável</td>\n<td>\"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não é vendável.\"</td>\n</tr>\n<tr>\n<td>Produto gera objeto/patrimônio</td>\n<td>\"Não foi possível gerar o pedido de venda, o Produto enviado está configurado para gerar objetos.\"</td>\n</tr>\n<tr>\n<td>Item sem regra de faturamento para o Local</td>\n<td>\"Não foi possível gerar o pedido de venda, o item \"{item}\" não possui regra de faturamento para o local \"{local}\".\"</td>\n</tr>\n<tr>\n<td>Produto sem saldo em estoque</td>\n<td>\"Não foi possível gerar o pedido de venda, o produto \"{produto}\" não possui saldo disponível em estoque no local \"{local}\".\"</td>\n</tr>\n<tr>\n<td>Nenhum item informado</td>\n<td>\"Nenhum item foi informado para gerar o pedido de venda.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Para consultar contratos existentes antes de gerar o pedido, use <strong>Busca de contratos paginada</strong>. Para lançar valores avulsos sem gerar pedido de venda, use <strong>Cria valor eventual</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","salerequest"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"13c03337-16cf-4e0c-a73b-a32108ea703f","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n   \"companyPlaceTxId\":\"00.000.000/0000-00\", // CNPJ do cadastro de Locais\n   \"clientTxId\":\"12345678900\", // CPF/CNPJ do cliente\n   \"contractNumber\":\"12345\", // Número do contrato\n   \"priceListId\":\"1bf0394c-75ea-5b74-a2cd-625ea053c876\", // Id público da lista de preço \n   \"financialCollectionTypeId\":\"7d4c8755-2aa8-e178-6d4a-05088dcea805\", // Id público do Tipo de Cobrança\n   \"paymentConditionId\":\"ea100f2a-4ff8-6a3b-1f74-9f932ee914ae\", // Id público da condição de pagamento\n   \"items\":[\n      {\n         \"id\":\"1d78d244-e090-bbe6-6e6e-6620e2af4ef2\", // Id público do produto/serviço\n         \"quantity\":1, // Quantidade\n         \"unitValue\": 10 // Valor de cada unidade do item\n      }, \n      {\n         \"id\":\"349817cf-7a5d-fd76-fd57-3857880b92a8\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      },\n    \n      {\n         \"id\":\"39a01b82-7470-cee8-60f2-f9947fc67aec\",\n         \"quantity\":1,\n         \"unitValue\": 23.5\n      },\n      {\n         \"id\":\"44b72fd0-3493-214b-a80f-bffcefceb94c\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/salerequest","description":"## Propósito\n\nCria e fatura um pedido de venda no ERPVoalle, vinculado a um cliente (e opcionalmente a um contrato), respeitando as regras de faturamento por Local de cada item incluído no pedido.\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- O cliente (`clientTxId`) deve ser uma pessoa já cadastrada no ERPVoalle, com situação **Efetiva**, ativa e com o atributo **Cliente** marcado.\n- `contractNumber` não é obrigatório; se não informado, o pedido é vinculado apenas ao cliente. Se informado, o contrato precisa existir, não estar cancelado, em cancelamento ou encerrado, e o cliente informado precisa ser o titular do contrato.\n- O Local (`companyPlaceTxId`) informado precisa estar ativo; o Tipo de Cobrança (`financialCollectionTypeId`) precisa estar vinculado a esse Local (a menos que o parâmetro \"usar tipo de cobrança de local diferente\" esteja habilitado).\n- O pedido de venda sempre gera uma cobrança e nunca gera \"Apenas Títulos\" — o Tipo de Cobrança informado precisa ser diferente de Fatura (`ScripturalBilling`).\n- Cada Produto ou Serviço informado nos itens (`items[].id`) deve possuir Regras de Faturamento (`ServiceBillingConfigurations`) cadastradas para o Local informado.\n- Produtos vendáveis (`Vendible = true`) com controle de estoque (`InventoryUpdate = true`) precisam ter saldo disponível suficiente no Local de faturamento da regra; produtos configurados para gerar objeto (`GeneratePatrimony`) não são aceitos neste endpoint.\n- A Lista de Preço (`priceListId`) precisa estar ativa e dentro do período de vigência.\n- A Condição de Pagamento (`paymentConditionId`) precisa estar ativa.\n- Caso qualquer validação falhe, nenhum item é processado (a validação é feita antes da criação do pedido).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `companyPlaceTxId` | string | Sim | CNPJ do Local do pedido |\n| `clientTxId` | string | Sim | CPF/CNPJ do cliente |\n| `contractNumber` | string | Não | Número do contrato a ser vinculado |\n| `priceListId` | guid | Sim | Id público da Lista de Preço |\n| `financialCollectionTypeId` | guid | Sim | Id público do Tipo de Cobrança (não pode ser do tipo Fatura) |\n| `paymentConditionId` | guid | Sim | Id público da Condição de Pagamento |\n| `items[].id` | guid | Sim | Id público do Produto/Serviço |\n| `items[].quantity` | number | Sim | Quantidade |\n| `items[].unitValue` | number | Sim | Valor unitário |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o pedido foi criado e faturado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.salesOrderNumber` | string | Id do pedido de venda gerado |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n⚠ Diferente da maioria dos endpoints da API, em caso de falha de validação este endpoint retorna **HTTP 400 Bad Request** (não 200) com `success:false`.\n\n## Erros comuns\n\n| Situação | Mensagem |\n| --- | --- |\n| CNPJ do Local inválido/inativo | \"Não foi possível gerar o pedido de venda, o CNPJ do Local informado está inválido, está inativo ou não foi encontrado um Local correspondente.\" |\n| Cliente inválido/inativo/não é Cliente | \"Não foi possível gerar o pedido de venda, o CPF/CNPJ do Cliente informado é inválido, está inativo, não é um Cliente ou não foi encontrado um registro correspondente.\" |\n| Contrato não encontrado/inativo | \"Não foi possível gerar o pedido de venda, o Número de Contrato informado não foi encontrado ou não está ativo.\" |\n| Cliente não é titular do contrato | \"O cliente informado é diferente do titular do contrato.\" |\n| Lista de preço não encontrada/vigência expirada | \"Não foi possível gerar o pedido de venda, a Lista de Preço informada não foi encontrada, está inativa ou está fora do período de vigência.\" |\n| Condição de pagamento inválida | \"Não foi possível gerar o pedido de venda, a Condição de Pagamento informada não foi encontrada ou está inativa.\" |\n| Tipo de cobrança inválido | \"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado não foi encontrado.\" |\n| Tipo de cobrança de Local diferente do pedido | \"Não foi possível gerar o pedido de venda, o Tipo de cobrança informado não está vinculado ao local do Pedido de venda.\" |\n| Tipo de cobrança do tipo Fatura | \"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado é do tipo Fatura.\" |\n| Produto/Serviço não encontrado/inativo | \"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não foi encontrado ou está inativo.\" |\n| Produto não vendável | \"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não é vendável.\" |\n| Produto gera objeto/patrimônio | \"Não foi possível gerar o pedido de venda, o Produto enviado está configurado para gerar objetos.\" |\n| Item sem regra de faturamento para o Local | \"Não foi possível gerar o pedido de venda, o item \\\"{item}\\\" não possui regra de faturamento para o local \\\"{local}\\\".\" |\n| Produto sem saldo em estoque | \"Não foi possível gerar o pedido de venda, o produto \\\"{produto}\\\" não possui saldo disponível em estoque no local \\\"{local}\\\".\" |\n| Nenhum item informado | \"Nenhum item foi informado para gerar o pedido de venda.\" |\n\n## Fluxo relacionado\n\nPara consultar contratos existentes antes de gerar o pedido, use **Busca de contratos paginada**. Para lançar valores avulsos sem gerar pedido de venda, use **Cria valor eventual**."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Pedido de venda gerado e faturado com sucesso.\",\n            \"code\": 0,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"salesOrderNumber\": \"12345\"\n    },\n    \"elapsedTime\": null\n}"},{"id":"cbe62d33-7500-49c7-8a43-b9121601d34f","name":"Erro — validação de negócio","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json-patch+json"}],"body":{"mode":"raw","raw":"{\n   \"companyPlaceTxId\":\"00.000.000/0000-00\", // CNPJ do cadastro de Locais\n   \"clientTxId\":\"12345678900\", // CPF/CNPJ do cliente\n   \"contractNumber\":\"12345\", // Número do contrato\n   \"priceListId\":\"1bf0394c-75ea-5b74-a2cd-625ea053c876\", // Id público da lista de preço \n   \"financialCollectionTypeId\":\"7d4c8755-2aa8-e178-6d4a-05088dcea805\", // Id público do Tipo de Cobrança\n   \"paymentConditionId\":\"ea100f2a-4ff8-6a3b-1f74-9f932ee914ae\", // Id público da condição de pagamento\n   \"items\":[\n      {\n         \"id\":\"1d78d244-e090-bbe6-6e6e-6620e2af4ef2\", // Id público do produto/serviço\n         \"quantity\":1, // Quantidade\n         \"unitValue\": 10 // Valor de cada unidade do item\n      }, \n      {\n         \"id\":\"349817cf-7a5d-fd76-fd57-3857880b92a8\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      },\n    \n      {\n         \"id\":\"39a01b82-7470-cee8-60f2-f9947fc67aec\",\n         \"quantity\":1,\n         \"unitValue\": 23.5\n      },\n      {\n         \"id\":\"44b72fd0-3493-214b-a80f-bffcefceb94c\",\n         \"quantity\":1,\n         \"unitValue\": 20\n      }\n   ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/salerequest","description":"## Propósito\n\nCria e fatura um pedido de venda no ERPVoalle, vinculado a um cliente (e opcionalmente a um contrato), respeitando as regras de faturamento por Local de cada item incluído no pedido.\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- O cliente (`clientTxId`) deve ser uma pessoa já cadastrada no ERPVoalle, com situação **Efetiva**, ativa e com o atributo **Cliente** marcado.\n- `contractNumber` não é obrigatório; se não informado, o pedido é vinculado apenas ao cliente. Se informado, o contrato precisa existir, não estar cancelado, em cancelamento ou encerrado, e o cliente informado precisa ser o titular do contrato.\n- O Local (`companyPlaceTxId`) informado precisa estar ativo; o Tipo de Cobrança (`financialCollectionTypeId`) precisa estar vinculado a esse Local (a menos que o parâmetro \"usar tipo de cobrança de local diferente\" esteja habilitado).\n- O pedido de venda sempre gera uma cobrança e nunca gera \"Apenas Títulos\" — o Tipo de Cobrança informado precisa ser diferente de Fatura (`ScripturalBilling`).\n- Cada Produto ou Serviço informado nos itens (`items[].id`) deve possuir Regras de Faturamento (`ServiceBillingConfigurations`) cadastradas para o Local informado.\n- Produtos vendáveis (`Vendible = true`) com controle de estoque (`InventoryUpdate = true`) precisam ter saldo disponível suficiente no Local de faturamento da regra; produtos configurados para gerar objeto (`GeneratePatrimony`) não são aceitos neste endpoint.\n- A Lista de Preço (`priceListId`) precisa estar ativa e dentro do período de vigência.\n- A Condição de Pagamento (`paymentConditionId`) precisa estar ativa.\n- Caso qualquer validação falhe, nenhum item é processado (a validação é feita antes da criação do pedido).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `companyPlaceTxId` | string | Sim | CNPJ do Local do pedido |\n| `clientTxId` | string | Sim | CPF/CNPJ do cliente |\n| `contractNumber` | string | Não | Número do contrato a ser vinculado |\n| `priceListId` | guid | Sim | Id público da Lista de Preço |\n| `financialCollectionTypeId` | guid | Sim | Id público do Tipo de Cobrança (não pode ser do tipo Fatura) |\n| `paymentConditionId` | guid | Sim | Id público da Condição de Pagamento |\n| `items[].id` | guid | Sim | Id público do Produto/Serviço |\n| `items[].quantity` | number | Sim | Quantidade |\n| `items[].unitValue` | number | Sim | Valor unitário |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o pedido foi criado e faturado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.salesOrderNumber` | string | Id do pedido de venda gerado |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n⚠ Diferente da maioria dos endpoints da API, em caso de falha de validação este endpoint retorna **HTTP 400 Bad Request** (não 200) com `success:false`.\n\n## Erros comuns\n\n| Situação | Mensagem |\n| --- | --- |\n| CNPJ do Local inválido/inativo | \"Não foi possível gerar o pedido de venda, o CNPJ do Local informado está inválido, está inativo ou não foi encontrado um Local correspondente.\" |\n| Cliente inválido/inativo/não é Cliente | \"Não foi possível gerar o pedido de venda, o CPF/CNPJ do Cliente informado é inválido, está inativo, não é um Cliente ou não foi encontrado um registro correspondente.\" |\n| Contrato não encontrado/inativo | \"Não foi possível gerar o pedido de venda, o Número de Contrato informado não foi encontrado ou não está ativo.\" |\n| Cliente não é titular do contrato | \"O cliente informado é diferente do titular do contrato.\" |\n| Lista de preço não encontrada/vigência expirada | \"Não foi possível gerar o pedido de venda, a Lista de Preço informada não foi encontrada, está inativa ou está fora do período de vigência.\" |\n| Condição de pagamento inválida | \"Não foi possível gerar o pedido de venda, a Condição de Pagamento informada não foi encontrada ou está inativa.\" |\n| Tipo de cobrança inválido | \"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado não foi encontrado.\" |\n| Tipo de cobrança de Local diferente do pedido | \"Não foi possível gerar o pedido de venda, o Tipo de cobrança informado não está vinculado ao local do Pedido de venda.\" |\n| Tipo de cobrança do tipo Fatura | \"Não foi possível gerar o pedido de venda, o Tipo de Cobrança informado é do tipo Fatura.\" |\n| Produto/Serviço não encontrado/inativo | \"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não foi encontrado ou está inativo.\" |\n| Produto não vendável | \"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não é vendável.\" |\n| Produto gera objeto/patrimônio | \"Não foi possível gerar o pedido de venda, o Produto enviado está configurado para gerar objetos.\" |\n| Item sem regra de faturamento para o Local | \"Não foi possível gerar o pedido de venda, o item \\\"{item}\\\" não possui regra de faturamento para o local \\\"{local}\\\".\" |\n| Produto sem saldo em estoque | \"Não foi possível gerar o pedido de venda, o produto \\\"{produto}\\\" não possui saldo disponível em estoque no local \\\"{local}\\\".\" |\n| Nenhum item informado | \"Nenhum item foi informado para gerar o pedido de venda.\" |\n\n## Fluxo relacionado\n\nPara consultar contratos existentes antes de gerar o pedido, use **Busca de contratos paginada**. Para lançar valores avulsos sem gerar pedido de venda, use **Cria valor eventual**."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não foi possível gerar o pedido de venda, o Produto ou Serviço enviado não é vendável.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"51002c15-fad9-4c3c-8aaa-ac7003650695"},{"name":"Cria valor eventual","id":"426cc820-54a6-4afa-b5b6-987005fefe06","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"type\": 0, // Tipo do valor eventual a ser lançado. 1 - Acréscimo, 2 - Desconto  ( Se vazio/não enviado assumir como 1, padrão anterior da api)\n    \"contractId\": 12345, //ID do contrato\n    \"contracItemtId\": 12345, // Id do item de contrato. Obrigatório quando 2 no type - Quando enviado 1 no type será desconsiderado esse campo\n    \"contractConfigurationBillingId\": 0, // Id do agrupador de contrato. Obrigatório quando 2 no type - Quando enviado 1 no type será desconsiderado esse campo\n    \"serviceProductCode\": \"01004\", // Código do serviço. Obrigatório quando 1 no type - Quando enviado 2 no type será desconsiderado esse campo\n    \"monthYearType\": 4, //Tipo de competência\n    \"monthYear\": \"2021-12-01\", //Competência\n    \"initialMonthYear\": \"2021-12-15\", //Data inicial\n    \"finalMonthYear\": \"2021-12-16\", //Data final\n    \"description\": \"Teste\", //Descrição\n    \"presentInvoiceNote\": true, //Informações serão apresentadas no documento?\n    \"unitAmount\": 10.00, //Valor\n    \"units\": 2 //Quantidade\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/contracteventualvalues","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cria um novo valor eventual (acréscimo ou desconto) vinculado a um contrato, item de contrato ou agrupador de faturamento.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>type</code> define o tipo do valor eventual — se vazio/não enviado, assume <code>1</code> (Acréscimo), mantendo o comportamento anterior da API.</li>\n<li>Quando <code>type = 2</code> (Desconto): o <code>contractId</code> precisa existir; se <code>contractConfigurationBillingId</code> for informado, precisa pertencer ao contrato; se <code>contracItemtId</code> for informado, precisa pertencer ao contrato (e ao agrupador, quando ambos informados) — nesse caso <code>serviceProductCode</code> é ignorado.</li>\n<li>Quando <code>type = 1</code> (Acréscimo): <code>serviceProductCode</code> precisa existir e estar ativo; o sistema localiza automaticamente o agrupador de faturamento (<code>contractConfigurationBillingId</code>) compatível com o Local/Operação/Natureza Financeira do serviço — se nenhum agrupador compatível for encontrado, a operação falha; <code>contracItemtId</code> é ignorado.</li>\n<li>Se o agrupador de faturamento já contém um item do tipo E-book, só é possível adicionar outro E-book ao mesmo agrupador.</li>\n<li><code>monthYearType</code> define a competência: 1-Atual, 2-Próxima, 3-Manual, 4-Recorrente. Quando <code>4</code> (Recorrente), <code>initialMonthYear</code> e <code>finalMonthYear</code> são obrigatórios; para os demais tipos, o intervalo é definido a partir de <code>monthYear</code>.</li>\n<li><code>unitAmount</code> precisa ser maior que zero.</li>\n<li>Quando <code>type = 1</code> (Acréscimo), <code>units</code> também precisa ser maior que zero — o valor final lançado é <code>unitAmount</code> multiplicado por <code>units</code>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>type</code></td>\n<td>int</td>\n<td>Não (padrão 1)</td>\n<td>1 - Acréscimo, 2 - Desconto</td>\n</tr>\n<tr>\n<td><code>contractId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>contracItemtId</code></td>\n<td>long</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>type = 2</code>; ignorado quando <code>type = 1</code></td>\n</tr>\n<tr>\n<td><code>contractConfigurationBillingId</code></td>\n<td>long</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>type = 2</code> e <code>contracItemtId</code> não informado; ignorado quando <code>type = 1</code></td>\n</tr>\n<tr>\n<td><code>serviceProductCode</code></td>\n<td>string</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>type = 1</code>; ignorado quando <code>type = 2</code></td>\n</tr>\n<tr>\n<td><code>monthYearType</code></td>\n<td>int</td>\n<td>Sim</td>\n<td>1-Atual, 2-Próxima, 3-Manual, 4-Recorrente</td>\n</tr>\n<tr>\n<td><code>monthYear</code></td>\n<td>date</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>monthYearType</code> não é Recorrente</td>\n</tr>\n<tr>\n<td><code>initialMonthYear</code></td>\n<td>date</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>monthYearType = 4</code></td>\n</tr>\n<tr>\n<td><code>finalMonthYear</code></td>\n<td>date</td>\n<td>Condicional</td>\n<td>Obrigatório quando <code>monthYearType = 4</code></td>\n</tr>\n<tr>\n<td><code>description</code></td>\n<td>string</td>\n<td>Sim</td>\n<td>Descrição do eventual</td>\n</tr>\n<tr>\n<td><code>presentInvoiceNote</code></td>\n<td>bool</td>\n<td>Não (padrão false)</td>\n<td>Exibir informações no documento fiscal</td>\n</tr>\n<tr>\n<td><code>unitAmount</code></td>\n<td>decimal</td>\n<td>Sim</td>\n<td>Valor unitário — precisa ser maior que zero</td>\n</tr>\n<tr>\n<td><code>units</code></td>\n<td>int</td>\n<td>Condicional</td>\n<td>Obrigatório e maior que zero quando <code>type = 1</code></td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o valor eventual foi criado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Não utilizado neste endpoint — sempre <code>null</code>, em sucesso ou erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>monthYearType</code> inválido</td>\n<td>\"Competência do valor eventual inválida. Verifique as regras de criação de valores eventuais.\"</td>\n</tr>\n<tr>\n<td><code>unitAmount</code> ≤ 0</td>\n<td>\"O valor do eventual precisa ser maior que zero.\"</td>\n</tr>\n<tr>\n<td><code>units</code> ≤ 0 (quando <code>type = 1</code>)</td>\n<td>\"A quantidade do eventual precisa ser maior que zero.\"</td>\n</tr>\n<tr>\n<td>Contrato não encontrado (<code>type = 2</code>)</td>\n<td>\"Contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Agrupador de contrato não encontrado (<code>type = 2</code>)</td>\n<td>\"Agrupador do contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Item de contrato não encontrado (<code>type = 2</code>)</td>\n<td>\"Item de contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Competência recorrente sem datas</td>\n<td>\"A data inicial e final da competência devem ser informadas.\"</td>\n</tr>\n<tr>\n<td>Serviço não encontrado (<code>type = 1</code>)</td>\n<td>\"Serviço referente ao código não encontrado\"</td>\n</tr>\n<tr>\n<td>Nenhum agrupador compatível com o serviço</td>\n<td>\"As regras de faturamento do serviço não correspondem aos agrupadores do contrato.\"</td>\n</tr>\n<tr>\n<td>Agrupador já possui E-book e o novo item não é E-book</td>\n<td>\"Quando o agrupador já contém um E-Book, só é possível adicionar novos E-Books.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>O <code>contractId</code> pode ser obtido em <strong>Busca de contratos paginada</strong>. Para gerar cobranças completas (pedido de venda), use <strong>Gerar pedido de venda</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","contracteventualvalues"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"7a00856c-fa4a-4d49-93c6-92de0aa2021d","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"type\": 0, // Tipo do valor eventual a ser lançado. 1 - Acréscimo, 2 - Desconto  ( Se vazio/não enviado assumir como 1, padrão anterior da api)\n    \"contractId\": 12345, //ID do contrato\n    \"contracItemtId\": 12345, // Id do item de contrato. Obrigatório quando 2 no type - Quando enviado 1 no type será desconsiderado esse campo\n    \"contractConfigurationBillingId\": 0, // Id do agrupador de contrato. Obrigatório quando 2 no type - Quando enviado 1 no type será desconsiderado esse campo\n    \"serviceProductCode\": \"01004\", // Código do serviço. Obrigatório quando 1 no type - Quando enviado 2 no type será desconsiderado esse campo\n    \"monthYearType\": 4, //Tipo de competência\n    \"monthYear\": \"2021-12-01\", //Competência\n    \"initialMonthYear\": \"2021-12-15\", //Data inicial\n    \"finalMonthYear\": \"2021-12-16\", //Data final\n    \"description\": \"Teste\", //Descrição\n    \"presentInvoiceNote\": true, //Informações serão apresentadas no documento?\n    \"unitAmount\": 10.00, //Valor\n    \"units\": 2 //Quantidade\n}","options":{"raw":{"language":"json"}}},"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/contract/contracteventualvalues"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"1 registro criado com sucesso.\",\n            \"code\": 0,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"426cc820-54a6-4afa-b5b6-987005fefe06"},{"name":"Lista Documentos por Contrato","id":"a541d73c-0406-4a52-869d-546acb095ff7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"url":"{{URL}}:45715/external/integrations/thirdparty/getfilesbycontract/{{contractNumber}}/documentationtype/{{documentionTypeId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Busca os documentos/anexos de um contrato que estejam liberados para visualização do cliente/integrador, filtrados por tipo de documento.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>contractNumber</code> (path) e <code>documentionTypeId</code> (path, Id do Tipo de Documento) são obrigatórios.</li>\n<li>Somente são retornados anexos marcados como <strong>visíveis ao cliente</strong> (atributo \"Visível ao Cliente\" do anexo no ERP). Anexos internos não aparecem nesta consulta.</li>\n<li>Quando o anexo possui período de validade configurado, ele só é retornado se a data atual estiver dentro do intervalo (<code>validity.begin</code> ≤ hoje ≤ <code>validity.final</code>). Anexos sem validade configurada são sempre retornados.</li>\n<li>Anexos excluídos (removidos logicamente) nunca são retornados.</li>\n<li>Caso o contrato ou o tipo de documento informado não existam, ou não haja nenhum anexo elegível, a resposta é <code>success:true</code> com <code>response</code> sendo uma lista vazia (não é tratado como erro).</li>\n<li>O campo <code>file</code> é montado a partir da URL base do ambiente + diretório + nome do arquivo salvo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractNumber</code></td>\n<td>Path</td>\n<td>string</td>\n<td>Sim</td>\n<td>Número do contrato</td>\n</tr>\n<tr>\n<td><code>documentionTypeId</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do tipo de documento (cadastro de Tipos de Documento)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Título do anexo</td>\n</tr>\n<tr>\n<td><code>response[].description</code></td>\n<td>string</td>\n<td>Descrição do anexo (HTML)</td>\n</tr>\n<tr>\n<td><code>response[].documentationType</code></td>\n<td>string</td>\n<td>Nome do tipo de documento</td>\n</tr>\n<tr>\n<td><code>response[].validity.begin</code></td>\n<td>date|null</td>\n<td>Início da validade do anexo, quando configurada</td>\n</tr>\n<tr>\n<td><code>response[].validity.final</code></td>\n<td>date|null</td>\n<td>Fim da validade do anexo, quando configurada</td>\n</tr>\n<tr>\n<td><code>response[].file</code></td>\n<td>string</td>\n<td>URL para download do arquivo</td>\n</tr>\n</tbody>\n</table>\n</div><p><code>response</code> é uma lista (vazia quando não há anexos elegíveis).</p>\n<p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Não há cenários de erro de negócio específicos para este endpoint — parâmetros inválidos resultam em lista vazia (<code>response: []</code>), não em mensagem de erro.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Para anexar novos documentos a um contrato, use <strong>Upload de anexo em um contrato</strong>. Para baixar o binário de um anexo específico (não apenas a lista), use <strong>Download de um anexo de um contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getfilesbycontract","{{contractNumber}}","documentationtype","{{documentionTypeId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"c12329cc-f920-4e9c-bcd7-bbee3eccb9ad","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getfilesbycontract/xxxxxxx/documentationtype/x"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"title\": \"teste\",\n            \"description\": \"<p>Documento teste</p>\",\n            \"documentationType\": \"Documentos Técnicos\",\n            \"validity\": {\n                \"begin\": null,\n                \"final\": null\n            },\n            \"file\": \"https://xxx.xxxxx.com.br\"\n        },\n        {\n            \"title\": \"Teste2\",\n            \"description\": \"<p>Documento teste2</p>\",\n            \"documentationType\": \"Documentos Técnicos\",\n            \"validity\": {\n                \"begin\": null,\n                \"final\": null\n            },\n            \"file\": \"https://xxx.xxxxx.com.br\"\n        }\n    ],\n    \"dataResponseType\": \"List<String>\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"a541d73c-0406-4a52-869d-546acb095ff7"},{"name":"Upload de anexo em um contrato","id":"015d3b9c-b265-4eb0-9764-3422557d41b7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Token obtido no método de autenticação</p>\n"}],"body":{"mode":"formdata","formdata":[{"key":"File","type":"file","value":null}]},"url":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads?contractNumber={{Número do contrato}}&documentationTypeCode={{Código do tipo de documento}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Anexa um novo arquivo (documento) a um contrato existente.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>. Requisição enviada como <code>multipart/form-data</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>contractNumber</code> informado precisa existir e não estar excluído; caso contrário, retorna erro \"Contrato não encontrado.\".</li>\n<li>O <code>documentationTypeCode</code> informado precisa existir, estar ativo e não excluído no cadastro de Tipos de Documento; caso contrário, retorna erro \"Tipo de documento não encontrado.\".</li>\n<li>É necessário enviar ao menos um arquivo no campo <code>File</code> (form-data).</li>\n<li>Cada arquivo é validado individualmente: extensão e tamanho. Se um arquivo for rejeitado, o processamento é interrompido e nenhum arquivo da requisição é salvo (a operação não é parcial).</li>\n<li>Tamanho máximo por arquivo: <strong>10 MB</strong>.</li>\n<li>Extensões aceitas: <code>.csv</code>, <code>.doc</code>, <code>.docx</code>, <code>.gif</code>, <code>.gz</code>, <code>.jpeg</code>, <code>.jpg</code>, <code>.mkv</code>, <code>.mp4</code>, <code>.pdf</code>, <code>.png</code>, <code>.ppt</code>, <code>.pptx</code>, <code>.rar</code>, <code>.tar</code>, <code>.txt</code>, <code>.xls</code>, <code>.xlsx</code>, <code>.zip</code>.</li>\n<li>O anexo é salvo com título e descrição padronizados pela API (\"Arquivo {nome} VIA API\" / \"Arquivo {nome} anexado no contrato VIA API\").</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractNumber</code></td>\n<td>Query string</td>\n<td>string</td>\n<td>Sim</td>\n<td>Número do contrato a receber o anexo</td>\n</tr>\n<tr>\n<td><code>documentationTypeCode</code></td>\n<td>Query string</td>\n<td>string</td>\n<td>Sim</td>\n<td>Código do tipo de documento (deve estar ativo)</td>\n</tr>\n<tr>\n<td><code>File</code></td>\n<td>Form-data (file)</td>\n<td>arquivo</td>\n<td>Sim</td>\n<td>Arquivo a ser anexado (até 10 MB, extensões suportadas acima)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o(s) arquivo(s) foram anexados com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Não utilizado neste endpoint — sempre <code>null</code>, em sucesso ou erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Todos os erros de negócio abaixo são capturados internamente pelo método (<code>CreateContractUploads</code>) e retornados como <code>success:false</code> com <strong>HTTP 200</strong> — nenhum deles gera um 4xx/5xx real.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato não encontrado/excluído</td>\n<td><code>success:false</code>, mensagem \"Contrato não encontrado.\" (HTTP 200)</td>\n</tr>\n<tr>\n<td>Tipo de documento inexistente, inativo ou excluído</td>\n<td><code>success:false</code>, mensagem \"Tipo de documento não encontrado.\" (HTTP 200)</td>\n</tr>\n<tr>\n<td>Extensão de arquivo não suportada</td>\n<td><code>success:false</code>, mensagem \"Arquivo {nome} possui extensão desconhecida.\" (HTTP 200)</td>\n</tr>\n<tr>\n<td>Arquivo maior que 10 MB</td>\n<td><code>success:false</code>, mensagem \"Arquivo {nome} excede 10 MB.\" (HTTP 200)</td>\n</tr>\n<tr>\n<td><code>contractNumber</code>, <code>documentationTypeCode</code> ou <code>File</code> não informados</td>\n<td><code>success:false</code>, mensagem de erro de argumento (\"Valores não repassados ao controlador.\") (HTTP 200)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Para listar os anexos já vinculados a um contrato, use <strong>Lista Documentos por Contrato</strong>. Para baixar o binário de um anexo específico, use <strong>Download de um anexo de um contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["","external","integrations","thirdparty","contract","contractuploads"],"host":["{{URL}}"],"query":[{"key":"contractNumber","value":"{{Número do contrato}}"},{"key":"documentationTypeCode","value":"{{Código do tipo de documento}}"},{"disabled":true,"key":"","value":""}],"variable":[]}},"response":[{"id":"1d0f57a4-95c9-44d8-bd09-2d67eb3222b8","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"},{"key":"Content-Type","name":"Content-Type","value":"application/x-www-form-urlencoded","type":"text"}],"body":{"mode":"urlencoded","urlencoded":[]},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads?contractNumber={{Número do contrato}}&documentationTypeCode={{Código do tipo de documento}}","host":["{{URL}}"],"port":"45715","path":["","external","integrations","thirdparty","contract","contractuploads"],"query":[{"key":"contractNumber","value":"{{Número do contrato}}"},{"key":"documentationTypeCode","value":"{{Código do tipo de documento}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Operação realizada com sucesso!\",\n            \"code\": 0,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"015d3b9c-b265-4eb0-9764-3422557d41b7"},{"name":"Desbloquear contrato","id":"84511597-5518-4232-8c0b-9f2caf7147ad","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/unlock/123456","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Solicita o desbloqueio de um contrato (e das conexões associadas), quando aplicável. A operação real de desbloqueio é delegada a um sistema externo de provisionamento — este endpoint decide se é necessário acioná-la.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code> (path)</td>\n<td>Sim</td>\n<td>Id do contrato a desbloquear.</td>\n</tr>\n</tbody>\n</table>\n</div><p>Não recebe corpo de requisição.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O desbloqueio só é efetivamente acionado se o contrato atender a pelo menos uma destas condições: possuir contrato pai, fazer parte de um agrupamento de contratos, estar com status de <strong>bloqueio financeiro</strong>, ou já ter tentativas de desbloqueio registradas anteriormente — <strong>ou</strong> se alguma conexão vinculada estiver marcada para desbloqueio de autenticação.</li>\n<li>Um contrato apenas com <strong>bloqueio administrativo</strong> (sem nenhuma das outras condições) não aciona o desbloqueio real — a API responde como sucesso, informando que o desbloqueio não era necessário.</li>\n<li>Este endpoint <strong>não valida se o contrato existe</strong>: um <code>id</code> inexistente simplesmente não atende a nenhuma condição de desbloqueio e recebe a mesma mensagem de \"não necessita desbloqueio\".</li>\n<li>Quando o desbloqueio é acionado, o efeito concreto (liberação de conexão, reativação, etc.) acontece em um sistema externo de provisionamento, fora do escopo desta API.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a chamada foi processada com sucesso — ver \"Regras de negócio\" para os casos em que isso não significa que o desbloqueio foi de fato necessário/executado.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>ausente</td>\n<td>Não está presente nesta operação — a resposta só traz <code>success</code>/<code>messages</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato e/ou conexões não atendem nenhuma condição de bloqueio (inclusive <code>id</code> inexistente)</td>\n<td>\"O contrato e/ou as conexões não necessitam desbloqueio.\" (retornado como sucesso)</td>\n</tr>\n<tr>\n<td>Falha ao processar o desbloqueio</td>\n<td>\"Não foi possível executar o processo de desbloqueio do contrato.\" + detalhe do erro</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>O status HTTP é sempre 200, inclusive nos erros acima. Verifique sempre o campo de sucesso no corpo da resposta, não apenas se o contrato foi de fato desbloqueado ou não.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contracts","unlock","123456"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"d616c252-05f1-4f00-af8a-990c74279bee","name":"Insucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/unlock/123456"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não possui conexão em aviso de bloqueio ou bloqueada\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ]\n}"},{"id":"4e1a9d3f-a1bf-4413-965c-748798064814","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/unlock/123456"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Contrato desbloqueado com sucesso\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ]\n}"}],"_postman_id":"84511597-5518-4232-8c0b-9f2caf7147ad"},{"name":"Download de um anexo de um contrato","id":"5d38bdfb-2cb3-44d7-9b3b-159946f4c9c4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads/getfile?id={{Id do Anexo}}&contractId={{Id do Contrato}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza o download do conteúdo binário de um anexo vinculado a um contrato.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>id</code> (Id do anexo) e <code>contractId</code> (Id do contrato) são obrigatórios.</li>\n<li>É validado se o anexo informado (<code>id</code>) pertence ao contrato informado (<code>contractId</code>) e se ambos existem e não estão excluídos; caso contrário, é retornado erro.</li>\n<li>Se o anexo for válido e pertencer ao contrato, é retornado o binário do arquivo, com o <code>Content-Type</code> correspondente ao tipo do arquivo salvo (ou <code>application/octet-stream</code> quando não identificado).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>id</code></td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do anexo (<code>ContractUploads.Id</code>)</td>\n</tr>\n<tr>\n<td><code>contractId</code></td>\n<td>Query string</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint <strong>não segue o envelope padrão</strong> da API.</p>\n<ul>\n<li><strong>Sucesso:</strong> retorna o binário do arquivo diretamente, com o <code>Content-Type</code> do arquivo salvo.</li>\n<li><strong>Falha:</strong> retorna HTTP 400 com o texto puro da mensagem de erro no corpo (não é um envelope JSON).</li>\n</ul>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Anexo não encontrado, excluído ou não pertence ao contrato informado</td>\n<td>HTTP 400 Bad Request</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Para localizar o <code>id</code> de um anexo antes de baixá-lo, use <strong>Lista Documentos por Contrato</strong> ou o cadastro de anexos do contrato. Para anexar novos arquivos, use <strong>Upload de anexo em um contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contract","contractuploads","getfile"],"host":["{{URL}}"],"query":[{"key":"id","value":"{{Id do Anexo}}"},{"key":"contractId","value":"{{Id do Contrato}}"}],"variable":[]}},"response":[{"id":"b8909015-32bd-49b0-bf29-c85917866e47","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads/getfile?id={{Id do Anexo}}&contractId={{Id do Contrato}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contract","contractuploads","getfile"],"query":[{"key":"id","value":"{{Id do Anexo}}"},{"key":"contractId","value":"{{Id do Contrato}}"}]}},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":""},{"id":"e98a8310-1679-4b02-a96e-7ef0cf703eda","name":"Insucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contract/contractuploads/getfile?id={{Id do Anexo}}&contractId={{Id do Contrato}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contract","contractuploads","getfile"],"query":[{"key":"id","value":"{{Id do Anexo}}"},{"key":"contractId","value":"{{Id do Contrato}}"}]}},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":null}],"_postman_id":"5d38bdfb-2cb3-44d7-9b3b-159946f4c9c4"},{"name":"Aprovar Contrato","id":"4b7fe482-260b-4152-bbdc-ad234cdab8ca","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"proportionalityType\": 0,\n    \"changeBeginningDateOnApproval\": true,\n    \"changeLoyaltyDateOnApproval\": true,\n    \"approvalDate\": \"2025-11-15T19:31:19.544Z\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/contracts/approve/:contractId","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Aprova um contrato externo (em estágio \"Em Aprovação\"), podendo gerar proporcionalidades e atualizar datas de início de faturamento/fidelização, seguindo o mesmo motor de negócio da aprovação manual no ERP.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>contractId</code> (path) é obrigatório e precisa referenciar um contrato existente.</li>\n<li>O corpo da requisição é opcional — se omitido, a aprovação é feita com os valores padrão (sem gerar proporcionalidade, sem alterar datas).</li>\n<li><code>proportionalityType</code> define se e como a proporcionalidade é gerada (ver enum abaixo).</li>\n<li><code>approvalDate</code>, quando não informada, assume a data/hora atual.</li>\n<li><code>changeBeginningDateOnApproval</code> e <code>changeLoyaltyDateOnApproval</code> controlam, respectivamente, se o início do faturamento e as datas de fidelização são atualizados na aprovação.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractId</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato a ser aprovado</td>\n</tr>\n<tr>\n<td><code>proportionalityType</code></td>\n<td>Body</td>\n<td>int</td>\n<td>Não</td>\n<td>Tipo de proporcionalidade (ver enum)</td>\n</tr>\n<tr>\n<td><code>approvalDate</code></td>\n<td>Body</td>\n<td>ISO 8601 string</td>\n<td>Não</td>\n<td>Data da aprovação (padrão: data atual)</td>\n</tr>\n<tr>\n<td><code>changeBeginningDateOnApproval</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não</td>\n<td>Atualiza ou não o início do faturamento</td>\n</tr>\n<tr>\n<td><code>changeLoyaltyDateOnApproval</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não</td>\n<td>Atualiza ou não as datas de fidelização</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Enum <code>proportionalityType</code>:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>0</td>\n<td>Não gerar proporcionalidade</td>\n</tr>\n<tr>\n<td>1</td>\n<td>Gerar no mês atual</td>\n</tr>\n<tr>\n<td>2</td>\n<td>Gerar no próximo mês</td>\n</tr>\n<tr>\n<td>3</td>\n<td>Definir pela fatura mínima</td>\n</tr>\n<tr>\n<td>4</td>\n<td>Gerar nota separada</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a aprovação foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code>/<code>data</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo. (API retorna este bloco sob a chave <code>data</code>, não <code>response</code>, nos exemplos salvos.)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data.personUsers</code></td>\n<td>array</td>\n<td>Sempre retornado vazio neste endpoint</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].description</code></td>\n<td>string</td>\n<td>Descrição do eventual gerado</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].amount</code></td>\n<td>decimal</td>\n<td>Valor da proporcionalidade</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].competence</code></td>\n<td>datetime</td>\n<td>Competência do evento</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].serviceDescription</code></td>\n<td>string</td>\n<td>Item de contrato relacionado</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].type</code></td>\n<td>int</td>\n<td>1 - Acréscimo, 2 - Desconto</td>\n</tr>\n<tr>\n<td><code>data.proportionalities[].competenceType</code></td>\n<td>int|null</td>\n<td>Competência usada para o cálculo (mesmo enum de <code>proportionalityType</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>data</code>/<code>response</code></td>\n<td>ausente</td>\n<td>Campo não retornado no exemplo de erro salvo (ausente do payload, não presente mesmo como <code>null</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato não encontrado</td>\n<td>HTTP 200, <code>success:false</code>, mensagem \"Contrato não encontrado\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Contratos são criados em <strong>Gerar contrato</strong> e localizados em <strong>Busca de contratos paginada</strong>. Após aprovados, podem ser operados com <strong>Suspender Contrato</strong> e <strong>Trocar Titular do Contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","contracts","approve",":contractId"],"host":["{{URL}}"],"query":[],"variable":[{"type":"any","value":"","key":"contractId"}]}},"response":[{"id":"257c0428-2aaa-401e-87f1-972f9843c098","name":"Sucesso","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"proportionalityType\": 0,\n    \"changeBeginningDateOnApproval\": true,\n    \"changeLoyaltyDateOnApproval\": true,\n    \"approvalDate\": \"2025-11-15T19:31:19.544Z\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contracts/approve/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contracts","approve",":contractId"],"variable":[{"key":"contractId","value":"5806","description":"Identificador do contrato que será aprovado","enabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","enabled":true},{"key":"Authorization","value":"Bearer <token>","description":"","enabled":true}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n  \"success\": true,\n  \"data\": {\n    \"personUsers\": [],\n    \"proportionalities\": [\n      {\n        \"description\": \"Proporcionalidade gerada na competência atual\",\n        \"amount\": 49.90,\n        \"competence\": \"2025-11-01T00:00:00\",\n        \"serviceDescription\": \"Mensalidade Plano X\",\n        \"type\": 1,\n        \"competenceType\": 1\n      }\n    ]\n  },\n  \"elapsedTime\": 12.54\n}"},{"id":"2c1e2496-1750-4688-b0be-5fbfea6e0483","name":"Erro — Contrato não encontrado","originalRequest":{"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"proportionalityType\": 0,\n    \"changeBeginningDateOnApproval\": true,\n    \"changeLoyaltyDateOnApproval\": true,\n    \"approvalDate\": \"2025-11-15T19:31:19.544Z\"\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/contracts/approve/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","contracts","approve",":contractId"],"variable":[{"key":"contractId","value":"","enabled":true}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","enabled":true},{"key":"Authorization","value":"Bearer <token>","description":"","enabled":true}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\":\"Contrato não encontrado\",\n            \"code\":300,\n            \"type\":\"Error\"\n        }\n    ]\n}"}],"_postman_id":"4b7fe482-260b-4152-bbdc-ad234cdab8ca"},{"name":"Download DANFE","id":"ab61b59c-9ffb-4365-b03d-62743df4af17","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/billings/invoices/download/{{id do documento}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza o download do PDF de impressão (ex.: DANFE, para NF-e) de um documento fiscal já emitido no ERPVoalle, a partir do Id interno da nota.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>id do documento</code> (path) é o Id interno do documento fiscal (<code>InvoiceNotes.Id</code>), não o número/série da nota.</li>\n<li>O documento precisa existir; documentos com série do tipo \"Outros\" não podem ser impressos por este endpoint.</li>\n<li>Conforme o layout da série fiscal, o PDF é gerado por relatório customizado, obtido via link já processado (<code>PrintUrl</code>) ou gerado sob demanda no ERP — esse comportamento é interno e transparente para o integrador.</li>\n<li>Em caso de qualquer falha (documento não encontrado, não pode ser impresso, falha na geração do PDF), a API retorna sempre a mesma mensagem genérica, sem detalhar a causa específica.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>id do documento</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id interno do documento fiscal (<code>InvoiceNotes.Id</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint <strong>não segue o envelope padrão</strong> da API em caso de sucesso.</p>\n<ul>\n<li><strong>Sucesso:</strong> retorna o binário do arquivo diretamente, com <code>Content-Type: application/pdf</code> (sem envelope JSON).</li>\n<li><strong>Falha:</strong> retorna o envelope padrão em JSON, HTTP 200:</li>\n</ul>\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>success</code></td>\n<td>boolean</td>\n<td><code>false</code></td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro (único cenário documentado via JSON).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Documento não encontrado, série do tipo \"Outros\" ou falha na geração do PDF</td>\n<td>HTTP 200, <code>success:false</code>, mensagem \"Não foi possível fazer o download da nota.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>O Id do documento fiscal pode ser obtido a partir da resposta do endpoint <strong>Emissão de DF-e (nova)</strong> (campo <code>response.id</code>) ou de outras integrações de faturamento que retornem o identificador da nota gerada.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","billings","invoices","download","{{id do documento}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"b320a669-6f90-4354-bc16-50cbe0f9d712","name":"Erro — documento não encontrado ou não pode ser impresso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/billings/invoices/download/{{id do documento}}","description":"## Propósito\n\nRealiza o download do PDF de impressão (ex.: DANFE, para NF-e) de um documento fiscal já emitido no ERPVoalle, a partir do Id interno da nota.\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- `id do documento` (path) é o Id interno do documento fiscal (`InvoiceNotes.Id`), não o número/série da nota.\n- O documento precisa existir; documentos com série do tipo \"Outros\" não podem ser impressos por este endpoint.\n- Conforme o layout da série fiscal, o PDF é gerado por relatório customizado, obtido via link já processado (`PrintUrl`) ou gerado sob demanda no ERP — esse comportamento é interno e transparente para o integrador.\n- Em caso de qualquer falha (documento não encontrado, não pode ser impresso, falha na geração do PDF), a API retorna sempre a mesma mensagem genérica, sem detalhar a causa específica.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `id do documento` | Path | long | Sim | Id interno do documento fiscal (`InvoiceNotes.Id`) |\n\n## Estrutura da resposta\n\n⚠ Este endpoint **não segue o envelope padrão** da API em caso de sucesso.\n\n- **Sucesso:** retorna o binário do arquivo diretamente, com `Content-Type: application/pdf` (sem envelope JSON).\n- **Falha:** retorna o envelope padrão em JSON, HTTP 200:\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | null | Sempre `null` em erro (único cenário documentado via JSON). |\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| Documento não encontrado, série do tipo \"Outros\" ou falha na geração do PDF | HTTP 200, `success:false`, mensagem \"Não foi possível fazer o download da nota.\" |\n\n## Fluxo relacionado\n\nO Id do documento fiscal pode ser obtido a partir da resposta do endpoint **Emissão de DF-e (nova)** (campo `response.id`) ou de outras integrações de faturamento que retornem o identificador da nota gerada."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Não foi possível fazer o download da nota.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"ab61b59c-9ffb-4365-b03d-62743df4af17"},{"name":"Emissão de DF-e (nova)","id":"a914c27b-c32c-4cf0-926c-3938cbdb2382","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"{{authorization_header}}","description":"<p>Base64 de clientId:clientSecret do integrador</p>\n","type":"text"},{"key":"Token","value":"{{token_header}}","description":"<p>SynData criptografado do tenant</p>\n","type":"text"},{"key":"X-Integration-Key","value":"{{integration_key}}","description":"<p>UUID do integrador</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"provider\": {\n        \"txId\": \"99999999999999\",\n        \"operationId\": \"00000000-0000-0000-0000-000000000000\",\n        \"natureId\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"client\": {\n        \"txId\": \"99999999999\",\n        \"name\": \"NOME DO CLIENTE\",\n        \"email\": \"teste@teste.com.br\",\n        \"phone\": \"(99) 99999-9999\",\n        \"retentions\": {\n            \"issqn\": true,\n            \"csrf\": true,\n            \"ir\": true\n        },\n        \"aliquots\": {\n            \"issqn\": 9.99,\n            \"pis\": 9.99,\n            \"cofins\": 9.99,\n            \"csll\": 9.99,\n            \"ir\": 9.99\n        },\n        \"address\": {\n            \"postalCode\": \"99999-999\",\n            \"street\": \"LOGRADOURO\",\n            \"number\": \"999\",\n            \"addressComplement\": \"COMPLEMENTO\",\n            \"neighborhood\": \"BAIRRO\",\n            \"codeCityId\": 9999999\n        }\n    },\n    \"services\": [\n        {\n            \"identifier\": \"00000000-0000-0000-0000-000000000000\",\n            \"amount\": 999.99\n        }\n    ],\n    \"observation\": \"OBSERVAÇÃO\",\n    \"contract\": {\n        \"contractNumber\": \"00000\",\n        \"beginningDate\": \"0000-00-00\",\n        \"endDate\": \"0000-00-00\"\n    },\n    \"cobilling\": {\n        \"rpsKey\": \"0000000000000000000000000000000\",\n        \"txId\": \"11134402000103\",\n        \"model\": \"1\",\n        \"serie\": \"1\",\n        \"number\": \"1\",\n        \"issueDate\": \"0000-00-00\",\n        \"hash115\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"linkedDocuments\": [\n        \"00000000-0000-0000-0000-000000000000\"\n    ],\n    \"billing\": {\n        \"BillingDate\": \"0000-00-00\",\n        \"BillingDueDate\": \"0000-00-00\"\n    },\n    \"substitution\": {\n        \"model\": 1,\n        \"substitutionReason\": 1,\n        \"nfcomAccessKey\": \"00000000000000000000000000000000000000000000\",\n        \"cnpj\": \"99999999999999\",\n        \"serie\": \"001\",\n        \"number\": 1,\n        \"issueDate\": \"0000-00-00\",\n        \"hash115\": \"00000000-0000-0000-0000-000000000000\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Integrations/Fiscal/GenerateInvoiceNote","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Emite um documento fiscal (NFS-e ou NFCom, conforme configuração do prestador/serviço) com os dados informados na requisição, podendo também ser usado para substituir uma NFCom já autorizada pela SEFAZ.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p><strong>Endpoint anônimo de integração fiscal (ThirdParty)</strong> — não exige token OAuth2 (<code>{{access_token}}</code>) como os demais endpoints desta collection. A autenticação é feita via headers próprios, validados pelo serviço de autenticação de integradores:</p>\n<ul>\n<li><code>Authorization</code>: Base64 de <code>clientId:clientSecret</code> do integrador (<code>{{authorization_header}}</code>)</li>\n<li><code>Token</code>: SynData criptografado do tenant (<code>{{token_header}}</code>)</li>\n<li><code>X-Integration-Key</code>: UUID do integrador (<code>api_configs.integration_key</code>) (<code>{{integration_key}}</code>)</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Envie os blocos <code>provider</code>, <code>client</code> e <code>services</code> para emitir uma NFS-e; para NFCom, envie adicionalmente <code>contract</code>, <code>cobilling</code>, <code>linkedDocuments</code> e <code>billing</code>.</li>\n<li>Para <strong>substituir</strong> uma NFCom já autorizada, envie o bloco <code>substitution</code>.</li>\n<li>Nas alíquotas (<code>client.aliquots</code>), quando informadas, prevalecem sobre as alíquotas cadastradas no serviço/local; quando omitidas, o sistema busca do serviço/local.</li>\n<li><code>client.retentions</code> indica quais tributos podem ter retenção para o cliente (ISSQN, PIS/COFINS/CSLL, IR).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Bloco</th>\n<th>Campo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>provider</code></td>\n<td><code>txId</code>, <code>operationId</code>, <code>natureId</code></td>\n<td>CNPJ do prestador, operação e natureza financeira</td>\n</tr>\n<tr>\n<td><code>client</code></td>\n<td><code>txId</code>, <code>name</code>, <code>email</code>, <code>phone</code></td>\n<td>Dados do cliente</td>\n</tr>\n<tr>\n<td><code>client.retentions</code></td>\n<td><code>issqn</code>, <code>csrf</code>, <code>ir</code></td>\n<td>Retenções aplicáveis (booleanos)</td>\n</tr>\n<tr>\n<td><code>client.aliquots</code></td>\n<td><code>issqn</code>, <code>pis</code>, <code>cofins</code>, <code>csll</code>, <code>ir</code></td>\n<td>Alíquotas — se informadas, têm prioridade sobre o cadastro do serviço/local</td>\n</tr>\n<tr>\n<td><code>client.address</code></td>\n<td><code>postalCode</code>, <code>street</code>, <code>number</code>, <code>addressComplement</code>, <code>neighborhood</code>, <code>codeCityId</code></td>\n<td>Endereço do cliente (código da cidade conforme IBGE)</td>\n</tr>\n<tr>\n<td><code>services[]</code></td>\n<td><code>identifier</code>, <code>amount</code></td>\n<td>Serviço prestado e valor</td>\n</tr>\n<tr>\n<td><code>observation</code></td>\n<td>—</td>\n<td>Observações no documento fiscal</td>\n</tr>\n<tr>\n<td><code>contract</code> (NFCom)</td>\n<td><code>contractNumber</code>, <code>beginningDate</code>, <code>endDate</code></td>\n<td>Informações do contrato para NFCom</td>\n</tr>\n<tr>\n<td><code>cobilling</code> (NFCom)</td>\n<td><code>rpsKey</code>, <code>txId</code>, <code>model</code>, <code>serie</code>, <code>number</code>, <code>issueDate</code>, <code>hash115</code></td>\n<td>Informações de cofaturamento</td>\n</tr>\n<tr>\n<td><code>linkedDocuments</code> (NFCom)</td>\n<td>—</td>\n<td>Lista de referências de documentos a vincular na NFCom</td>\n</tr>\n<tr>\n<td><code>billing</code> (NFCom)</td>\n<td><code>BillingDate</code>, <code>BillingDueDate</code></td>\n<td>Competência e vencimento da fatura</td>\n</tr>\n<tr>\n<td><code>substitution</code> (opcional)</td>\n<td><code>model</code>, <code>substitutionReason</code>, <code>nfcomAccessKey</code>, <code>cnpj</code>, <code>serie</code>, <code>number</code>, <code>issueDate</code>, <code>hash115</code></td>\n<td>Enviar somente quando a nota gerada for substituta de outra NFCom já autorizada</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Enum <code>substitution.model</code>:</strong> 1 - NFCom Modelo 62, 2 - Nota Fiscal Modelo 21, 3 - Nota Fiscal Modelo 22.\n<code>nfcomAccessKey</code> (44 dígitos) é obrigatório quando <code>model = 1</code>; <code>cnpj</code>, <code>serie</code>, <code>number</code>, <code>issueDate</code> e <code>hash115</code> são usados quando <code>model = 2</code> ou <code>3</code>.</p>\n<p><strong>Enum <code>substitution.substitutionReason</code>:</strong> 1 - Erro de preço, 2 - Erro cadastral, 3 - Decisão judicial, 4 - Erro de tributação, 5 - Descontinuidade do serviço.</p>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o documento foi gerado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.id</code></td>\n<td>guid</td>\n<td>Identificador do documento fiscal gerado — usado, por exemplo, em <code>linkedDocuments</code> de outra emissão</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>⚠ Diferente da maioria dos endpoints desta collection (que retornam HTTP 200 mesmo em erro de negócio), <strong>este endpoint retorna HTTP 400 Bad Request tanto para erros de negócio quanto para falhas de autenticação própria do endpoint</strong> — confirmado em <code>FiscalIntegrationController.GenerateInvoiceNote</code>, que faz <code>if (!response.Success) return BadRequest(response); return Ok(response);</code>.</p>\n<ul>\n<li><strong>Erros de negócio</strong> (dados fiscais inválidos, serviço/local sem alíquota configurada, cliente/endereço inválido etc.) retornam <code>success:false</code> com a(s) mensagem(ns) explicativa(s) em <code>messages[]</code>, embrulhados em <strong>HTTP 400</strong>.</li>\n<li><strong>Falhas de autenticação própria</strong> (header <code>Authorization</code>/<code>Token</code>/<code>X-Integration-Key</code> ausente, Base64 inválido, client secret incorreto/expirado, integrador não encontrado, usuário que não é do tipo Integração Externa) são lançadas como <code>BusinessException</code> dentro de <code>EllevenMvnoStandardListenerService.Authenticate</code>/<code>AuthenticateRequest</code>, que as captura e devolve um <code>IResponseMessage</code> com <code>success:false</code> — ou seja, <strong>também retornam HTTP 400, e não 401/403</strong> como se poderia esperar para um erro de autenticação. Não há diferenciação de status HTTP entre falha de autenticação e erro de negócio neste endpoint.</li>\n<li>⚠ Não há exemplo de response de erro salvo nesta request (nem de negócio, nem de autenticação) — apenas os dois exemplos de sucesso. O comportamento acima foi confirmado lendo o código-fonte, mas nenhum exemplo ilustra o payload de um 400.</li>\n</ul>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>O <code>id</code> retornado pode ser usado em <strong>Download DANFE</strong> (quando aplicável ao tipo de documento) ou referenciado em <code>linkedDocuments</code> de uma nova emissão.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","Integrations","Fiscal","GenerateInvoiceNote"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"f398f9a2-b0df-44b7-996b-b25a7a55e75e","name":"Sucesso — Emissão","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"{{authorization_header}}","description":"Base64 de clientId:clientSecret do integrador","type":"text"},{"key":"Token","value":"{{token_header}}","description":"SynData criptografado do tenant","type":"text"},{"key":"X-Integration-Key","value":"{{integration_key}}","description":"UUID do integrador","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"provider\": {\n        \"txId\": \"99999999999999\",\n        \"operationId\": \"00000000-0000-0000-0000-000000000000\",\n        \"natureId\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"client\": {\n        \"txId\": \"99999999999\",\n        \"name\": \"NOME DO CLIENTE\",\n        \"email\": \"teste@teste.com.br\",\n        \"phone\": \"(99) 99999-9999\",\n        \"retentions\": {\n            \"issqn\": true,\n            \"csrf\": true,\n            \"ir\": true\n        },\n        \"aliquots\": {\n            \"issqn\": 9.99,\n            \"pis\": 9.99,\n            \"cofins\": 9.99,\n            \"csll\": 9.99,\n            \"ir\": 9.99\n        },\n        \"address\": {\n            \"postalCode\": \"99999-999\",\n            \"street\": \"LOGRADOURO\",\n            \"number\": \"999\",\n            \"addressComplement\": \"COMPLEMENTO\",\n            \"neighborhood\": \"BAIRRO\",\n            \"codeCityId\": 9999999\n        }\n    },\n    \"services\": [\n        {\n            \"identifier\": \"00000000-0000-0000-0000-000000000000\",\n            \"amount\": 999.99\n        }\n    ],\n    \"observation\": \"OBSERVAÇÃO\",\n    \"contract\": {\n        \"contractNumber\": \"00000\",\n        \"beginningDate\": \"0000-00-00\",\n        \"endDate\": \"0000-00-00\"\n    },\n    \"cobilling\": {\n        \"rpsKey\": \"0000000000000000000000000000000\",\n        \"txId\": \"11134402000103\",\n        \"model\": \"1\",\n        \"serie\": \"1\",\n        \"number\": \"1\",\n        \"issueDate\": \"0000-00-00\",\n        \"hash115\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"linkedDocuments\": [\n        \"00000000-0000-0000-0000-000000000000\"\n    ],\n    \"billing\": {\n        \"BillingDate\": \"0000-00-00\",\n        \"BillingDueDate\": \"0000-00-00\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Integrations/Fiscal/GenerateInvoiceNote"},"status":"OK","code":200,"_postman_previewlanguage":"","header":[],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Documento gerado com sucesso.\",\n            \"code\": 0,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"id\": \"00000000-0000-0000-0000-000000000000\"\n    }\n}"},{"id":"44f5b428-c0a6-46ac-87ad-6af0c3035bd9","name":"Sucesso — Substituição NFCOM","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"{{authorization_header}}","description":"Base64 de clientId:clientSecret do integrador","type":"text"},{"key":"Token","value":"{{token_header}}","description":"SynData criptografado do tenant","type":"text"},{"key":"X-Integration-Key","value":"{{integration_key}}","description":"UUID do integrador","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"provider\": {\n        \"txId\": \"99999999999999\",\n        \"operationId\": \"00000000-0000-0000-0000-000000000000\",\n        \"natureId\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"client\": {\n        \"txId\": \"99999999999\",\n        \"name\": \"NOME DO CLIENTE\",\n        \"email\": \"teste@teste.com.br\",\n        \"phone\": \"(99) 99999-9999\",\n        \"retentions\": {\n            \"issqn\": true,\n            \"csrf\": true,\n            \"ir\": true\n        },\n        \"aliquots\": {\n            \"issqn\": 9.99,\n            \"pis\": 9.99,\n            \"cofins\": 9.99,\n            \"csll\": 9.99,\n            \"ir\": 9.99\n        },\n        \"address\": {\n            \"postalCode\": \"99999-999\",\n            \"street\": \"LOGRADOURO\",\n            \"number\": \"999\",\n            \"addressComplement\": \"COMPLEMENTO\",\n            \"neighborhood\": \"BAIRRO\",\n            \"codeCityId\": 9999999\n        }\n    },\n    \"services\": [\n        {\n            \"identifier\": \"00000000-0000-0000-0000-000000000000\",\n            \"amount\": 999.99\n        }\n    ],\n    \"observation\": \"OBSERVAÇÃO\",\n    \"contract\": {\n        \"contractNumber\": \"00000\",\n        \"beginningDate\": \"0000-00-00\",\n        \"endDate\": \"0000-00-00\"\n    },\n    \"cobilling\": {\n        \"rpsKey\": \"0000000000000000000000000000000\",\n        \"txId\": \"11134402000103\",\n        \"model\": \"1\",\n        \"serie\": \"1\",\n        \"number\": \"1\",\n        \"issueDate\": \"0000-00-00\",\n        \"hash115\": \"00000000-0000-0000-0000-000000000000\"\n    },\n    \"linkedDocuments\": [\n        \"00000000-0000-0000-0000-000000000000\"\n    ],\n    \"billing\": {\n        \"BillingDate\": \"0000-00-00\",\n        \"BillingDueDate\": \"0000-00-00\"\n    },\n    \"substitution\": {\n        \"model\": 1,\n        \"substitutionReason\": 1,\n        \"nfcomAccessKey\": \"00000000000000000000000000000000000000000000\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Integrations/Fiscal/GenerateInvoiceNote"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Documento gerado com sucesso.\",\n            \"code\": 0,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"id\": \"00000000-0000-0000-0000-000000000000\"\n    }\n}\n\n\n\n\n\n"}],"_postman_id":"a914c27b-c32c-4cf0-926c-3938cbdb2382"},{"name":"Trocar Titular do Contrato","id":"a5a56b5f-aa26-cf32-7ea1-22fad5e62e2a","request":{"method":"PUT","header":[{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n  \"clientId\": 0,\n  \"protocol\": 0,\n  \"useContractAddress\": false,\n  \"removeFromContractGrouping\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/Integrations/ThirdParty/Contract/ChangeContractHolder/:contractid","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza a troca de titularidade de um contrato entre duas pessoas, seguindo exatamente as mesmas validações e efeitos colaterais da tela de troca de titular do contrato no ERP.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<p>⚠ Este endpoint usa uma URL com prefixo de rota diferente dos demais (<code>Integrations/ThirdParty/...</code>, sem o segmento <code>external</code>) — comportamento intencional, mantido conforme onda anterior de documentação.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>contractid</code> (path) precisa existir.</li>\n<li>O status do contrato precisa ser <code>Normal</code> ou <code>Cortesia</code> — outros status bloqueiam a troca.</li>\n<li>O contrato não pode ter recorrência de cartão ativa.</li>\n<li>O contrato não pode ter títulos a receber em aberto.</li>\n<li>O contrato não pode ter solicitações (incidents) em aberto vinculadas às etiquetas de serviço do contrato — exceto a própria solicitação informada em <code>protocol</code>.</li>\n<li><code>clientId</code> precisa existir previamente (cadastro de Pessoas) e não pode já ser o titular atual do contrato.</li>\n<li><code>protocol</code> é o número da solicitação/OS que originou a troca — deve ser informado quando houver esse contexto.</li>\n<li><code>useContractAddress</code> (default <code>false</code>): se <code>true</code>, mantém o endereço de cobrança atual do contrato, clonando-o para o novo titular; se <code>false</code>, tenta usar o endereço já cadastrado do próprio novo titular — se o novo titular não tiver endereço cadastrado, o comportamento cai para o mesmo de <code>true</code>.</li>\n<li><code>removeFromContractGrouping</code> (default <code>false</code>): se <code>true</code>, remove o contrato de agrupamentos de contrato (<code>GroupingContracts</code>) aos quais pertença antes da troca.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractid</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>clientId</code></td>\n<td>Body</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do novo titular (<code>People</code>)</td>\n</tr>\n<tr>\n<td><code>protocol</code></td>\n<td>Body</td>\n<td>long</td>\n<td>Sim</td>\n<td>Número da solicitação/OS que originou a troca</td>\n</tr>\n<tr>\n<td><code>useContractAddress</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não (padrão <code>false</code>)</td>\n<td>Mantém o endereço de cobrança do contrato ao invés do endereço do novo titular</td>\n</tr>\n<tr>\n<td><code>removeFromContractGrouping</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não (padrão <code>false</code>)</td>\n<td>Remove o contrato de agrupamentos de contrato antes da troca</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Diferente da maioria dos endpoints desta API, aqui o status HTTP reflete o <code>success</code> do corpo (não retorna 200 com <code>success:false</code>).</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td><code>true</code> (HTTP 200) ou <code>false</code> (HTTP 400)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Mensagem de confirmação (ex.: \"Titularidade do contrato alterada com sucesso!\")</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>Código</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Id do contrato não informado</td>\n<td>400</td>\n<td><code>CONTRATO_INEXISTENTE</code></td>\n<td>\"Valor do Id do Contrato não repassado para o controlador.\"</td>\n</tr>\n<tr>\n<td>Contrato não encontrado</td>\n<td>400</td>\n<td><code>CONTRATO_INEXISTENTE</code></td>\n<td>\"Não foi possível localizar os dados do contrato selecionado.\"</td>\n</tr>\n<tr>\n<td>Cliente não encontrado</td>\n<td>400</td>\n<td><code>TITULAR_INVALIDO</code></td>\n<td>\"Não foi possível localizar os dados do cliente.\"</td>\n</tr>\n<tr>\n<td>Cliente já é o titular do contrato</td>\n<td>400</td>\n<td><code>TITULAR_INVALIDO</code></td>\n<td>\"O cliente já é o titular do contrato selecionado.\"</td>\n</tr>\n<tr>\n<td>Regra de negócio do motor de troca (status do contrato, títulos em aberto, solicitações em aberto etc.)</td>\n<td>400</td>\n<td><code>REGRA_NEGOCIO</code></td>\n<td>Mensagem específica da regra violada</td>\n</tr>\n<tr>\n<td>Falha na integração MVNO durante a troca</td>\n<td>400</td>\n<td><code>ERRO_INTEGRACAO_MVNO</code></td>\n<td>Mensagem retornada pela integração</td>\n</tr>\n<tr>\n<td>Erro interno inesperado</td>\n<td>400</td>\n<td><code>ERRO_INTERNO</code></td>\n<td>Mensagem da exceção</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>O <code>contractid</code> pode ser obtido em <strong>Busca de contratos paginada</strong>. Após a troca, o contrato pode continuar sendo operado com <strong>Suspender Contrato</strong> e <strong>Aprovar Contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["Integrations","ThirdParty","Contract","ChangeContractHolder",":contractid"],"host":["{{URL}}"],"query":[],"variable":[{"type":"any","value":"","key":"contractid"}]}},"response":[{"id":"36c4a649-3f6c-d58f-e75b-a2659187a3ef","name":"Sucesso","originalRequest":{"method":"PUT","header":[{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n  \"clientId\": 0,\n  \"protocol\": 0,\n  \"useContractAddress\": false,\n  \"removeFromContractGrouping\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/Integrations/ThirdParty/Contract/ChangeContractHolder/:contractid","host":["{{URL}}"],"port":"45715","path":["Integrations","ThirdParty","Contract","ChangeContractHolder",":contractid"],"variable":[{"key":"contractid","value":""}]},"description":"## Propósito\n\nRealiza a troca de titularidade de um contrato entre duas pessoas, seguindo exatamente as mesmas validações e efeitos colaterais da tela de troca de titular do contrato no ERP.\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n⚠ Este endpoint usa uma URL com prefixo de rota diferente dos demais (`Integrations/ThirdParty/...`, sem o segmento `external`) — comportamento intencional, mantido conforme onda anterior de documentação.\n\n## Regras de negócio\n\n- O `contractid` (path) precisa existir.\n- O status do contrato precisa ser `Normal` ou `Cortesia` — outros status bloqueiam a troca.\n- O contrato não pode ter recorrência de cartão ativa.\n- O contrato não pode ter títulos a receber em aberto.\n- O contrato não pode ter solicitações (incidents) em aberto vinculadas às etiquetas de serviço do contrato — exceto a própria solicitação informada em `protocol`.\n- `clientId` precisa existir previamente (cadastro de Pessoas) e não pode já ser o titular atual do contrato.\n- `protocol` é o número da solicitação/OS que originou a troca — deve ser informado quando houver esse contexto.\n- `useContractAddress` (default `false`): se `true`, mantém o endereço de cobrança atual do contrato, clonando-o para o novo titular; se `false`, tenta usar o endereço já cadastrado do próprio novo titular — se o novo titular não tiver endereço cadastrado, o comportamento cai para o mesmo de `true`.\n- `removeFromContractGrouping` (default `false`): se `true`, remove o contrato de agrupamentos de contrato (`GroupingContracts`) aos quais pertença antes da troca.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractid` | Path | long | Sim | Id do contrato |\n| `clientId` | Body | long | Sim | Id do novo titular (`People`) |\n| `protocol` | Body | long | Sim | Número da solicitação/OS que originou a troca |\n| `useContractAddress` | Body | boolean | Não (padrão `false`) | Mantém o endereço de cobrança do contrato ao invés do endereço do novo titular |\n| `removeFromContractGrouping` | Body | boolean | Não (padrão `false`) | Remove o contrato de agrupamentos de contrato antes da troca |\n\n## Estrutura da resposta\n\n⚠ Diferente da maioria dos endpoints desta API, aqui o status HTTP reflete o `success` do corpo (não retorna 200 com `success:false`).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` (HTTP 200) ou `false` (HTTP 400) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | string\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | string | Mensagem de confirmação (ex.: \"Titularidade do contrato alterada com sucesso!\") |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | HTTP | Código | Mensagem |\n| --- | --- | --- | --- |\n| Id do contrato não informado | 400 | `CONTRATO_INEXISTENTE` | \"Valor do Id do Contrato não repassado para o controlador.\" |\n| Contrato não encontrado | 400 | `CONTRATO_INEXISTENTE` | \"Não foi possível localizar os dados do contrato selecionado.\" |\n| Cliente não encontrado | 400 | `TITULAR_INVALIDO` | \"Não foi possível localizar os dados do cliente.\" |\n| Cliente já é o titular do contrato | 400 | `TITULAR_INVALIDO` | \"O cliente já é o titular do contrato selecionado.\" |\n| Regra de negócio do motor de troca (status do contrato, títulos em aberto, solicitações em aberto etc.) | 400 | `REGRA_NEGOCIO` | Mensagem específica da regra violada |\n| Falha na integração MVNO durante a troca | 400 | `ERRO_INTEGRACAO_MVNO` | Mensagem retornada pela integração |\n| Erro interno inesperado | 400 | `ERRO_INTERNO` | Mensagem da exceção |\n\n## Fluxo relacionado\n\nO `contractid` pode ser obtido em **Busca de contratos paginada**. Após a troca, o contrato pode continuar sendo operado com **Suspender Contrato** e **Aprovar Contrato**."},"status":"OK","code":200,"_postman_previewlanguage":null,"header":[{"key":"Content-Type","value":"application/json; charset=utf-8"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [],\n  \"response\": \"Titularidade do contrato alterada com sucesso!\",\n  \"elapsedTime\": null\n}"},{"id":"b743d587-9a1d-ee2a-b9b8-6f14f267e01a","name":"Erro — cliente já é o titular","originalRequest":{"method":"PUT","header":[{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n  \"clientId\": 0,\n  \"protocol\": 0,\n  \"useContractAddress\": false,\n  \"removeFromContractGrouping\": false\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/Integrations/ThirdParty/Contract/ChangeContractHolder/:contractid","host":["{{URL}}"],"port":"45715","path":["Integrations","ThirdParty","Contract","ChangeContractHolder",":contractid"],"variable":[{"key":"contractid","value":""}]},"description":"## Propósito\n\nRealiza a troca de titularidade de um contrato entre duas pessoas, seguindo exatamente as mesmas validações e efeitos colaterais da tela de troca de titular do contrato no ERP.\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n⚠ Este endpoint usa uma URL com prefixo de rota diferente dos demais (`Integrations/ThirdParty/...`, sem o segmento `external`) — comportamento intencional, mantido conforme onda anterior de documentação.\n\n## Regras de negócio\n\n- O `contractid` (path) precisa existir.\n- O status do contrato precisa ser `Normal` ou `Cortesia` — outros status bloqueiam a troca.\n- O contrato não pode ter recorrência de cartão ativa.\n- O contrato não pode ter títulos a receber em aberto.\n- O contrato não pode ter solicitações (incidents) em aberto vinculadas às etiquetas de serviço do contrato — exceto a própria solicitação informada em `protocol`.\n- `clientId` precisa existir previamente (cadastro de Pessoas) e não pode já ser o titular atual do contrato.\n- `protocol` é o número da solicitação/OS que originou a troca — deve ser informado quando houver esse contexto.\n- `useContractAddress` (default `false`): se `true`, mantém o endereço de cobrança atual do contrato, clonando-o para o novo titular; se `false`, tenta usar o endereço já cadastrado do próprio novo titular — se o novo titular não tiver endereço cadastrado, o comportamento cai para o mesmo de `true`.\n- `removeFromContractGrouping` (default `false`): se `true`, remove o contrato de agrupamentos de contrato (`GroupingContracts`) aos quais pertença antes da troca.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractid` | Path | long | Sim | Id do contrato |\n| `clientId` | Body | long | Sim | Id do novo titular (`People`) |\n| `protocol` | Body | long | Sim | Número da solicitação/OS que originou a troca |\n| `useContractAddress` | Body | boolean | Não (padrão `false`) | Mantém o endereço de cobrança do contrato ao invés do endereço do novo titular |\n| `removeFromContractGrouping` | Body | boolean | Não (padrão `false`) | Remove o contrato de agrupamentos de contrato antes da troca |\n\n## Estrutura da resposta\n\n⚠ Diferente da maioria dos endpoints desta API, aqui o status HTTP reflete o `success` do corpo (não retorna 200 com `success:false`).\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` (HTTP 200) ou `false` (HTTP 400) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | string\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | string | Mensagem de confirmação (ex.: \"Titularidade do contrato alterada com sucesso!\") |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | HTTP | Código | Mensagem |\n| --- | --- | --- | --- |\n| Id do contrato não informado | 400 | `CONTRATO_INEXISTENTE` | \"Valor do Id do Contrato não repassado para o controlador.\" |\n| Contrato não encontrado | 400 | `CONTRATO_INEXISTENTE` | \"Não foi possível localizar os dados do contrato selecionado.\" |\n| Cliente não encontrado | 400 | `TITULAR_INVALIDO` | \"Não foi possível localizar os dados do cliente.\" |\n| Cliente já é o titular do contrato | 400 | `TITULAR_INVALIDO` | \"O cliente já é o titular do contrato selecionado.\" |\n| Regra de negócio do motor de troca (status do contrato, títulos em aberto, solicitações em aberto etc.) | 400 | `REGRA_NEGOCIO` | Mensagem específica da regra violada |\n| Falha na integração MVNO durante a troca | 400 | `ERRO_INTEGRACAO_MVNO` | Mensagem retornada pela integração |\n| Erro interno inesperado | 400 | `ERRO_INTERNO` | Mensagem da exceção |\n\n## Fluxo relacionado\n\nO `contractid` pode ser obtido em **Busca de contratos paginada**. Após a troca, o contrato pode continuar sendo operado com **Suspender Contrato** e **Aprovar Contrato**."},"status":"Bad Request","code":400,"_postman_previewlanguage":null,"header":[{"value":"application/json; charset=utf-8","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\n    {\n      \"type\": \"Error\",\n      \"message\": \"O cliente já é o titular do contrato selecionado.\",\n      \"code\": \"TITULAR_INVALIDO\"\n    }\n  ],\n  \"response\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"a5a56b5f-aa26-cf32-7ea1-22fad5e62e2a"},{"name":"Suspender Contrato","id":"88353d6d-4266-3fbf-b74b-82821e08b85e","request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/Contract/Suspend/:contractId","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Suspende um contrato administrativamente, reaproveitando o mesmo motor de negócio da tela de atendimento: gera o evento de mudança de status + evento de suspensão, atualiza o status do contrato para <code>Suspenso</code>, bloqueia endereços de autenticação, bloqueia itens MVNO, replica conexões radius e dispara o bloqueio do cliente nas integrações externas (telefonia).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>contractId</code> (path) precisa existir.</li>\n<li><code>justify</code> é obrigatório — é gravada no evento de suspensão e em <code>Contracts.SuspensionMotive</code>.</li>\n<li><code>eventTypeCode</code> é opcional: se omitido, o ERP utiliza o único tipo de evento ativo configurado para a empresa com objetivo \"Suspender Contratos\"; se houver mais de um tipo ativo, <code>eventTypeCode</code> passa a ser obrigatório.</li>\n<li>Use o endpoint <strong>Listar Tipos de Evento (por objetivo)</strong> (<code>objective=5</code>) para descobrir os códigos válidos de <code>eventTypeCode</code>.</li>\n<li>Não confundir com o cancelamento definitivo de contrato (outro fluxo) nem com o desbloqueio de contrato por faturamento (<code>Contracts/Unlock/{id}</code>), que não altera o status.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractId</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato a ser suspenso</td>\n</tr>\n<tr>\n<td><code>eventTypeCode</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Condicional</td>\n<td>Código do tipo de evento de suspensão; obrigatório apenas se houver mais de um tipo ativo com objetivo \"Suspender Contratos\"</td>\n</tr>\n<tr>\n<td><code>justify</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Justificativa da suspensão</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o contrato foi suspenso com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Mensagem de confirmação (ex.: \"Contrato suspenso com sucesso!\")</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Contrato não encontrado</td>\n<td>\"Não foi possível localizar os dados do contrato selecionado.\"</td>\n</tr>\n<tr>\n<td><code>justify</code> não informado</td>\n<td>Erro de argumento — \"Justificativa não repassada ao controlador.\"</td>\n</tr>\n<tr>\n<td><code>eventTypeCode</code> não encontrado</td>\n<td>\"Tipo de evento de suspensão não encontrado.\"</td>\n</tr>\n<tr>\n<td><code>eventTypeCode</code> não é do objetivo \"Suspender Contratos\"</td>\n<td>\"O tipo de evento informado não é um tipo de suspensão válido.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Para descobrir os códigos válidos de <code>eventTypeCode</code>, use <strong>Listar Tipos de Evento (por objetivo)</strong>. O <code>contractId</code> pode ser obtido em <strong>Busca de contratos paginada</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","Contract","Suspend",":contractId"],"host":["{{URL}}"],"query":[],"variable":[{"type":"any","value":"","key":"contractId"}]}},"response":[{"id":"6a9b2a56-77a4-22dc-a9aa-a87717ab06f0","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Suspend/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Suspend",":contractId"],"variable":[{"key":"contractId","value":""}]},"description":"## Propósito\n\nSuspende um contrato administrativamente, reaproveitando o mesmo motor de negócio da tela de atendimento: gera o evento de mudança de status + evento de suspensão, atualiza o status do contrato para `Suspenso`, bloqueia endereços de autenticação, bloqueia itens MVNO, replica conexões radius e dispara o bloqueio do cliente nas integrações externas (telefonia).\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- `contractId` (path) precisa existir.\n- `justify` é obrigatório — é gravada no evento de suspensão e em `Contracts.SuspensionMotive`.\n- `eventTypeCode` é opcional: se omitido, o ERP utiliza o único tipo de evento ativo configurado para a empresa com objetivo \"Suspender Contratos\"; se houver mais de um tipo ativo, `eventTypeCode` passa a ser obrigatório.\n- Use o endpoint **Listar Tipos de Evento (por objetivo)** (`objective=5`) para descobrir os códigos válidos de `eventTypeCode`.\n- Não confundir com o cancelamento definitivo de contrato (outro fluxo) nem com o desbloqueio de contrato por faturamento (`Contracts/Unlock/{id}`), que não altera o status.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato a ser suspenso |\n| `eventTypeCode` | Body | string | Condicional | Código do tipo de evento de suspensão; obrigatório apenas se houver mais de um tipo ativo com objetivo \"Suspender Contratos\" |\n| `justify` | Body | string | Sim | Justificativa da suspensão |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o contrato foi suspenso com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | string\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | string | Mensagem de confirmação (ex.: \"Contrato suspenso com sucesso!\") |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Mensagem |\n| --- | --- |\n| Contrato não encontrado | \"Não foi possível localizar os dados do contrato selecionado.\" |\n| `justify` não informado | Erro de argumento — \"Justificativa não repassada ao controlador.\" |\n| `eventTypeCode` não encontrado | \"Tipo de evento de suspensão não encontrado.\" |\n| `eventTypeCode` não é do objetivo \"Suspender Contratos\" | \"O tipo de evento informado não é um tipo de suspensão válido.\" |\n\n## Fluxo relacionado\n\nPara descobrir os códigos válidos de `eventTypeCode`, use **Listar Tipos de Evento (por objetivo)**. O `contractId` pode ser obtido em **Busca de contratos paginada**."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [],\n    \"response\": \"Contrato suspenso com sucesso!\",\n    \"elapsedTime\": null\n}"},{"id":"ad913b3d-321d-6346-82da-fa563bb643f0","name":"Erro — contrato não encontrado","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Suspend/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Suspend",":contractId"],"variable":[{"key":"contractId","value":""}]},"description":"## Propósito\n\nSuspende um contrato administrativamente, reaproveitando o mesmo motor de negócio da tela de atendimento: gera o evento de mudança de status + evento de suspensão, atualiza o status do contrato para `Suspenso`, bloqueia endereços de autenticação, bloqueia itens MVNO, replica conexões radius e dispara o bloqueio do cliente nas integrações externas (telefonia).\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- `contractId` (path) precisa existir.\n- `justify` é obrigatório — é gravada no evento de suspensão e em `Contracts.SuspensionMotive`.\n- `eventTypeCode` é opcional: se omitido, o ERP utiliza o único tipo de evento ativo configurado para a empresa com objetivo \"Suspender Contratos\"; se houver mais de um tipo ativo, `eventTypeCode` passa a ser obrigatório.\n- Use o endpoint **Listar Tipos de Evento (por objetivo)** (`objective=5`) para descobrir os códigos válidos de `eventTypeCode`.\n- Não confundir com o cancelamento definitivo de contrato (outro fluxo) nem com o desbloqueio de contrato por faturamento (`Contracts/Unlock/{id}`), que não altera o status.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato a ser suspenso |\n| `eventTypeCode` | Body | string | Condicional | Código do tipo de evento de suspensão; obrigatório apenas se houver mais de um tipo ativo com objetivo \"Suspender Contratos\" |\n| `justify` | Body | string | Sim | Justificativa da suspensão |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o contrato foi suspenso com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | string\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | string | Mensagem de confirmação (ex.: \"Contrato suspenso com sucesso!\") |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n\n| Situação | Mensagem |\n| --- | --- |\n| Contrato não encontrado | \"Não foi possível localizar os dados do contrato selecionado.\" |\n| `justify` não informado | Erro de argumento — \"Justificativa não repassada ao controlador.\" |\n| `eventTypeCode` não encontrado | \"Tipo de evento de suspensão não encontrado.\" |\n| `eventTypeCode` não é do objetivo \"Suspender Contratos\" | \"O tipo de evento informado não é um tipo de suspensão válido.\" |\n\n## Fluxo relacionado\n\nPara descobrir os códigos válidos de `eventTypeCode`, use **Listar Tipos de Evento (por objetivo)**. O `contractId` pode ser obtido em **Busca de contratos paginada**."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"Não foi possível localizar os dados do contrato selecionado.\", \"code\": null }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"88353d6d-4266-3fbf-b74b-82821e08b85e"},{"name":"Listar Tipos de Evento (por objetivo)","id":"2abdbd1c-de53-2b41-065e-47cef48b555b","request":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/Contract/EventTypes","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista os tipos de evento de contrato cadastrados para a empresa, filtrados pelo <code>objective</code> informado. Serve como endpoint de descoberta para o parceiro obter os códigos (<code>code</code>) válidos a usar em campos como <code>eventTypeCode</code> do endpoint de suspensão de contrato (<strong>Suspender Contrato</strong>).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas os tipos de evento ativos e não excluídos.</li>\n<li><code>objective</code> é obrigatório e aceita o valor numérico ou o nome do enum <code>ContractEventTypesObjectiveEnum</code>.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>objective</code></td>\n<td>Query string</td>\n<td>int/string</td>\n<td>Sim</td>\n<td>Objetivo dos tipos de evento (ver enum abaixo)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Enum <code>objective</code> (<code>ContractEventTypesObjectiveEnum</code>):</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Nome</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>1</td>\n<td><code>Generic</code></td>\n<td>Genérico</td>\n</tr>\n<tr>\n<td>2</td>\n<td><code>EndContracts</code></td>\n<td>Cancelar/Encerrar Contratos</td>\n</tr>\n<tr>\n<td>3</td>\n<td><code>EventualValues</code></td>\n<td>Valores Eventuais</td>\n</tr>\n<tr>\n<td>4</td>\n<td><code>EndMultipleContracts</code></td>\n<td>Cancelamento de Contratos em Lote</td>\n</tr>\n<tr>\n<td>5</td>\n<td><code>SuspensionContracts</code></td>\n<td>Suspender Contratos — usar para descobrir códigos de suspensão</td>\n</tr>\n<tr>\n<td>6</td>\n<td><code>AdministrativeBlock</code></td>\n<td>Bloqueio Administrativo</td>\n</tr>\n<tr>\n<td>7</td>\n<td><code>FinalizeCancellation</code></td>\n<td>Finalizar Cancelamento</td>\n</tr>\n<tr>\n<td>8</td>\n<td><code>RestoreCancellation</code></td>\n<td>Reverter Cancelamento</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi concluída com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].code</code></td>\n<td>string</td>\n<td>Código do tipo de evento</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Título/descrição do tipo de evento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Não há cenários de erro de <strong>negócio</strong> — este método apenas lista os tipos de evento já configurados no ERP. Um <code>objective</code> numérico fora do enum (ex.: <code>99</code>) ou sem tipos de evento cadastrados apenas resulta em <code>response: []</code>, não em mensagem de erro.</p>\n<p>⚠ Exceção ao padrão acima: se <code>objective</code> for enviado como um valor que <strong>não é numérico nem um nome válido do enum</strong> (ex.: <code>objective=abc</code>), a validação do parâmetro falha antes da regra de negócio ser executada, e a API retorna <strong>HTTP 400</strong> (corpo padrão de erro de validação, fora do envelope <code>success</code>/<code>messages</code>/<code>response</code>) em vez do HTTP 200 usual deste endpoint — não há exemplo desse cenário salvo nesta request.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Os códigos retornados com <code>objective=5</code> (Suspender Contratos) são usados no campo <code>eventTypeCode</code> de <strong>Suspender Contrato</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","Contract","EventTypes"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Objetivo dos tipos de evento (ver tabela na descrição). Ex.: 5 ou SuspensionContracts</p>\n","type":"text/plain"},"key":"objective","value":"5"}],"variable":[]}},"response":[{"id":"176ed6a6-47ab-973b-5d59-7cda4eb7dc92","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/EventTypes","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","EventTypes"],"query":[{"description":"Objetivo dos tipos de evento (ver tabela na descrição). Ex.: 5 ou SuspensionContracts","key":"objective","value":"5"}]},"description":"## Propósito\n\nLista os tipos de evento de contrato cadastrados para a empresa, filtrados pelo `objective` informado. Serve como endpoint de descoberta para o parceiro obter os códigos (`code`) válidos a usar em campos como `eventTypeCode` do endpoint de suspensão de contrato (**Suspender Contrato**).\n\n## Pré-requisitos\n\nToken de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n\n## Regras de negócio\n\n- Retorna apenas os tipos de evento ativos e não excluídos.\n- `objective` é obrigatório e aceita o valor numérico ou o nome do enum `ContractEventTypesObjectiveEnum`.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `objective` | Query string | int/string | Sim | Objetivo dos tipos de evento (ver enum abaixo) |\n\n**Enum `objective` (`ContractEventTypesObjectiveEnum`):**\n\n| Valor | Nome | Descrição |\n| --- | --- | --- |\n| 1 | `Generic` | Genérico |\n| 2 | `EndContracts` | Cancelar/Encerrar Contratos |\n| 3 | `EventualValues` | Valores Eventuais |\n| 4 | `EndMultipleContracts` | Cancelamento de Contratos em Lote |\n| 5 | `SuspensionContracts` | Suspender Contratos — usar para descobrir códigos de suspensão |\n| 6 | `AdministrativeBlock` | Bloqueio Administrativo |\n| 7 | `FinalizeCancellation` | Finalizar Cancelamento |\n| 8 | `RestoreCancellation` | Reverter Cancelamento |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a consulta foi concluída com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].code` | string | Código do tipo de evento |\n| `response[].title` | string | Título/descrição do tipo de evento |\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request.\n\n## Erros comuns\n\nNão há cenários de erro de **negócio** — este método apenas lista os tipos de evento já configurados no ERP. Um `objective` numérico fora do enum (ex.: `99`) ou sem tipos de evento cadastrados apenas resulta em `response: []`, não em mensagem de erro.\n\n⚠ Exceção ao padrão acima: se `objective` for enviado como um valor que **não é numérico nem um nome válido do enum** (ex.: `objective=abc`), a validação do parâmetro falha antes da regra de negócio ser executada, e a API retorna **HTTP 400** (corpo padrão de erro de validação, fora do envelope `success`/`messages`/`response`) em vez do HTTP 200 usual deste endpoint — não há exemplo desse cenário salvo nesta request.\n\n## Fluxo relacionado\n\nOs códigos retornados com `objective=5` (Suspender Contratos) são usados no campo `eventTypeCode` de **Suspender Contrato**."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [],\n  \"response\": [\n    { \"code\": \"SUSP01\", \"title\": \"Suspensão a pedido do cliente\" },\n    { \"code\": \"SUSP02\", \"title\": \"Suspensão por inadimplência\" }\n  ],\n  \"elapsedTime\": null\n}"}],"_postman_id":"2abdbd1c-de53-2b41-065e-47cef48b555b"},{"name":"Simular Cancelamento de Contrato","id":"e8db1743-eab7-dfcc-0113-65660cb6c387","request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/Simulation/:contractId","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Calcula a multa e o desfecho do cancelamento de um contrato sem alterar nada no ERP. Recebe o mesmo corpo do endpoint <strong>Cancelar Contrato</strong> e devolve, de uma vez, todas as condições que impediriam o cancelamento. Use antes de cancelar, para apresentar ao cliente o valor da multa e o que vai acontecer com o contrato.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</li>\n<li>Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use <strong>Listar Tipos de Evento (por objetivo)</strong> com <code>objective=2</code> para descobrir os códigos válidos.</li>\n<li>Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\". É ela que define multa, termo de rescisão, cobrança de extravio e se o contrato passa pela situação Em Cancelamento.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Nenhum dado é gravado: a simulação não gera evento, multa, cobrança, termo nem solicitação de retirada.</li>\n<li><code>available: true</code> indica que o cancelamento com o mesmo corpo seria aceito. As condições não atendidas vêm todas em <code>impediments</code>, e não só a primeira.</li>\n<li>Com impedimentos, a resposta traz só a identificação do contrato e a lista de impedimentos; multa, regra, termo, pendências e retirada não são calculados.</li>\n<li>A multa é calculada pelo mesmo método usado no cancelamento:<ul>\n<li>Sem regra de cancelamento, vale o <code>fineAmount</code> informado; sem ele, a multa é zero.</li>\n<li>Com regra, vale a multa apurada pela regra; <code>exemptFine: true</code> isenta essa multa.</li>\n<li>Quando a multa é cobrada depois do cancelamento e o contrato passa por Em Cancelamento, o valor é uma estimativa (<code>fine.estimated: true</code>); o valor definitivo é apurado na data da efetivação.</li>\n</ul>\n</li>\n<li>Para contrato que já está Em Cancelamento, as condições são avaliadas, mas o desfecho não é previsto: <code>expectedOutcome</code> e os demais blocos vêm nulos.</li>\n<li>Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractId</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>eventTypeCode</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\"</td>\n</tr>\n<tr>\n<td><code>justify</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Justificativa do cancelamento</td>\n</tr>\n<tr>\n<td><code>requesterIdentification</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Nome, matrícula ou protocolo de quem atendeu o cliente</td>\n</tr>\n<tr>\n<td><code>exemptFine</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não (padrão <code>false</code>)</td>\n<td>Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento</td>\n</tr>\n<tr>\n<td><code>fineAmount</code></td>\n<td>Body</td>\n<td>decimal</td>\n<td>Não</td>\n<td>Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. <code>0</code> não gera cobrança</td>\n</tr>\n<tr>\n<td><code>signers[].personId</code></td>\n<td>Body</td>\n<td>long</td>\n<td>Sim, por item</td>\n<td>Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato</td>\n</tr>\n<tr>\n<td><code>signers[].contactIds</code></td>\n<td>Body</td>\n<td>long[]</td>\n<td>Não</td>\n<td>Contatos da pessoa que recebem o documento para assinatura</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>fineAmount</code> é aceito:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Configuração do tipo de contrato</th>\n<th><code>fineAmount</code></th>\n<th>Multa considerada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Sem regra de cancelamento de uso avulso</td>\n<td>Aceito</td>\n<td>O valor informado</td>\n</tr>\n<tr>\n<td>Regra com a multa desligada</td>\n<td>Aceito, exceto se a regra tiver termo de rescisão ou extravio antes do cancelamento</td>\n<td>O valor informado</td>\n</tr>\n<tr>\n<td>Regra com multa (fórmula ou valor fixo)</td>\n<td>Recusado</td>\n<td>A apurada pela regra</td>\n</tr>\n<tr>\n<td>Regra \"Sem cobrança de multa\"</td>\n<td>Recusado</td>\n<td>Nenhuma</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>false</code> apenas para corpo inválido, contrato inexistente, regra de negócio do ERP ou erro interno</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array</td>\n<td>Lista de objetos <code>{ type, message, code }</code></td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Resultado da simulação</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"quando-success-true\">Quando <code>success: true</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>contractId</code></td>\n<td>long</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>contractNumber</code></td>\n<td>string</td>\n<td>Número do contrato</td>\n</tr>\n<tr>\n<td><code>contractStatus</code></td>\n<td>string</td>\n<td>Situação atual do contrato (tabela abaixo)</td>\n</tr>\n<tr>\n<td><code>available</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o cancelamento com o mesmo corpo seria aceito</td>\n</tr>\n<tr>\n<td><code>impediments[].type</code></td>\n<td>string</td>\n<td>Sempre <code>Error</code></td>\n</tr>\n<tr>\n<td><code>impediments[].code</code></td>\n<td>string</td>\n<td>Código da condição não atendida (ver \"Erros comuns\")</td>\n</tr>\n<tr>\n<td><code>impediments[].message</code></td>\n<td>string</td>\n<td>Texto da condição</td>\n</tr>\n<tr>\n<td><code>expectedOutcome</code></td>\n<td>string|null</td>\n<td><code>canceled</code> ou <code>onCancellation</code>. Nulo com impedimentos ou para contrato já Em Cancelamento</td>\n</tr>\n<tr>\n<td><code>cancellationRule.id</code></td>\n<td>long</td>\n<td>Id da regra de cancelamento de uso avulso. O bloco <code>cancellationRule</code> é nulo quando o tipo de contrato não tem regra</td>\n</tr>\n<tr>\n<td><code>cancellationRule.fineCalculationType</code></td>\n<td>string|null</td>\n<td><code>custom</code> (fórmula), <code>fixedAmount</code> (valor fixo) ou <code>noBillingFine</code> (sem cobrança de multa)</td>\n</tr>\n<tr>\n<td><code>fine.amount</code></td>\n<td>decimal</td>\n<td>Multa que o cancelamento vai cobrar</td>\n</tr>\n<tr>\n<td><code>fine.chargeMoment</code></td>\n<td>string|null</td>\n<td><code>beforeCancellation</code> ou <code>afterCancellation</code>. Nulo sem regra</td>\n</tr>\n<tr>\n<td><code>fine.invoiceMoment</code></td>\n<td>string|null</td>\n<td><code>inActEmissionBilling</code> (NF na emissão da cobrança) ou <code>inActLiquidationBilling</code> (NF na liquidação). Nulo sem regra</td>\n</tr>\n<tr>\n<td><code>fine.exempted</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a multa foi isentada por <code>exemptFine</code></td>\n</tr>\n<tr>\n<td><code>fine.estimated</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o valor é apurado só na efetivação do cancelamento</td>\n</tr>\n<tr>\n<td><code>terminationTerm.moment</code></td>\n<td>string</td>\n<td><code>beforeCancellation</code> ou <code>afterCancellation</code>. O bloco <code>terminationTerm</code> é nulo quando a regra não gera termo</td>\n</tr>\n<tr>\n<td><code>pendingActions[].type</code></td>\n<td>string</td>\n<td>Ação que manterá o contrato Em Cancelamento (tabela abaixo)</td>\n</tr>\n<tr>\n<td><code>pendingActions[].description</code></td>\n<td>string</td>\n<td>Descrição da ação</td>\n</tr>\n<tr>\n<td><code>removalRequest.count</code></td>\n<td>int</td>\n<td>Quantidade de solicitações de retirada que serão abertas</td>\n</tr>\n<tr>\n<td><code>removalRequest.equipments[].title</code></td>\n<td>string</td>\n<td>Equipamento em comodato</td>\n</tr>\n<tr>\n<td><code>removalRequest.equipments[].amount</code></td>\n<td>decimal</td>\n<td>Valor do equipamento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>contractStatus</code> e <code>expectedOutcome</code>:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Situação</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>normal</code></td>\n<td>Normal</td>\n</tr>\n<tr>\n<td><code>demo</code></td>\n<td>Demonstração</td>\n</tr>\n<tr>\n<td><code>courtesy</code></td>\n<td>Cortesia</td>\n</tr>\n<tr>\n<td><code>canceled</code></td>\n<td>Cancelado</td>\n</tr>\n<tr>\n<td><code>suspended</code></td>\n<td>Suspenso</td>\n</tr>\n<tr>\n<td><code>financialBlock</code></td>\n<td>Bloqueio financeiro</td>\n</tr>\n<tr>\n<td><code>adminBlock</code></td>\n<td>Bloqueio administrativo</td>\n</tr>\n<tr>\n<td><code>finished</code></td>\n<td>Encerrado</td>\n</tr>\n<tr>\n<td><code>onCancellation</code></td>\n<td>Em Cancelamento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong><code>pendingActions[].type</code>:</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Valor</th>\n<th>Quando aparece</th>\n<th>Quando é concluída</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>fineSettlement</code></td>\n<td>A regra cobra multa antes do cancelamento, com valor maior que zero e sem isenção</td>\n<td>Título da multa liquidado e NF emitida</td>\n</tr>\n<tr>\n<td><code>terminationTermSignature</code></td>\n<td>A regra exige o termo de rescisão antes do cancelamento</td>\n<td>Assinatura concluída</td>\n</tr>\n<tr>\n<td><code>lostEquipment</code></td>\n<td>A regra cobra extravio antes do cancelamento e há patrimônio não devolvido</td>\n<td>Patrimônio devolvido, ou extravio cobrado e liquidado</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"quando-success-false\">Quando <code>success: false</code></h3>\n<p><code>response</code> vem <code>null</code>; o motivo vem em <code>messages[]</code>, com <code>type: Error</code> e o <code>code</code> da recusa.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th><code>code</code></th>\n<th>Mensagem</th>\n<th>Onde aparece</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Corpo ausente ou JSON inválido</td>\n<td><code>CORPO_INVALIDO</code></td>\n<td>\"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\"</td>\n<td><code>messages</code>, <code>success: false</code></td>\n</tr>\n<tr>\n<td>Contrato inexistente</td>\n<td><code>CONTRATO_NAO_ENCONTRADO</code></td>\n<td>\"Contrato não encontrado.\"</td>\n<td><code>messages</code>, <code>success: false</code></td>\n</tr>\n<tr>\n<td>Contrato já cancelado</td>\n<td><code>CONTRATO_JA_CANCELADO</code></td>\n<td>\"O contrato já está cancelado.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>requesterIdentification</code> vazio</td>\n<td><code>SOLICITANTE_AUSENTE</code></td>\n<td>\"Informe a identificação de quem atendeu o cliente.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td>Tipo de evento inexistente ou inativo</td>\n<td><code>TIPO_EVENTO_NAO_ENCONTRADO</code></td>\n<td>\"Tipo de evento {code} não encontrado ou inativo.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td>Tipo de evento com outro objetivo</td>\n<td><code>TIPO_EVENTO_INVALIDO</code></td>\n<td>\"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>justify</code> vazio</td>\n<td><code>JUSTIFICATIVA_AUSENTE</code></td>\n<td>\"Informe a justificativa do cancelamento.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td>Contrato em rede neutra</td>\n<td><code>REDE_NEUTRA_NAO_SUPORTADA</code></td>\n<td>\"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com regra que já define a multa</td>\n<td><code>MULTA_PREVISTA_NO_TIPO</code></td>\n<td>\"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com regra sem cobrança de multa</td>\n<td><code>MULTA_REGRA_SEM_COBRANCA</code></td>\n<td>\"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com termo ou extravio antes do cancelamento</td>\n<td><code>MULTA_TERMO_ANTERIOR</code></td>\n<td>\"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>fineAmount</code> negativo</td>\n<td><code>MULTA_VALOR_INVALIDO</code></td>\n<td>\"O valor da multa não pode ser negativo.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td><code>exemptFine: true</code> sem regra</td>\n<td><code>ISENCAO_SEM_REGRA</code></td>\n<td>\"O tipo de contrato não possui regra de cancelamento que permita isenção.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td>Regra gera termo, mas não tem template de impressão</td>\n<td><code>TERMO_SEM_TEMPLATE</code></td>\n<td>\"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\"</td>\n<td><code>impediments</code></td>\n</tr>\n<tr>\n<td>Recusa de regra de negócio do ERP</td>\n<td><code>REGRA_NEGOCIO</code></td>\n<td>Mensagem original do ERP</td>\n<td><code>messages</code>, <code>success: false</code></td>\n</tr>\n<tr>\n<td>Falha inesperada</td>\n<td><code>ERRO_INTERNO</code></td>\n<td>\"Não foi possível processar o cancelamento.\"</td>\n<td><code>messages</code>, <code>success: false</code></td>\n</tr>\n</tbody>\n</table>\n</div><p>Todas as respostas usam HTTP 200; o resultado é indicado por <code>success</code> e <code>available</code>.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Antes: <strong>Listar Tipos de Evento (por objetivo)</strong> com <code>objective=2</code>, para obter o <code>eventTypeCode</code>. O <code>contractId</code> pode ser obtido em <strong>Busca de contratos paginada</strong>.</li>\n<li>Depois: <strong>Cancelar Contrato</strong>, com o mesmo corpo, para efetivar o cancelamento.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel","Simulation",":contractId"],"host":["{{URL}}"],"query":[],"variable":[{"type":"any","key":"contractId"}]}},"response":[{"id":"ec17cba1-7f23-2462-d3e7-6e484ac1f3ae","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/Simulation/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel","Simulation",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCalcula a multa e o desfecho do cancelamento de um contrato sem alterar nada no ERP. Recebe o mesmo corpo do endpoint **Cancelar Contrato** e devolve, de uma vez, todas as condições que impediriam o cancelamento. Use antes de cancelar, para apresentar ao cliente o valor da multa e o que vai acontecer com o contrato.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\". É ela que define multa, termo de rescisão, cobrança de extravio e se o contrato passa pela situação Em Cancelamento.\n\n## Regras de negócio\n\n- Nenhum dado é gravado: a simulação não gera evento, multa, cobrança, termo nem solicitação de retirada.\n- `available: true` indica que o cancelamento com o mesmo corpo seria aceito. As condições não atendidas vêm todas em `impediments`, e não só a primeira.\n- Com impedimentos, a resposta traz só a identificação do contrato e a lista de impedimentos; multa, regra, termo, pendências e retirada não são calculados.\n- A multa é calculada pelo mesmo método usado no cancelamento:\n  - Sem regra de cancelamento, vale o `fineAmount` informado; sem ele, a multa é zero.\n  - Com regra, vale a multa apurada pela regra; `exemptFine: true` isenta essa multa.\n  - Quando a multa é cobrada depois do cancelamento e o contrato passa por Em Cancelamento, o valor é uma estimativa (`fine.estimated: true`); o valor definitivo é apurado na data da efetivação.\n- Para contrato que já está Em Cancelamento, as condições são avaliadas, mas o desfecho não é previsto: `expectedOutcome` e os demais blocos vêm nulos.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n**Quando `fineAmount` é aceito:**\n\n| Configuração do tipo de contrato | `fineAmount` | Multa considerada |\n| --- | --- | --- |\n| Sem regra de cancelamento de uso avulso | Aceito | O valor informado |\n| Regra com a multa desligada | Aceito, exceto se a regra tiver termo de rescisão ou extravio antes do cancelamento | O valor informado |\n| Regra com multa (fórmula ou valor fixo) | Recusado | A apurada pela regra |\n| Regra \"Sem cobrança de multa\" | Recusado | Nenhuma |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas para corpo inválido, contrato inexistente, regra de negócio do ERP ou erro interno |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Resultado da simulação |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `contractStatus` | string | Situação atual do contrato (tabela abaixo) |\n| `available` | boolean | `true` quando o cancelamento com o mesmo corpo seria aceito |\n| `impediments[].type` | string | Sempre `Error` |\n| `impediments[].code` | string | Código da condição não atendida (ver \"Erros comuns\") |\n| `impediments[].message` | string | Texto da condição |\n| `expectedOutcome` | string\\|null | `canceled` ou `onCancellation`. Nulo com impedimentos ou para contrato já Em Cancelamento |\n| `cancellationRule.id` | long | Id da regra de cancelamento de uso avulso. O bloco `cancellationRule` é nulo quando o tipo de contrato não tem regra |\n| `cancellationRule.fineCalculationType` | string\\|null | `custom` (fórmula), `fixedAmount` (valor fixo) ou `noBillingFine` (sem cobrança de multa) |\n| `fine.amount` | decimal | Multa que o cancelamento vai cobrar |\n| `fine.chargeMoment` | string\\|null | `beforeCancellation` ou `afterCancellation`. Nulo sem regra |\n| `fine.invoiceMoment` | string\\|null | `inActEmissionBilling` (NF na emissão da cobrança) ou `inActLiquidationBilling` (NF na liquidação). Nulo sem regra |\n| `fine.exempted` | boolean | `true` quando a multa foi isentada por `exemptFine` |\n| `fine.estimated` | boolean | `true` quando o valor é apurado só na efetivação do cancelamento |\n| `terminationTerm.moment` | string | `beforeCancellation` ou `afterCancellation`. O bloco `terminationTerm` é nulo quando a regra não gera termo |\n| `pendingActions[].type` | string | Ação que manterá o contrato Em Cancelamento (tabela abaixo) |\n| `pendingActions[].description` | string | Descrição da ação |\n| `removalRequest.count` | int | Quantidade de solicitações de retirada que serão abertas |\n| `removalRequest.equipments[].title` | string | Equipamento em comodato |\n| `removalRequest.equipments[].amount` | decimal | Valor do equipamento |\n\n**`contractStatus` e `expectedOutcome`:**\n\n| Valor | Situação |\n| --- | --- |\n| `normal` | Normal |\n| `demo` | Demonstração |\n| `courtesy` | Cortesia |\n| `canceled` | Cancelado |\n| `suspended` | Suspenso |\n| `financialBlock` | Bloqueio financeiro |\n| `adminBlock` | Bloqueio administrativo |\n| `finished` | Encerrado |\n| `onCancellation` | Em Cancelamento |\n\n**`pendingActions[].type`:**\n\n| Valor | Quando aparece | Quando é concluída |\n| --- | --- | --- |\n| `fineSettlement` | A regra cobra multa antes do cancelamento, com valor maior que zero e sem isenção | Título da multa liquidado e NF emitida |\n| `terminationTermSignature` | A regra exige o termo de rescisão antes do cancelamento | Assinatura concluída |\n| `lostEquipment` | A regra cobra extravio antes do cancelamento e há patrimônio não devolvido | Patrimônio devolvido, ou extravio cobrado e liquidado |\n\n### Quando `success: false`\n\n`response` vem `null`; o motivo vem em `messages[]`, com `type: Error` e o `code` da recusa.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem | Onde aparece |\n| --- | --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" | `messages`, `success: false` |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" | `messages`, `success: false` |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" | `impediments` |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" | `impediments` |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" | `impediments` |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" | `impediments` |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" | `impediments` |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" | `impediments` |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" | `impediments` |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" | `impediments` |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" | `impediments` |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" | `impediments` |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP | `messages`, `success: false` |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" | `messages`, `success: false` |\n\nTodas as respostas usam HTTP 200; o resultado é indicado por `success` e `available`.\n\n## Fluxo relacionado\n\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois: **Cancelar Contrato**, com o mesmo corpo, para efetivar o cancelamento."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [],\n    \"response\": {\n        \"contractId\": 4512,\n        \"contractNumber\": \"004512\",\n        \"contractStatus\": \"normal\",\n        \"available\": true, // o cancelamento com este corpo seria aceito\n        \"impediments\": [],\n        \"expectedOutcome\": \"onCancellation\", // o contrato vai para Em Cancelamento até a multa ser liquidada\n        \"cancellationRule\": {\n            \"id\": 10,\n            \"fineCalculationType\": \"custom\" // multa calculada pela fórmula da regra\n        },\n        \"fine\": {\n            \"amount\": 150.00,\n            \"chargeMoment\": \"beforeCancellation\", // cobrada antes do cancelamento\n            \"invoiceMoment\": \"inActLiquidationBilling\", // NF emitida na liquidação do título\n            \"exempted\": false,\n            \"estimated\": false // valor definitivo\n        },\n        \"terminationTerm\": {\n            \"moment\": \"afterCancellation\" // termo gerado depois do cancelamento\n        },\n        \"pendingActions\": [\n            {\n                \"type\": \"fineSettlement\",\n                \"description\": \"Liquidação da multa de cancelamento\"\n            }\n        ],\n        \"removalRequest\": {\n            \"count\": 1, // solicitações de retirada que serão abertas\n            \"equipments\": [\n                { \"title\": \"ONU - patrimônio 77821\", \"amount\": 180.00 }\n            ]\n        }\n    },\n    \"elapsedTime\": null\n}"},{"id":"428f1c17-e5e4-4379-bee9-8a057e8c6580","name":"Sucesso — com impedimentos","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/Simulation/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel","Simulation",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCalcula a multa e o desfecho do cancelamento de um contrato sem alterar nada no ERP. Recebe o mesmo corpo do endpoint **Cancelar Contrato** e devolve, de uma vez, todas as condições que impediriam o cancelamento. Use antes de cancelar, para apresentar ao cliente o valor da multa e o que vai acontecer com o contrato.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\". É ela que define multa, termo de rescisão, cobrança de extravio e se o contrato passa pela situação Em Cancelamento.\n\n## Regras de negócio\n\n- Nenhum dado é gravado: a simulação não gera evento, multa, cobrança, termo nem solicitação de retirada.\n- `available: true` indica que o cancelamento com o mesmo corpo seria aceito. As condições não atendidas vêm todas em `impediments`, e não só a primeira.\n- Com impedimentos, a resposta traz só a identificação do contrato e a lista de impedimentos; multa, regra, termo, pendências e retirada não são calculados.\n- A multa é calculada pelo mesmo método usado no cancelamento:\n  - Sem regra de cancelamento, vale o `fineAmount` informado; sem ele, a multa é zero.\n  - Com regra, vale a multa apurada pela regra; `exemptFine: true` isenta essa multa.\n  - Quando a multa é cobrada depois do cancelamento e o contrato passa por Em Cancelamento, o valor é uma estimativa (`fine.estimated: true`); o valor definitivo é apurado na data da efetivação.\n- Para contrato que já está Em Cancelamento, as condições são avaliadas, mas o desfecho não é previsto: `expectedOutcome` e os demais blocos vêm nulos.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n**Quando `fineAmount` é aceito:**\n\n| Configuração do tipo de contrato | `fineAmount` | Multa considerada |\n| --- | --- | --- |\n| Sem regra de cancelamento de uso avulso | Aceito | O valor informado |\n| Regra com a multa desligada | Aceito, exceto se a regra tiver termo de rescisão ou extravio antes do cancelamento | O valor informado |\n| Regra com multa (fórmula ou valor fixo) | Recusado | A apurada pela regra |\n| Regra \"Sem cobrança de multa\" | Recusado | Nenhuma |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas para corpo inválido, contrato inexistente, regra de negócio do ERP ou erro interno |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Resultado da simulação |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `contractStatus` | string | Situação atual do contrato (tabela abaixo) |\n| `available` | boolean | `true` quando o cancelamento com o mesmo corpo seria aceito |\n| `impediments[].type` | string | Sempre `Error` |\n| `impediments[].code` | string | Código da condição não atendida (ver \"Erros comuns\") |\n| `impediments[].message` | string | Texto da condição |\n| `expectedOutcome` | string\\|null | `canceled` ou `onCancellation`. Nulo com impedimentos ou para contrato já Em Cancelamento |\n| `cancellationRule.id` | long | Id da regra de cancelamento de uso avulso. O bloco `cancellationRule` é nulo quando o tipo de contrato não tem regra |\n| `cancellationRule.fineCalculationType` | string\\|null | `custom` (fórmula), `fixedAmount` (valor fixo) ou `noBillingFine` (sem cobrança de multa) |\n| `fine.amount` | decimal | Multa que o cancelamento vai cobrar |\n| `fine.chargeMoment` | string\\|null | `beforeCancellation` ou `afterCancellation`. Nulo sem regra |\n| `fine.invoiceMoment` | string\\|null | `inActEmissionBilling` (NF na emissão da cobrança) ou `inActLiquidationBilling` (NF na liquidação). Nulo sem regra |\n| `fine.exempted` | boolean | `true` quando a multa foi isentada por `exemptFine` |\n| `fine.estimated` | boolean | `true` quando o valor é apurado só na efetivação do cancelamento |\n| `terminationTerm.moment` | string | `beforeCancellation` ou `afterCancellation`. O bloco `terminationTerm` é nulo quando a regra não gera termo |\n| `pendingActions[].type` | string | Ação que manterá o contrato Em Cancelamento (tabela abaixo) |\n| `pendingActions[].description` | string | Descrição da ação |\n| `removalRequest.count` | int | Quantidade de solicitações de retirada que serão abertas |\n| `removalRequest.equipments[].title` | string | Equipamento em comodato |\n| `removalRequest.equipments[].amount` | decimal | Valor do equipamento |\n\n**`contractStatus` e `expectedOutcome`:**\n\n| Valor | Situação |\n| --- | --- |\n| `normal` | Normal |\n| `demo` | Demonstração |\n| `courtesy` | Cortesia |\n| `canceled` | Cancelado |\n| `suspended` | Suspenso |\n| `financialBlock` | Bloqueio financeiro |\n| `adminBlock` | Bloqueio administrativo |\n| `finished` | Encerrado |\n| `onCancellation` | Em Cancelamento |\n\n**`pendingActions[].type`:**\n\n| Valor | Quando aparece | Quando é concluída |\n| --- | --- | --- |\n| `fineSettlement` | A regra cobra multa antes do cancelamento, com valor maior que zero e sem isenção | Título da multa liquidado e NF emitida |\n| `terminationTermSignature` | A regra exige o termo de rescisão antes do cancelamento | Assinatura concluída |\n| `lostEquipment` | A regra cobra extravio antes do cancelamento e há patrimônio não devolvido | Patrimônio devolvido, ou extravio cobrado e liquidado |\n\n### Quando `success: false`\n\n`response` vem `null`; o motivo vem em `messages[]`, com `type: Error` e o `code` da recusa.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem | Onde aparece |\n| --- | --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" | `messages`, `success: false` |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" | `messages`, `success: false` |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" | `impediments` |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" | `impediments` |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" | `impediments` |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" | `impediments` |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" | `impediments` |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" | `impediments` |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" | `impediments` |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" | `impediments` |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" | `impediments` |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" | `impediments` |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP | `messages`, `success: false` |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" | `messages`, `success: false` |\n\nTodas as respostas usam HTTP 200; o resultado é indicado por `success` e `available`.\n\n## Fluxo relacionado\n\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois: **Cancelar Contrato**, com o mesmo corpo, para efetivar o cancelamento."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [],\n    \"response\": {\n        \"contractId\": 4512,\n        \"contractNumber\": \"004512\",\n        \"contractStatus\": \"normal\",\n        \"available\": false,\n        \"impediments\": [\n            { \"type\": \"Error\", \"code\": \"MULTA_PREVISTA_NO_TIPO\", \"message\": \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" },\n            { \"type\": \"Error\", \"code\": \"JUSTIFICATIVA_AUSENTE\", \"message\": \"Informe a justificativa do cancelamento.\" }\n        ],\n        \"expectedOutcome\": null,\n        \"cancellationRule\": null,\n        \"fine\": null,\n        \"terminationTerm\": null,\n        \"pendingActions\": [],\n        \"removalRequest\": null\n    },\n    \"elapsedTime\": null\n}"},{"id":"2ef7df1a-94fa-f4f0-a58c-0395850e752d","name":"Erro — contrato não encontrado","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/Simulation/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel","Simulation",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCalcula a multa e o desfecho do cancelamento de um contrato sem alterar nada no ERP. Recebe o mesmo corpo do endpoint **Cancelar Contrato** e devolve, de uma vez, todas as condições que impediriam o cancelamento. Use antes de cancelar, para apresentar ao cliente o valor da multa e o que vai acontecer com o contrato.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\". É ela que define multa, termo de rescisão, cobrança de extravio e se o contrato passa pela situação Em Cancelamento.\n\n## Regras de negócio\n\n- Nenhum dado é gravado: a simulação não gera evento, multa, cobrança, termo nem solicitação de retirada.\n- `available: true` indica que o cancelamento com o mesmo corpo seria aceito. As condições não atendidas vêm todas em `impediments`, e não só a primeira.\n- Com impedimentos, a resposta traz só a identificação do contrato e a lista de impedimentos; multa, regra, termo, pendências e retirada não são calculados.\n- A multa é calculada pelo mesmo método usado no cancelamento:\n  - Sem regra de cancelamento, vale o `fineAmount` informado; sem ele, a multa é zero.\n  - Com regra, vale a multa apurada pela regra; `exemptFine: true` isenta essa multa.\n  - Quando a multa é cobrada depois do cancelamento e o contrato passa por Em Cancelamento, o valor é uma estimativa (`fine.estimated: true`); o valor definitivo é apurado na data da efetivação.\n- Para contrato que já está Em Cancelamento, as condições são avaliadas, mas o desfecho não é previsto: `expectedOutcome` e os demais blocos vêm nulos.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n**Quando `fineAmount` é aceito:**\n\n| Configuração do tipo de contrato | `fineAmount` | Multa considerada |\n| --- | --- | --- |\n| Sem regra de cancelamento de uso avulso | Aceito | O valor informado |\n| Regra com a multa desligada | Aceito, exceto se a regra tiver termo de rescisão ou extravio antes do cancelamento | O valor informado |\n| Regra com multa (fórmula ou valor fixo) | Recusado | A apurada pela regra |\n| Regra \"Sem cobrança de multa\" | Recusado | Nenhuma |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas para corpo inválido, contrato inexistente, regra de negócio do ERP ou erro interno |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Resultado da simulação |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `contractStatus` | string | Situação atual do contrato (tabela abaixo) |\n| `available` | boolean | `true` quando o cancelamento com o mesmo corpo seria aceito |\n| `impediments[].type` | string | Sempre `Error` |\n| `impediments[].code` | string | Código da condição não atendida (ver \"Erros comuns\") |\n| `impediments[].message` | string | Texto da condição |\n| `expectedOutcome` | string\\|null | `canceled` ou `onCancellation`. Nulo com impedimentos ou para contrato já Em Cancelamento |\n| `cancellationRule.id` | long | Id da regra de cancelamento de uso avulso. O bloco `cancellationRule` é nulo quando o tipo de contrato não tem regra |\n| `cancellationRule.fineCalculationType` | string\\|null | `custom` (fórmula), `fixedAmount` (valor fixo) ou `noBillingFine` (sem cobrança de multa) |\n| `fine.amount` | decimal | Multa que o cancelamento vai cobrar |\n| `fine.chargeMoment` | string\\|null | `beforeCancellation` ou `afterCancellation`. Nulo sem regra |\n| `fine.invoiceMoment` | string\\|null | `inActEmissionBilling` (NF na emissão da cobrança) ou `inActLiquidationBilling` (NF na liquidação). Nulo sem regra |\n| `fine.exempted` | boolean | `true` quando a multa foi isentada por `exemptFine` |\n| `fine.estimated` | boolean | `true` quando o valor é apurado só na efetivação do cancelamento |\n| `terminationTerm.moment` | string | `beforeCancellation` ou `afterCancellation`. O bloco `terminationTerm` é nulo quando a regra não gera termo |\n| `pendingActions[].type` | string | Ação que manterá o contrato Em Cancelamento (tabela abaixo) |\n| `pendingActions[].description` | string | Descrição da ação |\n| `removalRequest.count` | int | Quantidade de solicitações de retirada que serão abertas |\n| `removalRequest.equipments[].title` | string | Equipamento em comodato |\n| `removalRequest.equipments[].amount` | decimal | Valor do equipamento |\n\n**`contractStatus` e `expectedOutcome`:**\n\n| Valor | Situação |\n| --- | --- |\n| `normal` | Normal |\n| `demo` | Demonstração |\n| `courtesy` | Cortesia |\n| `canceled` | Cancelado |\n| `suspended` | Suspenso |\n| `financialBlock` | Bloqueio financeiro |\n| `adminBlock` | Bloqueio administrativo |\n| `finished` | Encerrado |\n| `onCancellation` | Em Cancelamento |\n\n**`pendingActions[].type`:**\n\n| Valor | Quando aparece | Quando é concluída |\n| --- | --- | --- |\n| `fineSettlement` | A regra cobra multa antes do cancelamento, com valor maior que zero e sem isenção | Título da multa liquidado e NF emitida |\n| `terminationTermSignature` | A regra exige o termo de rescisão antes do cancelamento | Assinatura concluída |\n| `lostEquipment` | A regra cobra extravio antes do cancelamento e há patrimônio não devolvido | Patrimônio devolvido, ou extravio cobrado e liquidado |\n\n### Quando `success: false`\n\n`response` vem `null`; o motivo vem em `messages[]`, com `type: Error` e o `code` da recusa.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem | Onde aparece |\n| --- | --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" | `messages`, `success: false` |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" | `messages`, `success: false` |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" | `impediments` |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" | `impediments` |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" | `impediments` |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" | `impediments` |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" | `impediments` |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" | `impediments` |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" | `impediments` |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" | `impediments` |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" | `impediments` |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" | `impediments` |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP | `messages`, `success: false` |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" | `messages`, `success: false` |\n\nTodas as respostas usam HTTP 200; o resultado é indicado por `success` e `available`.\n\n## Fluxo relacionado\n\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois: **Cancelar Contrato**, com o mesmo corpo, para efetivar o cancelamento."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"code\": \"CONTRATO_NAO_ENCONTRADO\", \"message\": \"Contrato não encontrado.\" }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"fd15c972-69d3-8b5e-dcda-c6160caccf5c","name":"Erro — corpo inválido","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/Simulation/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel","Simulation",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCalcula a multa e o desfecho do cancelamento de um contrato sem alterar nada no ERP. Recebe o mesmo corpo do endpoint **Cancelar Contrato** e devolve, de uma vez, todas as condições que impediriam o cancelamento. Use antes de cancelar, para apresentar ao cliente o valor da multa e o que vai acontecer com o contrato.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\". É ela que define multa, termo de rescisão, cobrança de extravio e se o contrato passa pela situação Em Cancelamento.\n\n## Regras de negócio\n\n- Nenhum dado é gravado: a simulação não gera evento, multa, cobrança, termo nem solicitação de retirada.\n- `available: true` indica que o cancelamento com o mesmo corpo seria aceito. As condições não atendidas vêm todas em `impediments`, e não só a primeira.\n- Com impedimentos, a resposta traz só a identificação do contrato e a lista de impedimentos; multa, regra, termo, pendências e retirada não são calculados.\n- A multa é calculada pelo mesmo método usado no cancelamento:\n  - Sem regra de cancelamento, vale o `fineAmount` informado; sem ele, a multa é zero.\n  - Com regra, vale a multa apurada pela regra; `exemptFine: true` isenta essa multa.\n  - Quando a multa é cobrada depois do cancelamento e o contrato passa por Em Cancelamento, o valor é uma estimativa (`fine.estimated: true`); o valor definitivo é apurado na data da efetivação.\n- Para contrato que já está Em Cancelamento, as condições são avaliadas, mas o desfecho não é previsto: `expectedOutcome` e os demais blocos vêm nulos.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n**Quando `fineAmount` é aceito:**\n\n| Configuração do tipo de contrato | `fineAmount` | Multa considerada |\n| --- | --- | --- |\n| Sem regra de cancelamento de uso avulso | Aceito | O valor informado |\n| Regra com a multa desligada | Aceito, exceto se a regra tiver termo de rescisão ou extravio antes do cancelamento | O valor informado |\n| Regra com multa (fórmula ou valor fixo) | Recusado | A apurada pela regra |\n| Regra \"Sem cobrança de multa\" | Recusado | Nenhuma |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `false` apenas para corpo inválido, contrato inexistente, regra de negócio do ERP ou erro interno |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Resultado da simulação |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `contractStatus` | string | Situação atual do contrato (tabela abaixo) |\n| `available` | boolean | `true` quando o cancelamento com o mesmo corpo seria aceito |\n| `impediments[].type` | string | Sempre `Error` |\n| `impediments[].code` | string | Código da condição não atendida (ver \"Erros comuns\") |\n| `impediments[].message` | string | Texto da condição |\n| `expectedOutcome` | string\\|null | `canceled` ou `onCancellation`. Nulo com impedimentos ou para contrato já Em Cancelamento |\n| `cancellationRule.id` | long | Id da regra de cancelamento de uso avulso. O bloco `cancellationRule` é nulo quando o tipo de contrato não tem regra |\n| `cancellationRule.fineCalculationType` | string\\|null | `custom` (fórmula), `fixedAmount` (valor fixo) ou `noBillingFine` (sem cobrança de multa) |\n| `fine.amount` | decimal | Multa que o cancelamento vai cobrar |\n| `fine.chargeMoment` | string\\|null | `beforeCancellation` ou `afterCancellation`. Nulo sem regra |\n| `fine.invoiceMoment` | string\\|null | `inActEmissionBilling` (NF na emissão da cobrança) ou `inActLiquidationBilling` (NF na liquidação). Nulo sem regra |\n| `fine.exempted` | boolean | `true` quando a multa foi isentada por `exemptFine` |\n| `fine.estimated` | boolean | `true` quando o valor é apurado só na efetivação do cancelamento |\n| `terminationTerm.moment` | string | `beforeCancellation` ou `afterCancellation`. O bloco `terminationTerm` é nulo quando a regra não gera termo |\n| `pendingActions[].type` | string | Ação que manterá o contrato Em Cancelamento (tabela abaixo) |\n| `pendingActions[].description` | string | Descrição da ação |\n| `removalRequest.count` | int | Quantidade de solicitações de retirada que serão abertas |\n| `removalRequest.equipments[].title` | string | Equipamento em comodato |\n| `removalRequest.equipments[].amount` | decimal | Valor do equipamento |\n\n**`contractStatus` e `expectedOutcome`:**\n\n| Valor | Situação |\n| --- | --- |\n| `normal` | Normal |\n| `demo` | Demonstração |\n| `courtesy` | Cortesia |\n| `canceled` | Cancelado |\n| `suspended` | Suspenso |\n| `financialBlock` | Bloqueio financeiro |\n| `adminBlock` | Bloqueio administrativo |\n| `finished` | Encerrado |\n| `onCancellation` | Em Cancelamento |\n\n**`pendingActions[].type`:**\n\n| Valor | Quando aparece | Quando é concluída |\n| --- | --- | --- |\n| `fineSettlement` | A regra cobra multa antes do cancelamento, com valor maior que zero e sem isenção | Título da multa liquidado e NF emitida |\n| `terminationTermSignature` | A regra exige o termo de rescisão antes do cancelamento | Assinatura concluída |\n| `lostEquipment` | A regra cobra extravio antes do cancelamento e há patrimônio não devolvido | Patrimônio devolvido, ou extravio cobrado e liquidado |\n\n### Quando `success: false`\n\n`response` vem `null`; o motivo vem em `messages[]`, com `type: Error` e o `code` da recusa.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem | Onde aparece |\n| --- | --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" | `messages`, `success: false` |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" | `messages`, `success: false` |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" | `impediments` |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" | `impediments` |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" | `impediments` |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" | `impediments` |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" | `impediments` |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" | `impediments` |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" | `impediments` |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" | `impediments` |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" | `impediments` |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" | `impediments` |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" | `impediments` |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP | `messages`, `success: false` |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" | `messages`, `success: false` |\n\nTodas as respostas usam HTTP 200; o resultado é indicado por `success` e `available`.\n\n## Fluxo relacionado\n\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois: **Cancelar Contrato**, com o mesmo corpo, para efetivar o cancelamento."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"code\": \"CORPO_INVALIDO\", \"message\": \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"e8db1743-eab7-dfcc-0113-65660cb6c387"},{"name":"Cancelar Contrato","id":"0cad77bd-672c-e7e2-8683-c6e30b8840ea","request":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/:contractId","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Cancela um contrato pelo mesmo caminho do cancelamento avulso da Tela de Atendimento. Conforme a regra de cancelamento do tipo de contrato, o cancelamento é efetivado na hora ou o contrato vai para Em Cancelamento até as pendências serem concluídas.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de acesso obtido no endpoint de autenticação, enviado no header <code>Authorization: Bearer {{access_token}}</code>.</li>\n<li>Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use <strong>Listar Tipos de Evento (por objetivo)</strong> com <code>objective=2</code> para descobrir os códigos válidos.</li>\n<li>Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Antes de qualquer alteração, são verificadas as mesmas condições da <strong>Simular Cancelamento de Contrato</strong>. Havendo recusa, nada é gravado e nenhum evento é gerado.</li>\n<li>Desfecho:<ul>\n<li><code>canceled</code>: o contrato é cancelado na hora.</li>\n<li><code>onCancellation</code>: o contrato fica Em Cancelamento enquanto houver pendência (<code>pendingActions</code>). Concluídas as pendências, a tarefa agendada do ERP efetiva o cancelamento.</li>\n</ul>\n</li>\n<li>A multa segue as mesmas regras da simulação (tabela \"Quando <code>fineAmount</code> é aceito\" em <strong>Simular Cancelamento de Contrato</strong>). Com regra, a multa é apurada na data da solicitação quando cobrada antes do cancelamento, e na data da efetivação quando cobrada depois.</li>\n<li>A justificativa é gravada no evento e no motivo de cancelamento com o sufixo <code>[Cancelamento via API — solicitante: {requesterIdentification} — usuário: {login}]</code>, inclusive quando a efetivação é feita pela tarefa agendada.</li>\n<li>Revalidação: uma nova chamada sobre contrato Em Cancelamento verifica as pendências.<ul>\n<li>Sem pendência, o cancelamento é efetivado (<code>outcome: canceled</code>, <code>revalidation: true</code>).</li>\n<li>Com pendência, o contrato continua Em Cancelamento (<code>outcome: onCancellation</code>, <code>revalidation: true</code>). A pendência vem na mensagem <code>Warn</code>, e <code>pendingActions</code> e <code>fineAmount</code> voltam vazios, porque a multa já foi apurada na solicitação original.</li>\n<li><code>exemptFine</code> e <code>signers</code> são ignorados.</li>\n<li>A revalidação nunca gera multa, cobrança, NF, termo ou retirada novos.</li>\n</ul>\n</li>\n<li>Reenvio de contrato já cancelado é recusado com <code>CONTRATO_JA_CANCELADO</code>.</li>\n<li>Contratos em cenário de rede neutra não são atendidos pela API.</li>\n<li>Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.</li>\n<li>Não confundir com <strong>Suspender Contrato</strong>, que suspende o contrato sem cancelá-lo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</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>contractId</code></td>\n<td>Path</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>eventTypeCode</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\"</td>\n</tr>\n<tr>\n<td><code>justify</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Justificativa do cancelamento</td>\n</tr>\n<tr>\n<td><code>requesterIdentification</code></td>\n<td>Body</td>\n<td>string</td>\n<td>Sim</td>\n<td>Nome, matrícula ou protocolo de quem atendeu o cliente</td>\n</tr>\n<tr>\n<td><code>exemptFine</code></td>\n<td>Body</td>\n<td>boolean</td>\n<td>Não (padrão <code>false</code>)</td>\n<td>Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento</td>\n</tr>\n<tr>\n<td><code>fineAmount</code></td>\n<td>Body</td>\n<td>decimal</td>\n<td>Não</td>\n<td>Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. <code>0</code> não gera cobrança</td>\n</tr>\n<tr>\n<td><code>signers[].personId</code></td>\n<td>Body</td>\n<td>long</td>\n<td>Sim, por item</td>\n<td>Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato</td>\n</tr>\n<tr>\n<td><code>signers[].contactIds</code></td>\n<td>Body</td>\n<td>long[]</td>\n<td>Não</td>\n<td>Contatos da pessoa que recebem o documento para assinatura</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o cancelamento foi efetivado ou iniciado</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array</td>\n<td>Lista de objetos <code>{ type, message, code }</code></td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Desfecho do cancelamento</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"quando-success-true\">Quando <code>success: true</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>contractId</code></td>\n<td>long</td>\n<td>Id do contrato</td>\n</tr>\n<tr>\n<td><code>contractNumber</code></td>\n<td>string</td>\n<td>Número do contrato</td>\n</tr>\n<tr>\n<td><code>outcome</code></td>\n<td>string</td>\n<td><code>canceled</code> (Cancelado) ou <code>onCancellation</code> (Em Cancelamento)</td>\n</tr>\n<tr>\n<td><code>revalidation</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a chamada revalidou um contrato que já estava Em Cancelamento</td>\n</tr>\n<tr>\n<td><code>fineAmount</code></td>\n<td>decimal</td>\n<td>Multa cobrada nesta solicitação. <code>0</code> na revalidação</td>\n</tr>\n<tr>\n<td><code>pendingActions[].type</code></td>\n<td>string</td>\n<td><code>fineSettlement</code>, <code>terminationTermSignature</code> ou <code>lostEquipment</code> (decodificação em <strong>Simular Cancelamento de Contrato</strong>)</td>\n</tr>\n<tr>\n<td><code>pendingActions[].description</code></td>\n<td>string</td>\n<td>Descrição da ação pendente</td>\n</tr>\n<tr>\n<td><code>receivableIds</code></td>\n<td>long[]</td>\n<td>Títulos a receber gerados (multa)</td>\n</tr>\n<tr>\n<td><code>removalSolicitationIds</code></td>\n<td>long[]</td>\n<td>Solicitações de retirada abertas</td>\n</tr>\n</tbody>\n</table>\n</div><p>As mensagens do ERP vêm em <code>messages</code>, com <code>type: Success</code> quando o contrato foi cancelado e <code>type: Warn</code> quando ficou Em Cancelamento; nesses casos <code>code</code> é <code>null</code>.</p>\n<h3 id=\"quando-success-false\">Quando <code>success: false</code></h3>\n<p><code>response</code> vem <code>null</code>; cada recusa vem em <code>messages[]</code>, com <code>type: Error</code> e o <code>code</code> correspondente. Várias recusas podem vir na mesma resposta.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th><code>code</code></th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Corpo ausente ou JSON inválido</td>\n<td><code>CORPO_INVALIDO</code></td>\n<td>\"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\"</td>\n</tr>\n<tr>\n<td>Contrato inexistente</td>\n<td><code>CONTRATO_NAO_ENCONTRADO</code></td>\n<td>\"Contrato não encontrado.\"</td>\n</tr>\n<tr>\n<td>Contrato já cancelado</td>\n<td><code>CONTRATO_JA_CANCELADO</code></td>\n<td>\"O contrato já está cancelado.\"</td>\n</tr>\n<tr>\n<td><code>requesterIdentification</code> vazio</td>\n<td><code>SOLICITANTE_AUSENTE</code></td>\n<td>\"Informe a identificação de quem atendeu o cliente.\"</td>\n</tr>\n<tr>\n<td>Tipo de evento inexistente ou inativo</td>\n<td><code>TIPO_EVENTO_NAO_ENCONTRADO</code></td>\n<td>\"Tipo de evento {code} não encontrado ou inativo.\"</td>\n</tr>\n<tr>\n<td>Tipo de evento com outro objetivo</td>\n<td><code>TIPO_EVENTO_INVALIDO</code></td>\n<td>\"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\"</td>\n</tr>\n<tr>\n<td><code>justify</code> vazio</td>\n<td><code>JUSTIFICATIVA_AUSENTE</code></td>\n<td>\"Informe a justificativa do cancelamento.\"</td>\n</tr>\n<tr>\n<td>Contrato em rede neutra</td>\n<td><code>REDE_NEUTRA_NAO_SUPORTADA</code></td>\n<td>\"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\"</td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com regra que já define a multa</td>\n<td><code>MULTA_PREVISTA_NO_TIPO</code></td>\n<td>\"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\"</td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com regra sem cobrança de multa</td>\n<td><code>MULTA_REGRA_SEM_COBRANCA</code></td>\n<td>\"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\"</td>\n</tr>\n<tr>\n<td><code>fineAmount</code> com termo ou extravio antes do cancelamento</td>\n<td><code>MULTA_TERMO_ANTERIOR</code></td>\n<td>\"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\"</td>\n</tr>\n<tr>\n<td><code>fineAmount</code> negativo</td>\n<td><code>MULTA_VALOR_INVALIDO</code></td>\n<td>\"O valor da multa não pode ser negativo.\"</td>\n</tr>\n<tr>\n<td><code>exemptFine: true</code> sem regra</td>\n<td><code>ISENCAO_SEM_REGRA</code></td>\n<td>\"O tipo de contrato não possui regra de cancelamento que permita isenção.\"</td>\n</tr>\n<tr>\n<td>Regra gera termo, mas não tem template de impressão</td>\n<td><code>TERMO_SEM_TEMPLATE</code></td>\n<td>\"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\"</td>\n</tr>\n<tr>\n<td>Recusa de regra de negócio do ERP</td>\n<td><code>REGRA_NEGOCIO</code></td>\n<td>Mensagem original do ERP</td>\n</tr>\n<tr>\n<td>Falha inesperada</td>\n<td><code>ERRO_INTERNO</code></td>\n<td>\"Não foi possível processar o cancelamento.\"</td>\n</tr>\n</tbody>\n</table>\n</div><p>Todas as recusas usam HTTP 200, com <code>success: false</code>.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>Antes: <strong>Simular Cancelamento de Contrato</strong>, para conferir a multa e o desfecho.</li>\n<li>Antes: <strong>Listar Tipos de Evento (por objetivo)</strong> com <code>objective=2</code>, para obter o <code>eventTypeCode</code>. O <code>contractId</code> pode ser obtido em <strong>Busca de contratos paginada</strong>.</li>\n<li>Depois, com <code>outcome: onCancellation</code>: concluídas as pendências, o ERP efetiva o cancelamento sozinho; uma nova chamada a este endpoint faz a verificação na hora.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel",":contractId"],"host":["{{URL}}"],"query":[],"variable":[{"type":"any","key":"contractId"}]}},"response":[{"id":"5405efc2-579c-7555-6c5a-71ab9bc7274a","name":"Sucesso — cancelamento efetivado","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCancela um contrato pelo mesmo caminho do cancelamento avulso da Tela de Atendimento. Conforme a regra de cancelamento do tipo de contrato, o cancelamento é efetivado na hora ou o contrato vai para Em Cancelamento até as pendências serem concluídas.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\".\n\n## Regras de negócio\n\n- Antes de qualquer alteração, são verificadas as mesmas condições da **Simular Cancelamento de Contrato**. Havendo recusa, nada é gravado e nenhum evento é gerado.\n- Desfecho:\n  - `canceled`: o contrato é cancelado na hora.\n  - `onCancellation`: o contrato fica Em Cancelamento enquanto houver pendência (`pendingActions`). Concluídas as pendências, a tarefa agendada do ERP efetiva o cancelamento.\n- A multa segue as mesmas regras da simulação (tabela \"Quando `fineAmount` é aceito\" em **Simular Cancelamento de Contrato**). Com regra, a multa é apurada na data da solicitação quando cobrada antes do cancelamento, e na data da efetivação quando cobrada depois.\n- A justificativa é gravada no evento e no motivo de cancelamento com o sufixo `[Cancelamento via API — solicitante: {requesterIdentification} — usuário: {login}]`, inclusive quando a efetivação é feita pela tarefa agendada.\n- Revalidação: uma nova chamada sobre contrato Em Cancelamento verifica as pendências.\n  - Sem pendência, o cancelamento é efetivado (`outcome: canceled`, `revalidation: true`).\n  - Com pendência, o contrato continua Em Cancelamento (`outcome: onCancellation`, `revalidation: true`). A pendência vem na mensagem `Warn`, e `pendingActions` e `fineAmount` voltam vazios, porque a multa já foi apurada na solicitação original.\n  - `exemptFine` e `signers` são ignorados.\n  - A revalidação nunca gera multa, cobrança, NF, termo ou retirada novos.\n- Reenvio de contrato já cancelado é recusado com `CONTRATO_JA_CANCELADO`.\n- Contratos em cenário de rede neutra não são atendidos pela API.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n- Não confundir com **Suspender Contrato**, que suspende o contrato sem cancelá-lo.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando o cancelamento foi efetivado ou iniciado |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Desfecho do cancelamento |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `outcome` | string | `canceled` (Cancelado) ou `onCancellation` (Em Cancelamento) |\n| `revalidation` | boolean | `true` quando a chamada revalidou um contrato que já estava Em Cancelamento |\n| `fineAmount` | decimal | Multa cobrada nesta solicitação. `0` na revalidação |\n| `pendingActions[].type` | string | `fineSettlement`, `terminationTermSignature` ou `lostEquipment` (decodificação em **Simular Cancelamento de Contrato**) |\n| `pendingActions[].description` | string | Descrição da ação pendente |\n| `receivableIds` | long[] | Títulos a receber gerados (multa) |\n| `removalSolicitationIds` | long[] | Solicitações de retirada abertas |\n\nAs mensagens do ERP vêm em `messages`, com `type: Success` quando o contrato foi cancelado e `type: Warn` quando ficou Em Cancelamento; nesses casos `code` é `null`.\n\n### Quando `success: false`\n\n`response` vem `null`; cada recusa vem em `messages[]`, com `type: Error` e o `code` correspondente. Várias recusas podem vir na mesma resposta.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem |\n| --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" |\n\nTodas as recusas usam HTTP 200, com `success: false`.\n\n## Fluxo relacionado\n\n- Antes: **Simular Cancelamento de Contrato**, para conferir a multa e o desfecho.\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois, com `outcome: onCancellation`: concluídas as pendências, o ERP efetiva o cancelamento sozinho; uma nova chamada a este endpoint faz a verificação na hora."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        { \"type\": \"Success\", \"code\": null, \"message\": \"Contrato Cancelado.\" }\n    ],\n    \"response\": {\n        \"contractId\": 4520,\n        \"contractNumber\": \"004520\",\n        \"outcome\": \"canceled\", // contrato cancelado na hora\n        \"revalidation\": false,\n        \"fineAmount\": 0,\n        \"pendingActions\": [],\n        \"receivableIds\": [],\n        \"removalSolicitationIds\": [1452233] // solicitação de retirada aberta para o equipamento em comodato\n    },\n    \"elapsedTime\": null\n}"},{"id":"7df40416-1fc9-8c2d-ab6b-87a268a7ef84","name":"Sucesso — em cancelamento","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCancela um contrato pelo mesmo caminho do cancelamento avulso da Tela de Atendimento. Conforme a regra de cancelamento do tipo de contrato, o cancelamento é efetivado na hora ou o contrato vai para Em Cancelamento até as pendências serem concluídas.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\".\n\n## Regras de negócio\n\n- Antes de qualquer alteração, são verificadas as mesmas condições da **Simular Cancelamento de Contrato**. Havendo recusa, nada é gravado e nenhum evento é gerado.\n- Desfecho:\n  - `canceled`: o contrato é cancelado na hora.\n  - `onCancellation`: o contrato fica Em Cancelamento enquanto houver pendência (`pendingActions`). Concluídas as pendências, a tarefa agendada do ERP efetiva o cancelamento.\n- A multa segue as mesmas regras da simulação (tabela \"Quando `fineAmount` é aceito\" em **Simular Cancelamento de Contrato**). Com regra, a multa é apurada na data da solicitação quando cobrada antes do cancelamento, e na data da efetivação quando cobrada depois.\n- A justificativa é gravada no evento e no motivo de cancelamento com o sufixo `[Cancelamento via API — solicitante: {requesterIdentification} — usuário: {login}]`, inclusive quando a efetivação é feita pela tarefa agendada.\n- Revalidação: uma nova chamada sobre contrato Em Cancelamento verifica as pendências.\n  - Sem pendência, o cancelamento é efetivado (`outcome: canceled`, `revalidation: true`).\n  - Com pendência, o contrato continua Em Cancelamento (`outcome: onCancellation`, `revalidation: true`). A pendência vem na mensagem `Warn`, e `pendingActions` e `fineAmount` voltam vazios, porque a multa já foi apurada na solicitação original.\n  - `exemptFine` e `signers` são ignorados.\n  - A revalidação nunca gera multa, cobrança, NF, termo ou retirada novos.\n- Reenvio de contrato já cancelado é recusado com `CONTRATO_JA_CANCELADO`.\n- Contratos em cenário de rede neutra não são atendidos pela API.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n- Não confundir com **Suspender Contrato**, que suspende o contrato sem cancelá-lo.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando o cancelamento foi efetivado ou iniciado |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Desfecho do cancelamento |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `outcome` | string | `canceled` (Cancelado) ou `onCancellation` (Em Cancelamento) |\n| `revalidation` | boolean | `true` quando a chamada revalidou um contrato que já estava Em Cancelamento |\n| `fineAmount` | decimal | Multa cobrada nesta solicitação. `0` na revalidação |\n| `pendingActions[].type` | string | `fineSettlement`, `terminationTermSignature` ou `lostEquipment` (decodificação em **Simular Cancelamento de Contrato**) |\n| `pendingActions[].description` | string | Descrição da ação pendente |\n| `receivableIds` | long[] | Títulos a receber gerados (multa) |\n| `removalSolicitationIds` | long[] | Solicitações de retirada abertas |\n\nAs mensagens do ERP vêm em `messages`, com `type: Success` quando o contrato foi cancelado e `type: Warn` quando ficou Em Cancelamento; nesses casos `code` é `null`.\n\n### Quando `success: false`\n\n`response` vem `null`; cada recusa vem em `messages[]`, com `type: Error` e o `code` correspondente. Várias recusas podem vir na mesma resposta.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem |\n| --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" |\n\nTodas as recusas usam HTTP 200, com `success: false`.\n\n## Fluxo relacionado\n\n- Antes: **Simular Cancelamento de Contrato**, para conferir a multa e o desfecho.\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois, com `outcome: onCancellation`: concluídas as pendências, o ERP efetiva o cancelamento sozinho; uma nova chamada a este endpoint faz a verificação na hora."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        { \"type\": \"Warn\", \"code\": null, \"message\": \"Contrato Em Cancelamento.\" }\n    ],\n    \"response\": {\n        \"contractId\": 4512,\n        \"contractNumber\": \"004512\",\n        \"outcome\": \"onCancellation\", // aguarda a liquidação da multa\n        \"revalidation\": false,\n        \"fineAmount\": 150.00,\n        \"pendingActions\": [\n            { \"type\": \"fineSettlement\", \"description\": \"Liquidação da multa de cancelamento\" }\n        ],\n        \"receivableIds\": [991234], // título da multa\n        \"removalSolicitationIds\": []\n    },\n    \"elapsedTime\": null\n}"},{"id":"0df41d2e-7ed7-827b-a6e8-5798db421be9","name":"Erro — recusa de validação","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCancela um contrato pelo mesmo caminho do cancelamento avulso da Tela de Atendimento. Conforme a regra de cancelamento do tipo de contrato, o cancelamento é efetivado na hora ou o contrato vai para Em Cancelamento até as pendências serem concluídas.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\".\n\n## Regras de negócio\n\n- Antes de qualquer alteração, são verificadas as mesmas condições da **Simular Cancelamento de Contrato**. Havendo recusa, nada é gravado e nenhum evento é gerado.\n- Desfecho:\n  - `canceled`: o contrato é cancelado na hora.\n  - `onCancellation`: o contrato fica Em Cancelamento enquanto houver pendência (`pendingActions`). Concluídas as pendências, a tarefa agendada do ERP efetiva o cancelamento.\n- A multa segue as mesmas regras da simulação (tabela \"Quando `fineAmount` é aceito\" em **Simular Cancelamento de Contrato**). Com regra, a multa é apurada na data da solicitação quando cobrada antes do cancelamento, e na data da efetivação quando cobrada depois.\n- A justificativa é gravada no evento e no motivo de cancelamento com o sufixo `[Cancelamento via API — solicitante: {requesterIdentification} — usuário: {login}]`, inclusive quando a efetivação é feita pela tarefa agendada.\n- Revalidação: uma nova chamada sobre contrato Em Cancelamento verifica as pendências.\n  - Sem pendência, o cancelamento é efetivado (`outcome: canceled`, `revalidation: true`).\n  - Com pendência, o contrato continua Em Cancelamento (`outcome: onCancellation`, `revalidation: true`). A pendência vem na mensagem `Warn`, e `pendingActions` e `fineAmount` voltam vazios, porque a multa já foi apurada na solicitação original.\n  - `exemptFine` e `signers` são ignorados.\n  - A revalidação nunca gera multa, cobrança, NF, termo ou retirada novos.\n- Reenvio de contrato já cancelado é recusado com `CONTRATO_JA_CANCELADO`.\n- Contratos em cenário de rede neutra não são atendidos pela API.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n- Não confundir com **Suspender Contrato**, que suspende o contrato sem cancelá-lo.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando o cancelamento foi efetivado ou iniciado |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Desfecho do cancelamento |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `outcome` | string | `canceled` (Cancelado) ou `onCancellation` (Em Cancelamento) |\n| `revalidation` | boolean | `true` quando a chamada revalidou um contrato que já estava Em Cancelamento |\n| `fineAmount` | decimal | Multa cobrada nesta solicitação. `0` na revalidação |\n| `pendingActions[].type` | string | `fineSettlement`, `terminationTermSignature` ou `lostEquipment` (decodificação em **Simular Cancelamento de Contrato**) |\n| `pendingActions[].description` | string | Descrição da ação pendente |\n| `receivableIds` | long[] | Títulos a receber gerados (multa) |\n| `removalSolicitationIds` | long[] | Solicitações de retirada abertas |\n\nAs mensagens do ERP vêm em `messages`, com `type: Success` quando o contrato foi cancelado e `type: Warn` quando ficou Em Cancelamento; nesses casos `code` é `null`.\n\n### Quando `success: false`\n\n`response` vem `null`; cada recusa vem em `messages[]`, com `type: Error` e o `code` correspondente. Várias recusas podem vir na mesma resposta.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem |\n| --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" |\n\nTodas as recusas usam HTTP 200, com `success: false`.\n\n## Fluxo relacionado\n\n- Antes: **Simular Cancelamento de Contrato**, para conferir a multa e o desfecho.\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois, com `outcome: onCancellation`: concluídas as pendências, o ERP efetiva o cancelamento sozinho; uma nova chamada a este endpoint faz a verificação na hora."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"code\": \"MULTA_PREVISTA_NO_TIPO\", \"message\": \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" },\n        { \"type\": \"Error\", \"code\": \"JUSTIFICATIVA_AUSENTE\", \"message\": \"Informe a justificativa do cancelamento.\" }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"85e1b1a0-6d2d-bcd2-ad5e-c75a0a6a2e55","name":"Erro — contrato já cancelado","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"eventTypeCode\": \"CANC-API\",\n    \"justify\": \"Cliente solicitou o cancelamento pelo aplicativo.\",\n    \"requesterIdentification\": \"Ana Souza - matrícula 4471\",\n    \"exemptFine\": false,\n    \"fineAmount\": null,\n    \"signers\": [\n        { \"personId\": 88231, \"contactIds\": [5521] }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/Contract/Cancel/:contractId","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","Contract","Cancel",":contractId"],"variable":[{"key":"contractId"}]},"description":"## Propósito\n\nCancela um contrato pelo mesmo caminho do cancelamento avulso da Tela de Atendimento. Conforme a regra de cancelamento do tipo de contrato, o cancelamento é efetivado na hora ou o contrato vai para Em Cancelamento até as pendências serem concluídas.\n\n## Pré-requisitos\n\n- Token de acesso obtido no endpoint de autenticação, enviado no header `Authorization: Bearer {{access_token}}`.\n- Tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\". Use **Listar Tipos de Evento (por objetivo)** com `objective=2` para descobrir os códigos válidos.\n- Opcional: regra de cancelamento vinculada ao tipo de contrato, com uso \"Cancelamento Avulso\".\n\n## Regras de negócio\n\n- Antes de qualquer alteração, são verificadas as mesmas condições da **Simular Cancelamento de Contrato**. Havendo recusa, nada é gravado e nenhum evento é gerado.\n- Desfecho:\n  - `canceled`: o contrato é cancelado na hora.\n  - `onCancellation`: o contrato fica Em Cancelamento enquanto houver pendência (`pendingActions`). Concluídas as pendências, a tarefa agendada do ERP efetiva o cancelamento.\n- A multa segue as mesmas regras da simulação (tabela \"Quando `fineAmount` é aceito\" em **Simular Cancelamento de Contrato**). Com regra, a multa é apurada na data da solicitação quando cobrada antes do cancelamento, e na data da efetivação quando cobrada depois.\n- A justificativa é gravada no evento e no motivo de cancelamento com o sufixo `[Cancelamento via API — solicitante: {requesterIdentification} — usuário: {login}]`, inclusive quando a efetivação é feita pela tarefa agendada.\n- Revalidação: uma nova chamada sobre contrato Em Cancelamento verifica as pendências.\n  - Sem pendência, o cancelamento é efetivado (`outcome: canceled`, `revalidation: true`).\n  - Com pendência, o contrato continua Em Cancelamento (`outcome: onCancellation`, `revalidation: true`). A pendência vem na mensagem `Warn`, e `pendingActions` e `fineAmount` voltam vazios, porque a multa já foi apurada na solicitação original.\n  - `exemptFine` e `signers` são ignorados.\n  - A revalidação nunca gera multa, cobrança, NF, termo ou retirada novos.\n- Reenvio de contrato já cancelado é recusado com `CONTRATO_JA_CANCELADO`.\n- Contratos em cenário de rede neutra não são atendidos pela API.\n- Configurações de perfil ou equipe do usuário (permissão para cancelar contrato, para informar multa ou para isentar) não são consideradas.\n- Não confundir com **Suspender Contrato**, que suspende o contrato sem cancelá-lo.\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Local | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- | --- |\n| `contractId` | Path | long | Sim | Id do contrato |\n| `eventTypeCode` | Body | string | Sim | Código de um tipo de evento ativo com objetivo \"Cancelar/Encerrar Contratos\" |\n| `justify` | Body | string | Sim | Justificativa do cancelamento |\n| `requesterIdentification` | Body | string | Sim | Nome, matrícula ou protocolo de quem atendeu o cliente |\n| `exemptFine` | Body | boolean | Não (padrão `false`) | Isenta a multa da regra. Só é aceito quando o tipo de contrato tem regra de cancelamento |\n| `fineAmount` | Body | decimal | Não | Multa informada pela integração. Só é aceita quando o tipo de contrato não tem regra que defina a multa. `0` não gera cobrança |\n| `signers[].personId` | Body | long | Sim, por item | Pessoa que assina o termo de rescisão, na ordem de assinatura. Sem a lista, o termo vai para o titular do contrato |\n| `signers[].contactIds` | Body | long[] | Não | Contatos da pessoa que recebem o documento para assinatura |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando o cancelamento foi efetivado ou iniciado |\n| `messages` | array | Lista de objetos `{ type, message, code }` |\n| `response` | object\\|null | Desfecho do cancelamento |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `contractId` | long | Id do contrato |\n| `contractNumber` | string | Número do contrato |\n| `outcome` | string | `canceled` (Cancelado) ou `onCancellation` (Em Cancelamento) |\n| `revalidation` | boolean | `true` quando a chamada revalidou um contrato que já estava Em Cancelamento |\n| `fineAmount` | decimal | Multa cobrada nesta solicitação. `0` na revalidação |\n| `pendingActions[].type` | string | `fineSettlement`, `terminationTermSignature` ou `lostEquipment` (decodificação em **Simular Cancelamento de Contrato**) |\n| `pendingActions[].description` | string | Descrição da ação pendente |\n| `receivableIds` | long[] | Títulos a receber gerados (multa) |\n| `removalSolicitationIds` | long[] | Solicitações de retirada abertas |\n\nAs mensagens do ERP vêm em `messages`, com `type: Success` quando o contrato foi cancelado e `type: Warn` quando ficou Em Cancelamento; nesses casos `code` é `null`.\n\n### Quando `success: false`\n\n`response` vem `null`; cada recusa vem em `messages[]`, com `type: Error` e o `code` correspondente. Várias recusas podem vir na mesma resposta.\n\n## Erros comuns\n\n| Situação | `code` | Mensagem |\n| --- | --- | --- |\n| Corpo ausente ou JSON inválido | `CORPO_INVALIDO` | \"Corpo da requisição ausente ou inválido. Envie JSON com Content-Type: application/json.\" |\n| Contrato inexistente | `CONTRATO_NAO_ENCONTRADO` | \"Contrato não encontrado.\" |\n| Contrato já cancelado | `CONTRATO_JA_CANCELADO` | \"O contrato já está cancelado.\" |\n| `requesterIdentification` vazio | `SOLICITANTE_AUSENTE` | \"Informe a identificação de quem atendeu o cliente.\" |\n| Tipo de evento inexistente ou inativo | `TIPO_EVENTO_NAO_ENCONTRADO` | \"Tipo de evento {code} não encontrado ou inativo.\" |\n| Tipo de evento com outro objetivo | `TIPO_EVENTO_INVALIDO` | \"O tipo de evento {code} não tem o objetivo Cancelar/Encerrar Contratos.\" |\n| `justify` vazio | `JUSTIFICATIVA_AUSENTE` | \"Informe a justificativa do cancelamento.\" |\n| Contrato em rede neutra | `REDE_NEUTRA_NAO_SUPORTADA` | \"Contrato em cenário de rede neutra não pode ser cancelado pela API. Utilize a Tela de Atendimento.\" |\n| `fineAmount` com regra que já define a multa | `MULTA_PREVISTA_NO_TIPO` | \"O tipo de contrato já prevê multa de cancelamento. Não informe fineAmount.\" |\n| `fineAmount` com regra sem cobrança de multa | `MULTA_REGRA_SEM_COBRANCA` | \"A regra de cancelamento do tipo de contrato não cobra multa. Não informe fineAmount.\" |\n| `fineAmount` com termo ou extravio antes do cancelamento | `MULTA_TERMO_ANTERIOR` | \"A regra de cancelamento tem ações anteriores ao cancelamento (termo de rescisão ou extravio). Não informe fineAmount.\" |\n| `fineAmount` negativo | `MULTA_VALOR_INVALIDO` | \"O valor da multa não pode ser negativo.\" |\n| `exemptFine: true` sem regra | `ISENCAO_SEM_REGRA` | \"O tipo de contrato não possui regra de cancelamento que permita isenção.\" |\n| Regra gera termo, mas não tem template de impressão | `TERMO_SEM_TEMPLATE` | \"A regra de cancelamento gera termo de rescisão, mas não possui template de impressão.\" |\n| Recusa de regra de negócio do ERP | `REGRA_NEGOCIO` | Mensagem original do ERP |\n| Falha inesperada | `ERRO_INTERNO` | \"Não foi possível processar o cancelamento.\" |\n\nTodas as recusas usam HTTP 200, com `success: false`.\n\n## Fluxo relacionado\n\n- Antes: **Simular Cancelamento de Contrato**, para conferir a multa e o desfecho.\n- Antes: **Listar Tipos de Evento (por objetivo)** com `objective=2`, para obter o `eventTypeCode`. O `contractId` pode ser obtido em **Busca de contratos paginada**.\n- Depois, com `outcome: onCancellation`: concluídas as pendências, o ERP efetiva o cancelamento sozinho; uma nova chamada a este endpoint faz a verificação na hora."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"code\": \"CONTRATO_JA_CANCELADO\", \"message\": \"O contrato já está cancelado.\" }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"0cad77bd-672c-e7e2-8683-c6e30b8840ea"}],"id":"8d061160-adfa-479f-8b76-386ca11fa429","_postman_id":"8d061160-adfa-479f-8b76-386ca11fa429","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Financeiro","item":[{"name":"Busca faturas em aberto por CPF/CNPJ","id":"91737ea8-0073-45d2-b169-a5e730d64681","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/getopentitlesbytxid/{{txId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os títulos (faturas) em aberto — sem nenhum recebimento registrado — do cliente identificado pelo CPF/CNPJ, para cobrança recorrente por Boleto ou Carnê.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>), obtido no método de autenticação.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Considera-se \"em aberto\" um título cujo saldo (<code>Balance</code>) é igual ao valor total da fatura — ou seja, sem nenhum recebimento parcial registrado — e que esteja marcado como recebível.</li>\n<li>Diferente de \"Busca faturas em aberto por contrato\", este método <strong>não aplica nenhum filtro por data de vencimento</strong>: retorna todos os títulos em aberto, estejam eles vencidos, a vencer ou com vencimento futuro distante.</li>\n<li>Mesmas regras de elegibilidade de tipo de cobrança de \"Busca todas as faturas de um cliente por CPF/CNPJ\" (Boleto com tipo de emissão 1, 2 ou 3, ou Carnê; não perdidos; não finalizados).</li>\n<li>Se o CPF/CNPJ não corresponder a nenhum cliente cadastrado, ou se o cliente não tiver nenhum título em aberto, a chamada não falha com erro HTTP — ver \"Erros comuns\".</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>txId</td>\n<td>Path (<code>/getopentitlesbytxid/{txId}</code>)</td>\n<td>Sim</td>\n<td>CPF ou CNPJ do cliente, sem máscara</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi processada sem erros</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>integer</td>\n<td>ID do título, usado em outras chamadas (ex.: \"Busca PDF da uma fatura\", \"Busca LINK da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\")</td>\n</tr>\n<tr>\n<td><code>response[].billet</code></td>\n<td>object</td>\n<td>Dados do título, incluindo <code>status</code> (<code>Em aberto</code>, <code>Paga</code>, <code>Cancelada</code> ou <code>Vencida</code>) e <code>receipts</code> com o total já recebido — tipicamente zerado, já que o filtro exige saldo integral em aberto</td>\n</tr>\n<tr>\n<td><code>response[].client</code></td>\n<td>object</td>\n<td>Dados do cliente</td>\n</tr>\n<tr>\n<td><code>response[].companyPlace</code></td>\n<td>object</td>\n<td>Dados da unidade/empresa</td>\n</tr>\n<tr>\n<td><code>response[].bank</code></td>\n<td>object</td>\n<td>Dados bancários do título</td>\n</tr>\n<tr>\n<td><code>response[].collectionType</code></td>\n<td>object</td>\n<td>Dados do tipo de cobrança</td>\n</tr>\n</tbody>\n</table>\n</div><p>Ver exemplo \"Sucesso\" para os campos completos de cada objeto (comentados inline).</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CPF/CNPJ não corresponde a nenhum cliente cadastrado</td>\n<td>200</td>\n<td>false</td>\n<td>\"Registro não encontrado.\"</td>\n</tr>\n<tr>\n<td>Cliente existe mas não possui título em aberto</td>\n<td>200</td>\n<td>true</td>\n<td><code>response: []</code>, mensagem informativa \"Cliente não possui títulos em aberto.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca todas as faturas de um cliente por CPF/CNPJ\" — mesma base de dados, sem o filtro de saldo em aberto.</li>\n<li>\"Busca PDF da uma fatura\" / \"Busca LINK da uma fatura\" / \"Gera PIX para pagamento\" / \"Realiza a liquidação de uma fatura\" — usam o <code>id</code> do título retornado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getopentitlesbytxid","{{txId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"1c8cf302-8d64-4fa1-8688-4f08bcb17336","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getopentitlesbytxid/000000000000000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 123456,\n            \"billet\": {\n                \"bankTitleNumber\": null,\n                \"barcode\": null,\n                \"typefulLine\": \"00000.00000 00000.000000 00000.00000 0 000000000000\",\n                \"pixQRCode\":\"0123456br.gov.bcb.pix2563qrcodepix.bb.com.br/pix/v2/799be0ed-xxxx-xxxx-9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7VOALLE TECHNOLOGY6011SANTA MARIAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDFE\",\n                \"title\": \"FAT000000000000000\",\n                \"issueDate\": \"2018-07-30\",\n                \"expirationDate\": \"2018-08-20\",\n                \"processingDate\": \"2021-07-07\",\n                \"status\":\"Em aberto\", // Possiveis retornos: Em aberto, Paga, Cancelada, Vencida\n                \"amount\": {\n                    \"value\": 0.00,\n                    \"finalValue\": 0.00,\n                    \"discount\": 0.00,\n                    \"fine\": 0.00,\n                    \"interest\": 0.00,\n                    \"originalValue\":0.00\n                },\n                 \"receipts\": {\n                    \"ammount\": 0.00, // total recebido - tipicamente 0, pois este endpoint só retorna títulos sem nenhum recebimento parcial\n                    \"discount\": 0.00,\n                    \"fine\": 0.00,\n                    \"interest\": 0.00,\n                    \"receiptDate\": null\n                }\n            },\n            \"client\": {\n                \"txId\": \"0000000000000\",\n                \"name\": \"xxxxxxxxx xxxxxxxxxxx xxxxxx\",\n                \"address\": {\n                    \"street\": \"xxxxx xxxxxxxxxxxx\",\n                    \"number\": \"1234\",\n                    \"codeCityId\": 123456,\n                    \"city\": \"xxxxxx\",\n                    \"state\": \"Rxx\",\n                    \"postalCode\": \"0000-000\",\n                    \"addressComplement\": \"\"\n                }\n            },\n            \"companyPlace\": {\n                \"txId\": \"123456\",\n                \"name\": \"xxxx\",\n                \"address\": {\n                    \"street\": \"xxx xxxxxx xxxxx\",\n                    \"number\": \"123456\",\n                    \"codeCityId\": 123456,\n                    \"city\": \"xxxxxxxxx\",\n                    \"state\": \"xx\",\n                    \"postalCode\": \"00000-000\",\n                    \"addressComplement\": \"\"\n                }\n            },\n            \"bank\": {\n                \"code\": \"001\",\n                \"name\": \"Banco do Brasil S.A.\",\n                \"agency\": {\n                    \"number\": \"0000\",\n                    \"digit\": \"0\"\n                },\n                \"account\": {\n                    \"number\": \"000000\",\n                    \"digit\": \"0\"\n                },\n                \"bankUse\": \"\"\n            },\n            \"collectionType\": {\n                \"specieTitle\": \"DMI\",\n                \"loanPortfolio\": \"17\",\n                \"quantity\": \"\",\n                \"accept\": \"N\"\n            }\n        }\n    ],\n    \"dataResponseType\": \"List<Int64>\",\n    \"elapsedTime\": null\n}"},{"id":"f5cdd1be-9b7c-4292-ac29-4e8ef694986f","name":"Erro — Cliente não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/getopentitlesbytxid/{{txId}}","description":"## Propósito\nRetorna os títulos (faturas) em aberto — sem nenhum recebimento registrado — do cliente identificado pelo CPF/CNPJ, para cobrança recorrente por Boleto ou Carnê.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), obtido no método de autenticação.\n\n## Regras de negócio\n- Considera-se \"em aberto\" um título cujo saldo (`Balance`) é igual ao valor total da fatura — ou seja, sem nenhum recebimento parcial registrado — e que esteja marcado como recebível.\n- Diferente de \"Busca faturas em aberto por contrato\", este método **não aplica nenhum filtro por data de vencimento**: retorna todos os títulos em aberto, estejam eles vencidos, a vencer ou com vencimento futuro distante.\n- Mesmas regras de elegibilidade de tipo de cobrança de \"Busca todas as faturas de um cliente por CPF/CNPJ\" (Boleto com tipo de emissão 1, 2 ou 3, ou Carnê; não perdidos; não finalizados).\n- Se o CPF/CNPJ não corresponder a nenhum cliente cadastrado, ou se o cliente não tiver nenhum título em aberto, a chamada não falha com erro HTTP — ver \"Erros comuns\".\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| txId | Path (`/getopentitlesbytxid/{txId}`) | Sim | CPF ou CNPJ do cliente, sem máscara |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a consulta foi processada sem erros |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | integer | ID do título, usado em outras chamadas (ex.: \"Busca PDF da uma fatura\", \"Busca LINK da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\") |\n| `response[].billet` | object | Dados do título, incluindo `status` (`Em aberto`, `Paga`, `Cancelada` ou `Vencida`) e `receipts` com o total já recebido — tipicamente zerado, já que o filtro exige saldo integral em aberto |\n| `response[].client` | object | Dados do cliente |\n| `response[].companyPlace` | object | Dados da unidade/empresa |\n| `response[].bank` | object | Dados bancários do título |\n| `response[].collectionType` | object | Dados do tipo de cobrança |\n\nVer exemplo \"Sucesso\" para os campos completos de cada objeto (comentados inline).\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| CPF/CNPJ não corresponde a nenhum cliente cadastrado | 200 | false | \"Registro não encontrado.\" |\n| Cliente existe mas não possui título em aberto | 200 | true | `response: []`, mensagem informativa \"Cliente não possui títulos em aberto.\" |\n\n## Fluxo relacionado\n- \"Busca todas as faturas de um cliente por CPF/CNPJ\" — mesma base de dados, sem o filtro de saldo em aberto.\n- \"Busca PDF da uma fatura\" / \"Busca LINK da uma fatura\" / \"Gera PIX para pagamento\" / \"Realiza a liquidação de uma fatura\" — usam o `id` do título retornado aqui."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Registro não encontrado.\",\n            \"code\": 404,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"91737ea8-0073-45d2-b169-a5e730d64681"},{"name":"Busca todas as faturas de um cliente por CPF/CNPJ","id":"f8233593-0a9a-40d6-8d7a-8c04ce847b79","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/gettitlesbytxid/{{txId}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna todos os títulos (faturas) de cobrança recorrente (Boleto ou Carnê) vinculados ao cliente identificado pelo CPF/CNPJ, incluindo faturas já recebidas (total ou parcialmente), desde que ainda não finalizadas no ERP. Para retornar apenas os títulos ainda em aberto, use \"Busca faturas em aberto por CPF/CNPJ\".</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>), obtido no método de autenticação.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>São retornados apenas títulos definitivos com tipo de cobrança por Boleto (com tipo de emissão 1, 2 ou 3) ou Carnê.</li>\n<li>Títulos baixados por perda ou já finalizados no ERP não são retornados.</li>\n<li>Diferente da versão \"em aberto\", este método não filtra por saldo: também retorna títulos já quitados (parcial ou totalmente), desde que ainda não finalizados.</li>\n<li>Cada título retorna também os recebimentos (<code>receipts</code>) já registrados contra ele, quando existirem.</li>\n<li>Se o CPF/CNPJ não corresponder a nenhum cliente cadastrado, ou se o cliente não tiver nenhum título elegível, a chamada não falha com erro HTTP — ver \"Erros comuns\".</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>txId</td>\n<td>Path (<code>/gettitlesbytxid/{txId}</code>)</td>\n<td>Sim</td>\n<td>CPF ou CNPJ do cliente, sem máscara</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi processada sem erros</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>integer</td>\n<td>ID do título, usado em outras chamadas (\"Busca PDF da uma fatura\", \"Busca LINK da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\")</td>\n</tr>\n<tr>\n<td><code>response[].billet</code></td>\n<td>object</td>\n<td>Dados do título, incluindo <code>status</code> (<code>Em aberto</code>, <code>Paga</code>, <code>Cancelada</code> ou <code>Vencida</code>) e <code>receipts</code> com o total já recebido</td>\n</tr>\n<tr>\n<td><code>response[].client</code></td>\n<td>object</td>\n<td>Dados do cliente</td>\n</tr>\n<tr>\n<td><code>response[].companyPlace</code></td>\n<td>object</td>\n<td>Dados da unidade/empresa</td>\n</tr>\n<tr>\n<td><code>response[].bank</code></td>\n<td>object</td>\n<td>Dados bancários do título</td>\n</tr>\n<tr>\n<td><code>response[].collectionType</code></td>\n<td>object</td>\n<td>Dados do tipo de cobrança</td>\n</tr>\n</tbody>\n</table>\n</div><p>Ver exemplo \"Sucesso\" para os campos completos de cada objeto (comentados inline).</p>\n<p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>CPF/CNPJ não corresponde a nenhum cliente cadastrado</td>\n<td>200</td>\n<td>false</td>\n<td>\"Registro não encontrado.\"</td>\n</tr>\n<tr>\n<td>Cliente existe mas não possui título elegível</td>\n<td>200</td>\n<td>true</td>\n<td><code>response: []</code>, mensagem informativa \"Cliente não possui títulos em aberto.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" — mesma base de dados, filtrada apenas para títulos com saldo integral em aberto.</li>\n<li>\"Busca PDF da uma fatura\" / \"Busca LINK da uma fatura\" — usam o <code>id</code> do título retornado aqui.</li>\n<li>\"Gera PIX para pagamento\" e \"Realiza a liquidação de uma fatura\" — usam o <code>id</code> do título para operações de cobrança.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","gettitlesbytxid","{{txId}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"f59a15ea-2a80-4d0c-844a-5b33446d46d9","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/gettitlesbytxid/000000000000000"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 123456,\n            \"billet\": {\n                \"bankTitleNumber\": null,\n                \"barcode\": null,\n                \"typefulLine\": \"00000.00000 00000.000000 00000.00000 0 000000000000\",\n                \"pixQRCode\":\"0123456br.gov.bcb.pix2563qrcodepix.bb.com.br/pix/v2/799be0ed-xxxx-xxxx-9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7VOALLE TECHNOLOGY6011SANTA MARIAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDFE\",\n                \"title\": \"FAT000000000000000\",\n                \"issueDate\": \"2018-07-30\",\n                \"expirationDate\": \"2018-08-20\",\n                \"processingDate\": \"2021-07-07\",\n                \"status\":\"Em aberto\", // Possiveis retornos: Em aberto, Paga, Cancelada, Vencida\n                \"amount\": {\n                    \"value\": 0.00,\n                    \"finalValue\": 0.00,\n                    \"discount\": 0.00,\n                    \"fine\": 0.00,\n                    \"interest\": 0.00,\n                    \"originalValue\":0.00\n                },\n                 \"receipts\": {\n                    \"ammount\": 0.00, // total recebido\n                    \"discount\": 0.00, // desconto registrado para este recebimento\n                    \"fine\": 0.00, // multa registrada no recebimento\n                    \"interest\": 0.00, // juros registrado do recebimento \n                    \"receiptDate\": \"2026-07-07\" // Data do recebimento\n                }\n            },\n            \"client\": {\n                \"txId\": \"0000000000000\",\n                \"name\": \"xxxxxxxxx xxxxxxxxxxx xxxxxx\",\n                \"address\": {\n                    \"street\": \"xxxxx xxxxxxxxxxxx\",\n                    \"number\": \"1234\",\n                    \"codeCityId\": 123456,\n                    \"city\": \"xxxxxx\",\n                    \"state\": \"Rxx\",\n                    \"postalCode\": \"0000-000\",\n                    \"addressComplement\": \"\"\n                }\n            },\n            \"companyPlace\": {\n                \"txId\": \"123456\",\n                \"name\": \"xxxx\",\n                \"address\": {\n                    \"street\": \"xxx xxxxxx xxxxx\",\n                    \"number\": \"123456\",\n                    \"codeCityId\": 123456,\n                    \"city\": \"xxxxxxxxx\",\n                    \"state\": \"xx\",\n                    \"postalCode\": \"00000-000\",\n                    \"addressComplement\": \"\"\n                }\n            },\n            \"bank\": {\n                \"code\": \"001\",\n                \"name\": \"Banco do Brasil S.A.\",\n                \"agency\": {\n                    \"number\": \"0000\",\n                    \"digit\": \"0\"\n                },\n                \"account\": {\n                    \"number\": \"000000\",\n                    \"digit\": \"0\"\n                },\n                \"bankUse\": \"\"\n            },\n            \"collectionType\": {\n                \"specieTitle\": \"DMI\",\n                \"loanPortfolio\": \"17\",\n                \"quantity\": \"\",\n                \"accept\": \"N\"\n            }\n        }\n    ],\n    \"dataResponseType\": \"List<Int64>\",\n    \"elapsedTime\": null\n}"},{"id":"2df03fba-a632-4997-bedf-d80f7963923f","name":"Erro — Cliente não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","type":"text"}],"body":{"mode":"raw","raw":"","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/gettitlesbytxid/{{txId}}","description":"## Propósito\nRetorna todos os títulos (faturas) de cobrança recorrente (Boleto ou Carnê) vinculados ao cliente identificado pelo CPF/CNPJ, incluindo faturas já recebidas (total ou parcialmente), desde que ainda não finalizadas no ERP. Para retornar apenas os títulos ainda em aberto, use \"Busca faturas em aberto por CPF/CNPJ\".\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), obtido no método de autenticação.\n\n## Regras de negócio\n- São retornados apenas títulos definitivos com tipo de cobrança por Boleto (com tipo de emissão 1, 2 ou 3) ou Carnê.\n- Títulos baixados por perda ou já finalizados no ERP não são retornados.\n- Diferente da versão \"em aberto\", este método não filtra por saldo: também retorna títulos já quitados (parcial ou totalmente), desde que ainda não finalizados.\n- Cada título retorna também os recebimentos (`receipts`) já registrados contra ele, quando existirem.\n- Se o CPF/CNPJ não corresponder a nenhum cliente cadastrado, ou se o cliente não tiver nenhum título elegível, a chamada não falha com erro HTTP — ver \"Erros comuns\".\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| txId | Path (`/gettitlesbytxid/{txId}`) | Sim | CPF ou CNPJ do cliente, sem máscara |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a consulta foi processada sem erros |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | integer | ID do título, usado em outras chamadas (\"Busca PDF da uma fatura\", \"Busca LINK da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\") |\n| `response[].billet` | object | Dados do título, incluindo `status` (`Em aberto`, `Paga`, `Cancelada` ou `Vencida`) e `receipts` com o total já recebido |\n| `response[].client` | object | Dados do cliente |\n| `response[].companyPlace` | object | Dados da unidade/empresa |\n| `response[].bank` | object | Dados bancários do título |\n| `response[].collectionType` | object | Dados do tipo de cobrança |\n\nVer exemplo \"Sucesso\" para os campos completos de cada objeto (comentados inline).\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| CPF/CNPJ não corresponde a nenhum cliente cadastrado | 200 | false | \"Registro não encontrado.\" |\n| Cliente existe mas não possui título elegível | 200 | true | `response: []`, mensagem informativa \"Cliente não possui títulos em aberto.\" |\n\n## Fluxo relacionado\n- \"Busca faturas em aberto por CPF/CNPJ\" — mesma base de dados, filtrada apenas para títulos com saldo integral em aberto.\n- \"Busca PDF da uma fatura\" / \"Busca LINK da uma fatura\" — usam o `id` do título retornado aqui.\n- \"Gera PIX para pagamento\" e \"Realiza a liquidação de uma fatura\" — usam o `id` do título para operações de cobrança."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Registro não encontrado.\",\n            \"code\": 404,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"f8233593-0a9a-40d6-8d7a-8c04ce847b79"},{"name":"Busca faturas em aberto por contrato","id":"0e46d084-4cb4-47af-9e65-8321beb1350b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"<p>Obtido no método de autenticação</p>\n"}],"body":{"mode":"raw","raw":""},"url":"{{URL}}:45715/external/integrations/thirdparty/getcontractbillets/{{contractId}}?filterByPaymentDisponibility=false","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os boletos em aberto de um contrato, priorizando os já vencidos e, na ausência destes, os com vencimento até o próximo mês.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>), obtido no método de autenticação.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>São listadas faturas em aberto e em atraso ou, na ausência de faturas atrasadas, com vencimento até o próximo mês da consulta: o método primeiro busca títulos com vencimento <strong>anterior a hoje</strong>; só se não encontrar nenhum é que amplia a busca para títulos com vencimento <strong>até o fim do próximo mês</strong>.</li>\n<li>Só são considerados títulos definitivos, com tipo de cobrança por Boleto (com tipo de emissão 1, 2 ou 3), com saldo a receber, número do título (NN) gerado, não perdidos, não finalizados e não renegociados.</li>\n<li>Quando <code>filterByPaymentDisponibility=true</code>, o resultado é restrito apenas aos títulos já liberados para pagamento no Portal do cliente, conforme a configuração de disponibilidade de pagamento da empresa (mesma regra usada para liberar o boleto para os clientes finais).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>contractid</td>\n<td>Path (<code>/getcontractbillets/{contractid}</code>)</td>\n<td>Sim</td>\n<td>ID do contrato</td>\n</tr>\n<tr>\n<td>filterByPaymentDisponibility</td>\n<td>Query</td>\n<td>Sim</td>\n<td><code>true</code>/<code>false</code> — se <code>true</code>, restringe o resultado aos títulos já disponíveis para pagamento no Portal do cliente</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a consulta foi processada sem erros</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>array|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response[].id</code></td>\n<td>integer</td>\n<td>ID do título, usado em outras chamadas (\"Busca PDF da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\")</td>\n</tr>\n<tr>\n<td><code>response[].title</code></td>\n<td>string</td>\n<td>Identificação/número da fatura</td>\n</tr>\n<tr>\n<td><code>response[].expirationDate</code></td>\n<td>string (date)</td>\n<td>Data de vencimento do título</td>\n</tr>\n<tr>\n<td><code>response[].parcel</code></td>\n<td>integer</td>\n<td>Número da parcela</td>\n</tr>\n<tr>\n<td><code>response[].typefulLine</code></td>\n<td>string</td>\n<td>Linha digitável do boleto</td>\n</tr>\n<tr>\n<td><code>response[].link</code></td>\n<td>string</td>\n<td>Link público do boleto, mesmo mecanismo de \"Busca LINK da uma fatura\"</td>\n</tr>\n<tr>\n<td><code>response[].pixQRCode</code></td>\n<td>string</td>\n<td>Payload do QR Code Pix (pode vir vazio)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Nenhum título em aberto localizado para o contrato (nem vencido, nem a vencer até o próximo mês)</td>\n<td>200</td>\n<td>false</td>\n<td>\"Títulos não localizados\"</td>\n</tr>\n<tr>\n<td>Empresa sem URL de portal do cliente configurada</td>\n<td>200</td>\n<td>false</td>\n<td>\"Não foi possível localizar os dados de acesso ao Portal\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" — mesma finalidade, filtrando por cliente em vez de contrato.</li>\n<li>\"Busca PDF da uma fatura\" / \"Gera PIX para pagamento\" / \"Realiza a liquidação de uma fatura\" — usam o <code>id</code> do título retornado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","getcontractbillets","{{contractId}}"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obrigatório. Se true, restringe o resultado aos títulos já disponíveis para pagamento no Portal do cliente, conforme a configuração de disponibilidade de pagamento da empresa.</p>\n","type":"text/plain"},"key":"filterByPaymentDisponibility","value":"false"}],"variable":[]}},"response":[{"id":"03276fb8-1532-45a2-bfb4-8f3e2fbd5f04","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/getcontractbillets/123"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":null,"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": [\n        {\n            \"id\": 123123,\n            \"title\": \"FAT123456789\",\n            \"expirationDate\": \"2021-05-30T00:00:00\",\n            \"parcel\": 1,\n            \"typefulLine\": \"00000.00000 00000.000000 00000.000000 0 00000000000000\",\n            \"link\": \"https://d03.synsuite.com.br/financial_receivable_titles/boletos/a1b2c3d4e5\",\n            \"pixQRCode\":\"0123456br.gov.bcb.pix2563qrcodepix.bb.com.br/pix/v2/799be0ed-xxxx-xxxx-9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7VOALLE TECHNOLOGY6011SANTA MARIAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDFE\"\n        },\n        {\n            \"id\": 123456,\n            \"title\": \"FAT987654321\",\n            \"expirationDate\": \"2021-06-30T00:00:00\",\n            \"parcel\": 1,\n            \"typefulLine\": \"00000.00000 00000.000000 00000.000000 0 00000000000000\",\n            \"link\": \"https://d03.synsuite.com.br/financial_receivable_titles/boletos/abcd123fgh456\",\n            \"pixQRCode\":\"\"\n        }\n    ],\n    \"dataResponseType\": \"List<ThirdPartyIntegrationService+TitleBillet>\",\n    \"elapsedTime\": null\n}"},{"id":"f3950d9f-b3fe-4dd8-bc95-a0fc76a7f4c6","name":"Erro — Títulos não localizados","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text","description":"Obtido no método de autenticação"}],"body":{"mode":"raw","raw":""},"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/getcontractbillets/{{contractId}}?filterByPaymentDisponibility=false","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","getcontractbillets","{{contractId}}"],"query":[{"description":"Obrigatório. Se true, restringe o resultado aos títulos já disponíveis para pagamento no Portal do cliente, conforme a configuração de disponibilidade de pagamento da empresa.","value":"false","key":"filterByPaymentDisponibility"}]},"description":"## Propósito\nRetorna os boletos em aberto de um contrato, priorizando os já vencidos e, na ausência destes, os com vencimento até o próximo mês.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), obtido no método de autenticação.\n\n## Regras de negócio\n- São listadas faturas em aberto e em atraso ou, na ausência de faturas atrasadas, com vencimento até o próximo mês da consulta: o método primeiro busca títulos com vencimento **anterior a hoje**; só se não encontrar nenhum é que amplia a busca para títulos com vencimento **até o fim do próximo mês**.\n- Só são considerados títulos definitivos, com tipo de cobrança por Boleto (com tipo de emissão 1, 2 ou 3), com saldo a receber, número do título (NN) gerado, não perdidos, não finalizados e não renegociados.\n- Quando `filterByPaymentDisponibility=true`, o resultado é restrito apenas aos títulos já liberados para pagamento no Portal do cliente, conforme a configuração de disponibilidade de pagamento da empresa (mesma regra usada para liberar o boleto para os clientes finais).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| contractid | Path (`/getcontractbillets/{contractid}`) | Sim | ID do contrato |\n| filterByPaymentDisponibility | Query | Sim | `true`/`false` — se `true`, restringe o resultado aos títulos já disponíveis para pagamento no Portal do cliente |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a consulta foi processada sem erros |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | array\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response[].id` | integer | ID do título, usado em outras chamadas (\"Busca PDF da uma fatura\", \"Gera PIX para pagamento\", \"Realiza a liquidação de uma fatura\") |\n| `response[].title` | string | Identificação/número da fatura |\n| `response[].expirationDate` | string (date) | Data de vencimento do título |\n| `response[].parcel` | integer | Número da parcela |\n| `response[].typefulLine` | string | Linha digitável do boleto |\n| `response[].link` | string | Link público do boleto, mesmo mecanismo de \"Busca LINK da uma fatura\" |\n| `response[].pixQRCode` | string | Payload do QR Code Pix (pode vir vazio) |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| Nenhum título em aberto localizado para o contrato (nem vencido, nem a vencer até o próximo mês) | 200 | false | \"Títulos não localizados\" |\n| Empresa sem URL de portal do cliente configurada | 200 | false | \"Não foi possível localizar os dados de acesso ao Portal\" |\n\n## Fluxo relacionado\n- \"Busca faturas em aberto por CPF/CNPJ\" — mesma finalidade, filtrando por cliente em vez de contrato.\n- \"Busca PDF da uma fatura\" / \"Gera PIX para pagamento\" / \"Realiza a liquidação de uma fatura\" — usam o `id` do título retornado aqui."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Títulos não localizados\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"0e46d084-4cb4-47af-9e65-8321beb1350b"},{"name":"Busca faturas em aberto por range de vencimento","id":"b7bfc9a0-784e-4c9c-8536-20b0319ad25b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/Integrations/thirdparty/getopentitlesbyexpirationdate?expirationDateFrom=2025-05-01&expirationDateTo=2025-05-01&page=1&pageSize=50","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Lista, de forma paginada, as faturas em aberto (cobrança por boleto ou carnê, sem nenhum pagamento parcial) cujo vencimento está dentro de um intervalo de datas informado.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>expirationDateFrom</code></td>\n<td>Sim</td>\n<td>Data inicial do intervalo de vencimento, formato <code>yyyy-MM-dd</code>.</td>\n</tr>\n<tr>\n<td><code>expirationDateTo</code></td>\n<td>Sim</td>\n<td>Data final do intervalo de vencimento, formato <code>yyyy-MM-dd</code>. Deve ser maior ou igual a <code>expirationDateFrom</code>.</td>\n</tr>\n<tr>\n<td><code>page</code></td>\n<td>Não</td>\n<td>Página de resultados. Padrão 1, mínimo 1.</td>\n</tr>\n<tr>\n<td><code>pageSize</code></td>\n<td>Não</td>\n<td>Registros por página. Padrão 50, mínimo 1, máximo 200.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Retorna apenas títulos definitivos, recebíveis, não deletados, não finalizados, sem nenhum pagamento parcial (saldo igual ao valor total), e cuja cobrança seja por boleto ou carnê — outras formas de cobrança não aparecem neste endpoint.</li>\n<li>Não há limite de dias entre <code>expirationDateFrom</code> e <code>expirationDateTo</code> — o único limite de negócio confirmado é <code>pageSize</code> (máximo 200).</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.data[].id</code></td>\n<td>integer</td>\n<td>Id da fatura (título recebível).</td>\n</tr>\n<tr>\n<td><code>response.data[].contractNumber</code></td>\n<td>string|null</td>\n<td>Número do contrato vinculado, quando houver.</td>\n</tr>\n<tr>\n<td><code>response.data[].bank</code></td>\n<td>object</td>\n<td>Dados bancários do boleto/carnê: <code>account</code> (<code>number</code>/<code>digit</code>), <code>agency</code> (<code>number</code>/<code>digit</code>), <code>bankUse</code>, <code>code</code>, <code>name</code>.</td>\n</tr>\n<tr>\n<td><code>response.data[].billet</code></td>\n<td>object</td>\n<td>Dados do boleto: <code>amount</code> (<code>value</code>, <code>discount</code>, <code>fine</code>, <code>interest</code>, <code>finalValue</code>, <code>originalValue</code>), <code>bankTitleNumber</code>, <code>barcode</code>, <code>typefulLine</code>, <code>issueDate</code>, <code>expirationDate</code>, <code>processingDate</code>, <code>title</code>, <code>status</code>, <code>pixQrCode</code>, <code>receipts</code>.</td>\n</tr>\n<tr>\n<td><code>response.data[].client</code></td>\n<td>object</td>\n<td>Dados do cliente: <code>name</code>, <code>txId</code> (CPF/CNPJ) e <code>address</code> (<code>street</code>, <code>number</code>, <code>addressComplement</code>, <code>city</code>, <code>codeCityId</code>, <code>state</code>, <code>postalCode</code>).</td>\n</tr>\n<tr>\n<td><code>response.data[].collectionType</code></td>\n<td>object</td>\n<td>Dados do tipo de cobrança: <code>accept</code>, <code>loanPortfolio</code>, <code>quantity</code>, <code>specieTitle</code>.</td>\n</tr>\n<tr>\n<td><code>response.data[].companyPlace</code></td>\n<td>object</td>\n<td>Dados da empresa/filial emissora: <code>name</code>, <code>txId</code> e <code>address</code> (mesma estrutura de <code>client.address</code>).</td>\n</tr>\n<tr>\n<td><code>response.totalRecords</code></td>\n<td>integer</td>\n<td>Total de faturas encontradas, somando todas as páginas.</td>\n</tr>\n<tr>\n<td><code>response.page</code></td>\n<td>integer</td>\n<td>Página atual retornada.</td>\n</tr>\n<tr>\n<td><code>response.pageSize</code></td>\n<td>integer</td>\n<td>Quantidade de registros retornados nesta página.</td>\n</tr>\n<tr>\n<td><code>response.totalPages</code></td>\n<td>integer</td>\n<td>Total de páginas disponíveis, calculado a partir de <code>totalRecords</code> e <code>pageSize</code>.</td>\n</tr>\n<tr>\n<td><code>response.totalizers</code></td>\n<td>null</td>\n<td>Não utilizado por este endpoint (sempre <code>null</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request (os erros documentados em \"Erros comuns\" retornam HTTP 400, e não há exemplo salvo desse cenário).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>expirationDateFrom</code>/<code>expirationDateTo</code> ausente</td>\n<td>\"A data inicial/final do range de vencimento (expirationDateFrom/expirationDateTo) é obrigatória.\"</td>\n</tr>\n<tr>\n<td>Formato de data inválido</td>\n<td>\"A data inicial/final está em formato inválido. Utilize o formato yyyy-MM-dd.\"</td>\n</tr>\n<tr>\n<td><code>expirationDateFrom</code> maior que <code>expirationDateTo</code></td>\n<td>\"A data inicial deve ser menor ou igual à data final.\"</td>\n</tr>\n<tr>\n<td><code>page</code> menor que 1</td>\n<td>\"O número da página deve ser maior ou igual a 1.\"</td>\n</tr>\n<tr>\n<td><code>pageSize</code> menor que 1 ou maior que 200</td>\n<td>\"O tamanho da página deve ser maior ou igual a 1.\" / \"... não pode ser maior que 200.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Diferente da maioria dos endpoints desta collection, aqui um erro de negócio retorna <strong>HTTP 400</strong>, não 200.</p>\n</blockquote>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","Integrations","thirdparty","getopentitlesbyexpirationdate"],"host":["{{URL}}"],"query":[{"key":"expirationDateFrom","value":"2025-05-01"},{"key":"expirationDateTo","value":"2025-05-01"},{"key":"page","value":"1"},{"key":"pageSize","value":"50"}],"variable":[]}},"response":[{"id":"5aae6a00-3c75-4935-9b97-22e341c8e06c","name":"Busca faturas em aberto por range de vencimento","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}","type":"text"}],"url":{"raw":"{{url}}:45715/external/Integrations/thirdparty/getopentitlesbyexpirationdate?expirationDateFrom=2025-05-01&expirationDateTo=2025-05-01&page=1&pageSize=50","host":["{{url}}"],"port":"45715","path":["external","Integrations","thirdparty","getopentitlesbyexpirationdate"],"query":[{"key":"expirationDateFrom","value":"2025-05-01"},{"key":"expirationDateTo","value":"2025-05-01"},{"key":"page","value":"1"},{"key":"pageSize","value":"50"}]}},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"data\": [\n            {\n                \"id\": 999999,\n                \"contractNumber\": null,\n                \"bank\": {\n                    \"account\": {\n                        \"digit\": \"9\",\n                        \"number\": \"99999\"\n                    },\n                    \"agency\": {\n                        \"digit\": \"9\",\n                        \"number\": \"999\"\n                    },\n                    \"bankUse\": \"\",\n                    \"code\": \"001\",\n                    \"name\": \"Banco do Brasil S.A.\"\n                },\n                \"billet\": {\n                    \"amount\": {\n                        \"discount\": 0.0,\n                        \"finalValue\": 9.99,\n                        \"fine\": 9.99,\n                        \"interest\": 9.99,\n                        \"value\": 9.99,\n                        \"originalValue\": 9.99\n                    },\n                    \"bankTitleNumber\": \"999999999999999\",\n                    \"barcode\": \"999999999999999999999999999999999999999999999\",\n                    \"expirationDate\": \"2025-05-10\",\n                    \"issueDate\": \"2025-01-10\",\n                    \"processingDate\": \"2026-05-14\",\n                    \"title\": \"FAT999999999999999\",\n                    \"status\": \"Vencida\",\n                    \"typefulLine\": \"0. 0. 0.  \",\n                    \"pixQrCode\": null,\n                    \"receipts\": []\n                },\n                \"client\": {\n                    \"address\": {\n                        \"addressComplement\": null,\n                        \"city\": \"Cidade\",\n                        \"codeCityId\": 9999999,\n                        \"number\": \"9999\",\n                        \"postalCode\": \"9999999\",\n                        \"state\": \"RS\",\n                        \"street\": \"BR-158\"\n                    },\n                    \"name\": \"Local A\",\n                    \"txId\": \"999999999999\"\n                },\n                \"collectionType\": {\n                    \"accept\": \"N\",\n                    \"loanPortfolio\": \"17\",\n                    \"quantity\": \"\",\n                    \"specieTitle\": \"DS\"\n                },\n                \"companyPlace\": {\n                    \"address\": {\n                        \"addressComplement\": \"Local\",\n                        \"city\": \"Cidade\",\n                        \"codeCityId\": 99999999,\n                        \"number\": \"999\",\n                        \"postalCode\": \"99999-999\",\n                        \"state\": \"RS\",\n                        \"street\": \"BR-158\"\n                    },\n                    \"name\": \"Empresa\",\n                    \"txId\": \"99999999999\"\n                }\n            },\n        ],\n        \"totalRecords\": 8,\n        \"page\": 1,\n        \"pageSize\": 5,\n        \"totalizers\": null,\n        \"totalPages\": 2\n    },\n    \"dataResponseType\": \"DataPage`1\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"b7bfc9a0-784e-4c9c-8536-20b0319ad25b"},{"name":"Busca PDF da uma fatura","id":"debc7a57-6193-4d6d-b7c4-bbed0f8dd1b3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBillet/{{id_fatura}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna o arquivo PDF do boleto de uma fatura específica, gerado sob demanda no layout configurado no tipo de cobrança do ERP (mesmo mecanismo usado na emissão do boleto para o cliente final).</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>ID da fatura (<code>id_fatura</code>), obtido em \"Busca faturas em aberto por CPF/CNPJ\", \"por contrato\" ou \"Busca todas as faturas de um cliente por CPF/CNPJ\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A fatura precisa existir, ter um tipo de cobrança vinculado e não ser uma parcela interna de um boleto agrupador (deve ser a fatura \"pai\"/individual).</li>\n<li>O PDF é gerado a cada chamada; não é um arquivo pré-armazenado.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>titleId</td>\n<td>Path (<code>/GetBillet/{titleId}</code>)</td>\n<td>Sim</td>\n<td>ID da fatura (id_fatura)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint foge do envelope padrão da collection: em caso de sucesso, o corpo da resposta é o próprio arquivo binário (<code>Content-Type: application/pdf</code>), não um JSON <code>{success, messages, response}</code>. Em caso de erro, o corpo é texto simples (não JSON).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>Corpo</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Fatura não encontrada ou não elegível (sem tipo de cobrança, ou é parcela interna de boleto agrupado)</td>\n<td>404</td>\n<td>Texto simples: \"Fatura não encontrada.\"</td>\n</tr>\n<tr>\n<td>Falha ao gerar o boleto no ERP (erro interno na geração do PDF)</td>\n<td>400</td>\n<td>Texto simples: \"Erro ao gerar o Boleto.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca LINK da uma fatura\" — alternativa que retorna um link público em vez do arquivo PDF.</li>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o <code>id</code> da fatura.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","GetBillet","{{id_fatura}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"161f9095-35bf-464a-8fac-c8d14997c3f3","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBillet/{{id_fatura}}"},"status":"OK","code":200,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"(Arquivo PDF do boleto já impresso e conforme layout definido no ERP no cadastro de tipo de cobrança)"},{"id":"280bb1fa-4515-4c83-aece-3aa0d3a552b6","name":"Erro — Fatura não encontrada","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBillet/{{id_fatura}}"},"code":404,"_postman_previewlanguage":null,"header":null,"cookie":[],"responseTime":null,"body":"Fatura não encontrada."},{"id":"67138190-d950-4c1c-aea3-13a4795c2a3f","name":"Erro — Falha ao gerar o boleto","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBillet/{{id_fatura}}","description":"## Propósito\nRetorna o arquivo PDF do boleto de uma fatura específica, gerado sob demanda no layout configurado no tipo de cobrança do ERP (mesmo mecanismo usado na emissão do boleto para o cliente final).\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em \"Busca faturas em aberto por CPF/CNPJ\", \"por contrato\" ou \"Busca todas as faturas de um cliente por CPF/CNPJ\".\n\n## Regras de negócio\n- A fatura precisa existir, ter um tipo de cobrança vinculado e não ser uma parcela interna de um boleto agrupador (deve ser a fatura \"pai\"/individual).\n- O PDF é gerado a cada chamada; não é um arquivo pré-armazenado.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | Path (`/GetBillet/{titleId}`) | Sim | ID da fatura (id_fatura) |\n\n## Estrutura da resposta\n⚠ Este endpoint foge do envelope padrão da collection: em caso de sucesso, o corpo da resposta é o próprio arquivo binário (`Content-Type: application/pdf`), não um JSON `{success, messages, response}`. Em caso de erro, o corpo é texto simples (não JSON).\n\n## Erros comuns\n| Situação | HTTP | Corpo |\n|---|---|---|\n| Fatura não encontrada ou não elegível (sem tipo de cobrança, ou é parcela interna de boleto agrupado) | 404 | Texto simples: \"Fatura não encontrada.\" |\n| Falha ao gerar o boleto no ERP (erro interno na geração do PDF) | 400 | Texto simples: \"Erro ao gerar o Boleto.\" |\n\n## Fluxo relacionado\n- \"Busca LINK da uma fatura\" — alternativa que retorna um link público em vez do arquivo PDF.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `id` da fatura."},"status":"Bad Request","code":400,"_postman_previewlanguage":"text","header":null,"cookie":[],"responseTime":null,"body":"Erro ao gerar o Boleto."}],"_postman_id":"debc7a57-6193-4d6d-b7c4-bbed0f8dd1b3"},{"name":"Busca LINK da uma fatura","id":"7fcb4c28-5080-46b8-9adb-e763bcbe13ab","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBilletLink/{{id_fatura}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna o link público do boleto de uma fatura (portal do cliente), assinado com hash e código de validação, para que o cliente final visualize/pague o boleto sem precisar se autenticar no portal.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>ID da fatura (<code>id_fatura</code>), obtido em algum método de consulta de faturas.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A fatura precisa existir, ter um tipo de cobrança vinculado e não ser uma parcela interna de um boleto agrupador (mesma regra de elegibilidade de \"Busca PDF da uma fatura\").</li>\n<li>É necessário já existir um hash de validação gerado para a fatura (vínculo fatura↔cliente); sem ele, o link não fica disponível.</li>\n<li>É necessário que a empresa/local vinculado à fatura tenha uma URL de portal do cliente configurada.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>titleId</td>\n<td>Path (<code>/GetBilletLink/{titleId}</code>)</td>\n<td>Sim</td>\n<td>ID da fatura (id_fatura)</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o link foi obtido com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.link</code></td>\n<td>string</td>\n<td>URL pública do boleto (portal do cliente), assinada com hash e código de validação</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code>/ausente em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ Este endpoint sempre retorna HTTP 200, inclusive quando a fatura não é encontrada ou o link não está disponível — o controlador não usa o HTTP status para sinalizar erro. O integrador deve sempre checar o campo <code>success</code> no corpo da resposta, nunca o status HTTP.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Fatura não encontrada ou não elegível</td>\n<td>200</td>\n<td>false</td>\n<td>\"Fatura não encontrada.\"</td>\n</tr>\n<tr>\n<td>Fatura sem hash de validação vinculado</td>\n<td>200</td>\n<td>false</td>\n<td>\"Link de boleto não disponível para esta fatura.\"</td>\n</tr>\n<tr>\n<td>Portal do cliente não configurado na empresa/local</td>\n<td>200</td>\n<td>false</td>\n<td>\"Erro ao obter o endereço do portal.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca PDF da uma fatura\" — alternativa que retorna o arquivo PDF em vez do link.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","GetBilletLink","{{id_fatura}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"17c63d96-ce27-474c-a3a6-baed9ac707ab","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBilletLink/{{id_fatura}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"link\": \"https://portal.xxxxx.com.br/financial_receivable_titles/check_bank/d1d2f330f6ffc2d2711d1125716ffe2d?validationCode=81kBAAAAAAA=\"\n    }\n}"},{"id":"6c7b0ede-79d3-4bf3-a1f5-55489ec0fe7f","name":"Erro — Fatura não encontrada","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBilletLink/{{id_fatura}}"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Fatura não encontrada.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ]\n}"},{"id":"2b60e8d8-255c-4d34-bdaf-9e8630a0bcbd","name":"Erro — Link não disponível","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/GetBilletLink/{{id_fatura}}","description":"## Propósito\nRetorna o link público do boleto de uma fatura (portal do cliente), assinado com hash e código de validação, para que o cliente final visualize/pague o boleto sem precisar se autenticar no portal.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em algum método de consulta de faturas.\n\n## Regras de negócio\n- A fatura precisa existir, ter um tipo de cobrança vinculado e não ser uma parcela interna de um boleto agrupador (mesma regra de elegibilidade de \"Busca PDF da uma fatura\").\n- É necessário já existir um hash de validação gerado para a fatura (vínculo fatura↔cliente); sem ele, o link não fica disponível.\n- É necessário que a empresa/local vinculado à fatura tenha uma URL de portal do cliente configurada.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | Path (`/GetBilletLink/{titleId}`) | Sim | ID da fatura (id_fatura) |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o link foi obtido com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.link` | string | URL pública do boleto (portal do cliente), assinada com hash e código de validação |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null`/ausente em erro. |\n\n⚠ Este endpoint sempre retorna HTTP 200, inclusive quando a fatura não é encontrada ou o link não está disponível — o controlador não usa o HTTP status para sinalizar erro. O integrador deve sempre checar o campo `success` no corpo da resposta, nunca o status HTTP.\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| Fatura não encontrada ou não elegível | 200 | false | \"Fatura não encontrada.\" |\n| Fatura sem hash de validação vinculado | 200 | false | \"Link de boleto não disponível para esta fatura.\" |\n| Portal do cliente não configurado na empresa/local | 200 | false | \"Erro ao obter o endereço do portal.\" |\n\n## Fluxo relacionado\n- \"Busca PDF da uma fatura\" — alternativa que retorna o arquivo PDF em vez do link."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Link de boleto não disponível para esta fatura.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ]\n}"}],"_postman_id":"7fcb4c28-5080-46b8-9adb-e763bcbe13ab"},{"name":"Consulta o status de um recebimento","id":"f9647c64-5d30-41e6-a354-37a75d81525b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","description":"<p>Obtido no método de autenticação</p>\n","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/consultpayment?syngwtransactionid={{UUID retornado na liquidação}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Consulta o status de processamento de uma liquidação de fatura enviada anteriormente por \"Realiza a liquidação de uma fatura\", usando o protocolo (<code>synGwTransactionId</code>) retornado naquela chamada.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li><code>synGwTransactionId</code> (GUID) obtido na resposta do método de liquidação.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A liquidação de uma fatura é processada de forma assíncrona/enfileirada: ao ser registrada, ela retorna imediatamente um protocolo, e a baixa da fatura só é efetivada depois, por um processamento em segundo plano.</li>\n<li>Este método é o meio de o integrador acompanhar, a qualquer momento após o envio, se aquele processamento já ocorreu e qual foi o resultado.</li>\n<li>Enquanto o processamento não ocorreu, o status retornado é \"Aguardando processamento\" — recomenda-se novas tentativas de consulta (polling) com intervalo entre elas, em vez de assumir que a liquidação já foi concluída logo após o envio.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>syngwtransactionid</td>\n<td>Query</td>\n<td>Sim</td>\n<td>GUID do protocolo retornado por \"Realiza a liquidação de uma fatura\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o protocolo foi localizado</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.integratorTransactionId</code></td>\n<td>string</td>\n<td>O <code>transactionId</code> originalmente enviado pelo integrador</td>\n</tr>\n<tr>\n<td><code>response.status.value</code></td>\n<td>integer</td>\n<td>Código do status: <code>0</code> Aguardando processamento, <code>1</code> Processado com sucesso, <code>2</code> Processado com erro</td>\n</tr>\n<tr>\n<td><code>response.status.label</code></td>\n<td>string</td>\n<td>Rótulo do status, correspondente a <code>value</code></td>\n</tr>\n<tr>\n<td><code>response.processed</code></td>\n<td>string (date-time) | null</td>\n<td>Data/hora do processamento</td>\n</tr>\n<tr>\n<td><code>response.message</code></td>\n<td>string</td>\n<td>Mensagem associada ao processamento</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>syngwtransactionid</code> não corresponde a nenhuma liquidação enviada</td>\n<td>200</td>\n<td>false</td>\n<td>\"Pagamento não encontrado\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Realiza a liquidação de uma fatura\" — gera o <code>synGwTransactionId</code> consultado aqui.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","consultpayment"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obtido no método de liquidação de um título</p>\n","type":"text/plain"},"key":"syngwtransactionid","value":"{{UUID retornado na liquidação}}"}],"variable":[]}},"response":[{"id":"22220c7d-75bf-4b47-9047-971498090a04","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer","type":"text"}],"url":{"raw":"https://erp.cliente.com.br:45715/external/integrations/thirdparty/consultpayment?syngwtransactionid=a1b2c3d4e5","protocol":"https","host":["erp","cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","consultpayment"],"query":[{"key":"syngwtransactionid","value":"a1b2c3d4e5"}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": null,\n  \"response\": {\n    \"integratorTransactionId\": \"1eb56ef0-dfa1-11eb-8d19-0242ac130003\",\n    \"status\": {\n      \"value\": 1,\n      \"label\": \"Processado com sucesso\"\n    },\n    \"processed\": \"2021-07-01T16:11:52\",\n    \"message\": \"Teste de recebimento 3\"\n  },\n  \"dataResponseType\": \"<>f__AnonymousType461`4\",\n  \"elapsedTime\": null\n}"},{"id":"ceedc1d2-cc9e-49ec-90ce-de47b4e3efb7","name":"Erro — Protocolo não encontrado","originalRequest":{"method":"GET","header":[{"key":"Authorization","description":"Obtido no método de autenticação","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/consultpayment?syngwtransactionid={{UUID retornado na liquidação}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","consultpayment"],"query":[{"key":"syngwtransactionid","value":"{{UUID retornado na liquidação}}","description":"Obtido no método de liquidação de um título"}]},"description":"## Propósito\nConsulta o status de processamento de uma liquidação de fatura enviada anteriormente por \"Realiza a liquidação de uma fatura\", usando o protocolo (`synGwTransactionId`) retornado naquela chamada.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- `synGwTransactionId` (GUID) obtido na resposta do método de liquidação.\n\n## Regras de negócio\n- A liquidação de uma fatura é processada de forma assíncrona/enfileirada: ao ser registrada, ela retorna imediatamente um protocolo, e a baixa da fatura só é efetivada depois, por um processamento em segundo plano.\n- Este método é o meio de o integrador acompanhar, a qualquer momento após o envio, se aquele processamento já ocorreu e qual foi o resultado.\n- Enquanto o processamento não ocorreu, o status retornado é \"Aguardando processamento\" — recomenda-se novas tentativas de consulta (polling) com intervalo entre elas, em vez de assumir que a liquidação já foi concluída logo após o envio.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| syngwtransactionid | Query | Sim | GUID do protocolo retornado por \"Realiza a liquidação de uma fatura\" |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o protocolo foi localizado |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.integratorTransactionId` | string | O `transactionId` originalmente enviado pelo integrador |\n| `response.status.value` | integer | Código do status: `0` Aguardando processamento, `1` Processado com sucesso, `2` Processado com erro |\n| `response.status.label` | string | Rótulo do status, correspondente a `value` |\n| `response.processed` | string (date-time) \\| null | Data/hora do processamento |\n| `response.message` | string | Mensagem associada ao processamento |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `syngwtransactionid` não corresponde a nenhuma liquidação enviada | 200 | false | \"Pagamento não encontrado\" |\n\n## Fluxo relacionado\n- \"Realiza a liquidação de uma fatura\" — gera o `synGwTransactionId` consultado aqui."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\n    {\n      \"message\": \"Pagamento não encontrado\",\n      \"code\": 404,\n      \"type\": \"Error\"\n    }\n  ],\n  \"response\": null,\n  \"elapsedTime\": null\n}"}],"_postman_id":"f9647c64-5d30-41e6-a354-37a75d81525b"},{"name":"Realiza a liquidação de uma fatura","id":"c674ecd4-af70-438d-a415-d2717fd0378d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"value":"Bearer {{access_token}}","description":"<p>Obtido no método de autenticação</p>\n","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"guid\", // UUID identificado da transação na integradora\n    \"financialReceivableTitleId\": 0, // ID da fatura \n    \"paidAmount\":0, // Valor pago pelo cliente\n    \"message\": \"string\", // Mensagem/evento para ser salva no histórico da fatura\n    \"BankAccountCode\":\"string\", // Código da conta em que o recebimento deve ocorrer\n    \"PaymentFormCode\":\"string\", // Código da forma de pagamento utilizada pelo cliente\n    \"ReceiptDate\":\"2024-09-01\", // Data em que o recebimento será registrado\n    \"ClientPaidDate\":\"2024-09-02\" // Data em que ocorreu o pagamento pelo cliente\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/receivepayment","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Registra a liquidação (recebimento) de uma fatura no ERP, sendo feita sempre de forma total. Caso seja enviado um valor menor que o total da fatura, a diferença é lançada como desconto; se maior, como acréscimo.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>ID da fatura (<code>financialReceivableTitleId</code>), código de uma Conta existente (<code>BankAccountCode</code>) e código de uma Forma de Pagamento existente (<code>PaymentFormCode</code>) já cadastrados e ativos no ERPVoalle.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><strong>A liquidação é processada de forma assíncrona/enfileirada, não síncrona.</strong> A chamada apenas valida os dados e registra a solicitação; ela responde imediatamente com um protocolo (<code>synGwTransactionId</code>) e a baixa da fatura é efetivada depois, por um processamento em segundo plano. Para saber se a fatura foi efetivamente baixada, use \"Consulta o status de um recebimento\" com o protocolo retornado.</li>\n<li>No campo <code>transactionId</code> deve ser informado um GUID válido (identificador da transação gerado pelo próprio integrador), exemplo: <code>418b6d6c-6352-4bae-ab37-e70e959c25f5</code>.</li>\n<li><code>paidAmount</code> deve ser maior que zero.</li>\n<li><code>BankAccountCode</code> é obrigatório na prática: sem um código de conta válido, a validação prévia falha antes mesmo de enfileirar a solicitação.</li>\n<li>A fatura precisa existir, não estar quitada, não estar finalizada, não estar em perda e ter um tipo de cobrança definido.</li>\n<li>Quando a fatura é uma fatura agrupadora (múltiplos títulos vinculados), nenhum dos títulos agrupados pode já estar com saldo zerado ou negativo.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>transactionId</td>\n<td>string (GUID)</td>\n<td>Sim</td>\n<td>Identificador da transação gerado pelo integrador</td>\n</tr>\n<tr>\n<td>financialReceivableTitleId</td>\n<td>long</td>\n<td>Sim</td>\n<td>ID da fatura</td>\n</tr>\n<tr>\n<td>paidAmount</td>\n<td>decimal</td>\n<td>Sim</td>\n<td>Valor pago pelo cliente (&gt; 0)</td>\n</tr>\n<tr>\n<td>message</td>\n<td>string</td>\n<td>Não</td>\n<td>Mensagem/evento a ser salva no histórico da fatura</td>\n</tr>\n<tr>\n<td>BankAccountCode</td>\n<td>string</td>\n<td>Sim (na prática)</td>\n<td>Código da conta em que o recebimento deve ocorrer</td>\n</tr>\n<tr>\n<td>PaymentFormCode</td>\n<td>string</td>\n<td>Não</td>\n<td>Código da forma de pagamento utilizada pelo cliente</td>\n</tr>\n<tr>\n<td>ReceiptDate</td>\n<td>date</td>\n<td>Não</td>\n<td>Data em que o recebimento será registrado</td>\n</tr>\n<tr>\n<td>ClientPaidDate</td>\n<td>date</td>\n<td>Não</td>\n<td>Data em que ocorreu o pagamento pelo cliente</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a solicitação de liquidação foi validada e enfileirada com sucesso (não indica que a fatura já foi baixada)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.synGwTransactionId</code></td>\n<td>string (GUID)</td>\n<td>Protocolo para consulta posterior do resultado do processamento, via \"Consulta o status de um recebimento\"</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>financialReceivableTitleId</code> não corresponde a nenhuma fatura</td>\n<td>200</td>\n<td>false</td>\n<td>\"Fatura {id} não encontrada.\"</td>\n</tr>\n<tr>\n<td>Fatura já quitada</td>\n<td>200</td>\n<td>false</td>\n<td>\"A fatura {título} já encontra-se quitada. Impossível receber pagamento.\"</td>\n</tr>\n<tr>\n<td><code>BankAccountCode</code> inválido ou não informado</td>\n<td>200</td>\n<td>false</td>\n<td>\"Não foi possível encontrar a conta com o código informado.\" / \"A conta bancária é obrigatória para o recebimento do pagamento.\"</td>\n</tr>\n<tr>\n<td><code>paidAmount</code> menor ou igual a zero</td>\n<td>200</td>\n<td>false</td>\n<td>\"O valor do pagamento deve ser maior que ZERO.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Consulta o status de um recebimento\" — consulta o resultado do processamento assíncrono, usando o <code>synGwTransactionId</code> retornado aqui.</li>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o <code>financialReceivableTitleId</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","receivepayment"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"c94a5ccb-5ee4-410f-9496-c04a3bcfd8cf","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"467edf02-da69-11eb-8d19-0242ac130003\",\n    \"financialReceivableTitleId\": 1,\n    \"paidAmount\": 100.00,\n    \"message\": \"Teste de recebimento 1\",\n    \"BankAccountCode\": \"1.03\",\n    \"PaymentFormCode\": \"16.1\",\n    \"ReceiptDate\": \"2024-09-30\",\n    \"ClientPaidDate\": \"2024-09-25\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/receivepayment"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"synGwTransactionId\": \"a1387044-7154-41df-9e72-ec75c842126b\" //UUID para identificar a transação\n    },\n    \"dataResponseType\": \"<>f__AnonymousType460`1\",\n    \"elapsedTime\": null\n}"},{"id":"046e1400-6e59-4260-8406-1cfe39fd5705","name":"Erro — Fatura não encontrada","originalRequest":{"method":"POST","header":[{"value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"guid\", // UUID identificado da transação na integradora\n    \"financialReceivableTitleId\": 0, // ID da fatura \n    \"paidAmount\":0, // Valor pago pelo cliente\n    \"message\": \"string\", // Mensagem/evento para ser salva no histórico da fatura\n    \"BankAccountCode\":\"string\", // Código da conta em que o recebimento deve ocorrer\n    \"PaymentFormCode\":\"string\", // Código da forma de pagamento utilizada pelo cliente\n    \"ReceiptDate\":\"2024-09-01\", // Data em que o recebimento será registrado\n    \"ClientPaidDate\":\"2024-09-02\" // Data em que ocorreu o pagamento pelo cliente\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/receivepayment","description":"## Propósito\nRegistra a liquidação (recebimento) de uma fatura no ERP, sendo feita sempre de forma total. Caso seja enviado um valor menor que o total da fatura, a diferença é lançada como desconto; se maior, como acréscimo.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`financialReceivableTitleId`), código de uma Conta existente (`BankAccountCode`) e código de uma Forma de Pagamento existente (`PaymentFormCode`) já cadastrados e ativos no ERPVoalle.\n\n## Regras de negócio\n- **A liquidação é processada de forma assíncrona/enfileirada, não síncrona.** A chamada apenas valida os dados e registra a solicitação; ela responde imediatamente com um protocolo (`synGwTransactionId`) e a baixa da fatura é efetivada depois, por um processamento em segundo plano. Para saber se a fatura foi efetivamente baixada, use \"Consulta o status de um recebimento\" com o protocolo retornado.\n- No campo `transactionId` deve ser informado um GUID válido (identificador da transação gerado pelo próprio integrador), exemplo: `418b6d6c-6352-4bae-ab37-e70e959c25f5`.\n- `paidAmount` deve ser maior que zero.\n- `BankAccountCode` é obrigatório na prática: sem um código de conta válido, a validação prévia falha antes mesmo de enfileirar a solicitação.\n- A fatura precisa existir, não estar quitada, não estar finalizada, não estar em perda e ter um tipo de cobrança definido.\n- Quando a fatura é uma fatura agrupadora (múltiplos títulos vinculados), nenhum dos títulos agrupados pode já estar com saldo zerado ou negativo.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| transactionId | string (GUID) | Sim | Identificador da transação gerado pelo integrador |\n| financialReceivableTitleId | long | Sim | ID da fatura |\n| paidAmount | decimal | Sim | Valor pago pelo cliente (> 0) |\n| message | string | Não | Mensagem/evento a ser salva no histórico da fatura |\n| BankAccountCode | string | Sim (na prática) | Código da conta em que o recebimento deve ocorrer |\n| PaymentFormCode | string | Não | Código da forma de pagamento utilizada pelo cliente |\n| ReceiptDate | date | Não | Data em que o recebimento será registrado |\n| ClientPaidDate | date | Não | Data em que ocorreu o pagamento pelo cliente |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a solicitação de liquidação foi validada e enfileirada com sucesso (não indica que a fatura já foi baixada) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.synGwTransactionId` | string (GUID) | Protocolo para consulta posterior do resultado do processamento, via \"Consulta o status de um recebimento\" |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `financialReceivableTitleId` não corresponde a nenhuma fatura | 200 | false | \"Fatura {id} não encontrada.\" |\n| Fatura já quitada | 200 | false | \"A fatura {título} já encontra-se quitada. Impossível receber pagamento.\" |\n| `BankAccountCode` inválido ou não informado | 200 | false | \"Não foi possível encontrar a conta com o código informado.\" / \"A conta bancária é obrigatória para o recebimento do pagamento.\" |\n| `paidAmount` menor ou igual a zero | 200 | false | \"O valor do pagamento deve ser maior que ZERO.\" |\n\n## Fluxo relacionado\n- \"Consulta o status de um recebimento\" — consulta o resultado do processamento assíncrono, usando o `synGwTransactionId` retornado aqui.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `financialReceivableTitleId`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Fatura 123 não encontrada.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"f347be63-e5aa-4445-8d0e-ace5f235e4a8","name":"Erro — Fatura já quitada","originalRequest":{"method":"POST","header":[{"value":"Bearer {{access_token}}","description":"Obtido no método de autenticação","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"transactionId\": \"guid\", // UUID identificado da transação na integradora\n    \"financialReceivableTitleId\": 0, // ID da fatura \n    \"paidAmount\":0, // Valor pago pelo cliente\n    \"message\": \"string\", // Mensagem/evento para ser salva no histórico da fatura\n    \"BankAccountCode\":\"string\", // Código da conta em que o recebimento deve ocorrer\n    \"PaymentFormCode\":\"string\", // Código da forma de pagamento utilizada pelo cliente\n    \"ReceiptDate\":\"2024-09-01\", // Data em que o recebimento será registrado\n    \"ClientPaidDate\":\"2024-09-02\" // Data em que ocorreu o pagamento pelo cliente\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/receivepayment","description":"## Propósito\nRegistra a liquidação (recebimento) de uma fatura no ERP, sendo feita sempre de forma total. Caso seja enviado um valor menor que o total da fatura, a diferença é lançada como desconto; se maior, como acréscimo.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`financialReceivableTitleId`), código de uma Conta existente (`BankAccountCode`) e código de uma Forma de Pagamento existente (`PaymentFormCode`) já cadastrados e ativos no ERPVoalle.\n\n## Regras de negócio\n- **A liquidação é processada de forma assíncrona/enfileirada, não síncrona.** A chamada apenas valida os dados e registra a solicitação; ela responde imediatamente com um protocolo (`synGwTransactionId`) e a baixa da fatura é efetivada depois, por um processamento em segundo plano. Para saber se a fatura foi efetivamente baixada, use \"Consulta o status de um recebimento\" com o protocolo retornado.\n- No campo `transactionId` deve ser informado um GUID válido (identificador da transação gerado pelo próprio integrador), exemplo: `418b6d6c-6352-4bae-ab37-e70e959c25f5`.\n- `paidAmount` deve ser maior que zero.\n- `BankAccountCode` é obrigatório na prática: sem um código de conta válido, a validação prévia falha antes mesmo de enfileirar a solicitação.\n- A fatura precisa existir, não estar quitada, não estar finalizada, não estar em perda e ter um tipo de cobrança definido.\n- Quando a fatura é uma fatura agrupadora (múltiplos títulos vinculados), nenhum dos títulos agrupados pode já estar com saldo zerado ou negativo.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| transactionId | string (GUID) | Sim | Identificador da transação gerado pelo integrador |\n| financialReceivableTitleId | long | Sim | ID da fatura |\n| paidAmount | decimal | Sim | Valor pago pelo cliente (> 0) |\n| message | string | Não | Mensagem/evento a ser salva no histórico da fatura |\n| BankAccountCode | string | Sim (na prática) | Código da conta em que o recebimento deve ocorrer |\n| PaymentFormCode | string | Não | Código da forma de pagamento utilizada pelo cliente |\n| ReceiptDate | date | Não | Data em que o recebimento será registrado |\n| ClientPaidDate | date | Não | Data em que ocorreu o pagamento pelo cliente |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a solicitação de liquidação foi validada e enfileirada com sucesso (não indica que a fatura já foi baixada) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.synGwTransactionId` | string (GUID) | Protocolo para consulta posterior do resultado do processamento, via \"Consulta o status de um recebimento\" |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em erro. |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `financialReceivableTitleId` não corresponde a nenhuma fatura | 200 | false | \"Fatura {id} não encontrada.\" |\n| Fatura já quitada | 200 | false | \"A fatura {título} já encontra-se quitada. Impossível receber pagamento.\" |\n| `BankAccountCode` inválido ou não informado | 200 | false | \"Não foi possível encontrar a conta com o código informado.\" / \"A conta bancária é obrigatória para o recebimento do pagamento.\" |\n| `paidAmount` menor ou igual a zero | 200 | false | \"O valor do pagamento deve ser maior que ZERO.\" |\n\n## Fluxo relacionado\n- \"Consulta o status de um recebimento\" — consulta o resultado do processamento assíncrono, usando o `synGwTransactionId` retornado aqui.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `financialReceivableTitleId`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"A fatura FAT123456789 já encontra-se quitada. Impossível receber pagamento.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"c674ecd4-af70-438d-a415-d2717fd0378d"},{"name":"Gera PIX para pagamento","id":"b322ae5f-e9ab-418b-a7ad-b0b9cb6d8d4a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","description":"<p>Obtido atraveś do método de autenticação</p>\n","value":"Bearer {{access_token}}"}],"url":"{{URL}}:45715/external/integrations/thirdparty/billings/registerpix?receivableId={{id_da_fatura}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Registra (ou recupera, se já existir) um PIX para pagamento de uma fatura em aberto.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>Parametrização do PIX Voalle na base do cliente (Cadastro de Locais → Integrações → Nova Integração → Financeiro-PIX Voalle).</li>\n<li>ID do título (<code>receivableId</code>), obtido através de \"Busca faturas em aberto por contrato\" ou \"Busca faturas em aberto por CPF/CNPJ\".</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A geração é do tipo PIX imediato (cobrança à vista, sem vínculo com a data de vencimento do boleto).</li>\n<li>Se a fatura já tiver um boleto híbrido com QR Code próprio, a resposta retorna os dados desse boleto (<code>hybridBillet: true</code>) em vez de gerar um novo PIX.</li>\n<li>Se já existir um PIX ativo em aberto para a fatura, a chamada é idempotente: retorna o mesmo QR Code já gerado anteriormente, em vez de duplicar a cobrança.</li>\n<li>A fatura precisa existir e estar disponível para recebimento (não pode estar perdida/baixada por perda nem marcada como não recebível).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>receivableId</td>\n<td>Query</td>\n<td>Sim</td>\n<td>ID da fatura, obtido em \"Busca faturas em aberto por contrato\" ou \"por CPF/CNPJ\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ Este endpoint sempre retorna HTTP 200, inclusive quando a operação falha por regra de negócio — o controlador não usa o HTTP status para sinalizar erro. O integrador deve sempre checar o campo <code>success</code> no corpo da resposta.</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Indica se o PIX foi gerado/recuperado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Mesma estrutura em sucesso e erro — ver tabela abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.registerId</code></td>\n<td>integer|null</td>\n<td>ID do registro do PIX gerado; <code>null</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.qrCode</code></td>\n<td>string|null</td>\n<td>Código copia-e-cola do PIX; <code>null</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.totalAmount</code></td>\n<td>decimal</td>\n<td>Valor total do PIX; <code>0</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.interestAmount</code></td>\n<td>decimal</td>\n<td>Valor de juros incluído no PIX; <code>0</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.fineAmount</code></td>\n<td>decimal</td>\n<td>Valor de multa incluído no PIX; <code>0</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.transactionId</code></td>\n<td>string|null</td>\n<td>Identificador da transação; <code>null</code> em erro</td>\n</tr>\n<tr>\n<td><code>response.hybridBillet</code></td>\n<td>boolean</td>\n<td><code>true</code> quando os dados retornados são de um boleto híbrido já existente, não de um PIX novo</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>receivableId</code> não corresponde a nenhuma fatura</td>\n<td>200</td>\n<td>false</td>\n<td>\"Fatura não encontrada.\"</td>\n</tr>\n<tr>\n<td>Fatura perdida ou não disponível para recebimento</td>\n<td>200</td>\n<td>false</td>\n<td>\"Fatura não está disponível para o recebimento.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca faturas em aberto por contrato\" / \"por CPF/CNPJ\" — para obter o <code>receivableId</code>.</li>\n<li>\"Consulta o status de um recebimento\" / \"Realiza a liquidação de uma fatura\" — fluxo alternativo de recebimento via boleto/liquidação manual.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","billings","registerpix"],"host":["{{URL}}"],"query":[{"description":{"content":"<p>Obtido através do método \"Busca faturas em aberto por contrato\" ou \"Busca faturas em aberto por CPF/CNPJ\"</p>\n","type":"text/plain"},"key":"receivableId","value":"{{id_da_fatura}}"}],"variable":[]}},"response":[{"id":"be8b3d59-d8b9-4cc5-852c-fd4bf147ed3a","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer","description":"Obtido atraveś do método de autenticação"}],"url":{"raw":"https://erp;cliente.com.br:45715/external/integrations/thirdparty/billings/registerpix?receivableId=123456","protocol":"https","host":["erp;cliente","com","br"],"port":"45715","path":["external","integrations","thirdparty","billings","registerpix"],"query":[{"key":"receivableId","value":"123456","description":"Obtido através do método \"Busca títulos em aberto de uma pessoa\""}]}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Processo realizado com sucesso.\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ],\n    \"response\": {\n        \"registerId\": 11,\n        \"qrCode\": \"0123456br.gov.bcb.pix2563qrcodepix.bb.com.br/pix/v2/799be0ed-xxxx-xxxx-9xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx7VOALLE TECHNOLOGY6011SANTA MARIAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxDFE\",\n        \"totalAmount\": 101.03,\n        \"interestAmount\": 1.17,\n        \"fineAmount\": 1.96,\n        \"transactionId\": \"xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx\",\n        \"hybridBillet\": false\n    },\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"},{"id":"93337cd2-767f-49f8-b5fc-f8c8da5ca847","name":"Erro — Fatura não encontrada","originalRequest":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","description":"Obtido atraveś do método de autenticação","value":"Bearer {{access_token}}"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/billings/registerpix?receivableId={{id_da_fatura}}","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","billings","registerpix"],"query":[{"key":"receivableId","value":"{{id_da_fatura}}","description":"Obtido através do método \"Busca faturas em aberto por contrato\" ou \"Busca faturas em aberto por CPF/CNPJ\""}]},"description":"## Propósito\nRegistra (ou recupera, se já existir) um PIX para pagamento de uma fatura em aberto.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- Parametrização do PIX Voalle na base do cliente (Cadastro de Locais → Integrações → Nova Integração → Financeiro-PIX Voalle).\n- ID do título (`receivableId`), obtido através de \"Busca faturas em aberto por contrato\" ou \"Busca faturas em aberto por CPF/CNPJ\".\n\n## Regras de negócio\n- A geração é do tipo PIX imediato (cobrança à vista, sem vínculo com a data de vencimento do boleto).\n- Se a fatura já tiver um boleto híbrido com QR Code próprio, a resposta retorna os dados desse boleto (`hybridBillet: true`) em vez de gerar um novo PIX.\n- Se já existir um PIX ativo em aberto para a fatura, a chamada é idempotente: retorna o mesmo QR Code já gerado anteriormente, em vez de duplicar a cobrança.\n- A fatura precisa existir e estar disponível para recebimento (não pode estar perdida/baixada por perda nem marcada como não recebível).\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| receivableId | Query | Sim | ID da fatura, obtido em \"Busca faturas em aberto por contrato\" ou \"por CPF/CNPJ\" |\n\n## Estrutura da resposta\n\n⚠ Este endpoint sempre retorna HTTP 200, inclusive quando a operação falha por regra de negócio — o controlador não usa o HTTP status para sinalizar erro. O integrador deve sempre checar o campo `success` no corpo da resposta.\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o PIX foi gerado/recuperado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object | Mesma estrutura em sucesso e erro — ver tabela abaixo. |\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.registerId` | integer\\|null | ID do registro do PIX gerado; `null` em erro |\n| `response.qrCode` | string\\|null | Código copia-e-cola do PIX; `null` em erro |\n| `response.totalAmount` | decimal | Valor total do PIX; `0` em erro |\n| `response.interestAmount` | decimal | Valor de juros incluído no PIX; `0` em erro |\n| `response.fineAmount` | decimal | Valor de multa incluído no PIX; `0` em erro |\n| `response.transactionId` | string\\|null | Identificador da transação; `null` em erro |\n| `response.hybridBillet` | boolean | `true` quando os dados retornados são de um boleto híbrido já existente, não de um PIX novo |\n\n## Erros comuns\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `receivableId` não corresponde a nenhuma fatura | 200 | false | \"Fatura não encontrada.\" |\n| Fatura perdida ou não disponível para recebimento | 200 | false | \"Fatura não está disponível para o recebimento.\" |\n\n## Fluxo relacionado\n- \"Busca faturas em aberto por contrato\" / \"por CPF/CNPJ\" — para obter o `receivableId`.\n- \"Consulta o status de um recebimento\" / \"Realiza a liquidação de uma fatura\" — fluxo alternativo de recebimento via boleto/liquidação manual."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Fatura não encontrada.\",\n            \"code\": null,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": {\n        \"registerId\": null,\n        \"qrCode\": null,\n        \"totalAmount\": 0,\n        \"interestAmount\": 0,\n        \"fineAmount\": 0,\n        \"transactionId\": null,\n        \"hybridBillet\": false\n    },\n    \"dataResponseType\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"b322ae5f-e9ab-418b-a7ad-b0b9cb6d8d4a"},{"name":"Consulta renegociação","id":"e381e344-2996-4ded-934d-66db69fea0bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer  {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"receivableIds\": [\n        1,\n        2\n    ],\n    \"date\": \"2023-12-31\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/getrenegotiationsinformations","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Simula o valor de multa e juros para uma lista de faturas (títulos recebíveis), calculado até uma data de referência — não simula parcelas nem o resultado de uma renegociação em si, apenas os valores de encargo.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>receivableIds</code></td>\n<td>Sim</td>\n<td>Lista de Ids das faturas (títulos recebíveis) para calcular multa e juros. Não pode ser vazia.</td>\n</tr>\n<tr>\n<td><code>date</code></td>\n<td>Não</td>\n<td>Data de referência para o cálculo. Se omitida, usa a data atual. Deve ser maior ou igual a hoje quando informada.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Todas as faturas informadas precisam pertencer ao mesmo local (filial) — não há validação de que pertencem ao mesmo cliente.</li>\n<li>É um método GET que recebe corpo de requisição (padrão atípico desta API, mas é assim que a chamada deve ser feita — não existem query params equivalentes).</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.totalFine</code></td>\n<td>decimal</td>\n<td>Soma do valor de multa calculado para todas as faturas informadas.</td>\n</tr>\n<tr>\n<td><code>response.totalInterest</code></td>\n<td>decimal</td>\n<td>Soma do valor de juros calculado para todas as faturas informadas.</td>\n</tr>\n<tr>\n<td><code>response.receivables[].id</code></td>\n<td>integer</td>\n<td>Id da fatura (título recebível).</td>\n</tr>\n<tr>\n<td><code>response.receivables[].title</code></td>\n<td>string</td>\n<td>Título da fatura.</td>\n</tr>\n<tr>\n<td><code>response.receivables[].fine</code></td>\n<td>decimal</td>\n<td>Valor de multa calculado para a fatura, até a data de referência.</td>\n</tr>\n<tr>\n<td><code>response.receivables[].interest</code></td>\n<td>decimal</td>\n<td>Valor de juros calculado para a fatura, até a data de referência.</td>\n</tr>\n<tr>\n<td><code>response.date</code></td>\n<td>string (date)</td>\n<td>Data de referência usada no cálculo (a informada na requisição, ou a data atual quando omitida).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request (não há exemplo de erro salvo; os erros de negócio retornam HTTP 400 — ver \"Erros comuns\" para as mensagens).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>receivableIds</code> vazio</td>\n<td>\"Nenhuma fatura repassada.\"</td>\n</tr>\n<tr>\n<td><code>date</code> anterior a hoje</td>\n<td>\"A data precisa ser maior ou igual a data de hoje.\"</td>\n</tr>\n<tr>\n<td>Faturas de locais diferentes ou não encontradas</td>\n<td>mensagens de validação equivalentes às de \"Efetiva renegociação\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Diferente da maioria dos endpoints desta collection, aqui um erro de negócio retorna <strong>HTTP 400</strong>, não 200 — confira o status HTTP normalmente.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Endpoint de simulação avulsa — não é pré-requisito técnico de \"Efetiva renegociação\" (não há nenhuma dependência entre os dois).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","getrenegotiationsinformations"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"37040eb2-8815-4712-98e6-6ef4aef999c3","name":"Consulta renegociação","originalRequest":{"method":"GET","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer  {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"receivableIds\": [\n        1,\n        2,\n        3,\n        4\n    ],\n    \"date\": \"2023-11-10\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/getrenegotiationsinformations"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"totalFine\": 0,\n        \"totalInterest\": 0,\n        \"receivables\": [\n            {\n                \"id\": 1, // ID\n                \"title\": \"FAT0000\", // Fatura\n                \"fine\": 0, // Valor calculado em multa\n                \"interest\": 0 // Valor calculado em multa\n            },\n            {\n                \"id\": 2,\n                \"title\": \"FAT1111\",\n                \"fine\": 0,\n                \"interest\": 0\n            },\n            {\n                \"id\": 3,\n                \"title\": \"FAT1111\",\n                \"fine\": 0,\n                \"interest\": 0\n            },\n            {\n                \"id\": 4,\n                \"title\": \"FAT1111\",\n                \"fine\": 0,\n                \"interest\": 0\n            }\n        ],\n        \"date\": \"2023-12-31\"\n    },\n    \"dataResponseType\": \"RenegotiationsInformationsDto\",\n    \"elapsedTime\": null\n}"}],"_postman_id":"e381e344-2996-4ded-934d-66db69fea0bd"},{"name":"Efetiva renegociação","id":"3c53fa9b-85be-4632-8af5-1385cce8aaaa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer  {{access_token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"receivableIds\": [\n        1,\n        2,\n        3,\n        4\n    ],\n    \"discount\": 0,\n    \"fine\": 0,\n    \"interest\": 0,\n    \"financialCollectionTypeCode\": 0,\n    \"observation\": \"\",\n    \"billingInvoiceAntecipad\": false,\n    \"parcels\":[\n        {\n            \"number\": 1,\n            \"amount\": 0, // [Não obrigatório] Se não informado deverá ser calculado o proporcional\n            \"expirationDate\": \"2023-11-01\"\n        },\n        {\n            \"number\": 2,\n            \"amount\": null, // O valor desta parcela será calculado com base no valor total, divido pelas parcelas menos as parcelas fixas\n            \"expirationDate\": \"2023-11-01\"\n        }        \n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/registerrenegotiations","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Renegocia uma ou mais faturas (títulos recebíveis), substituindo-as por novas parcelas com data de vencimento e, opcionalmente, desconto/multa/juros ajustados. Os títulos originais não são apagados — ficam marcados como renegociados.</p>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>receivableIds</code></td>\n<td>Sim</td>\n<td>Lista de Ids das faturas (títulos recebíveis) a renegociar.</td>\n</tr>\n<tr>\n<td><code>parcels</code></td>\n<td>Sim</td>\n<td>Lista das novas parcelas. Cada item: <code>number</code> (número da parcela), <code>expirationDate</code> (vencimento), <code>amount</code> (valor, opcional em todas exceto quando for parcela única).</td>\n</tr>\n<tr>\n<td><code>financialCollectionTypeCode</code></td>\n<td>Sim</td>\n<td>Código do tipo de cobrança das novas parcelas. Precisa existir, estar ativo e não deletado.</td>\n</tr>\n<tr>\n<td><code>discount</code></td>\n<td>Não</td>\n<td>Valor de desconto a aplicar.</td>\n</tr>\n<tr>\n<td><code>fine</code></td>\n<td>Não</td>\n<td>Valor de multa (padrão 0).</td>\n</tr>\n<tr>\n<td><code>interest</code></td>\n<td>Não</td>\n<td>Valor de juros (padrão 0).</td>\n</tr>\n<tr>\n<td><code>observation</code></td>\n<td>Não</td>\n<td>Observação registrada na renegociação.</td>\n</tr>\n<tr>\n<td><code>billingInvoiceAntecipad</code></td>\n<td>Não</td>\n<td>Antecipação de faturamento.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Todas as faturas informadas precisam ser recebíveis, não deletadas, e pertencer ao mesmo local (filial) — <strong>não há validação de que pertencem ao mesmo cliente</strong>.</li>\n<li>Precisa existir uma condição de pagamento cadastrada no sistema com o mesmo número de parcelas enviado — não é um limite fixo, mas na prática só funciona para quantidades de parcelas já configuradas.</li>\n<li>Se enviar uma única parcela com valor, ele precisa bater exatamente com o total (faturas + multa + juros − desconto).</li>\n<li>Se enviar múltiplas parcelas, uma parcela sem valor não pode vir antes de uma com valor (pela ordem de <code>number</code>).</li>\n</ul>\n<blockquote>\n<p><strong>A confirmar com o time de backend:</strong> pode existir um limite de desconto configurável a nível de sistema — não foi possível confirmar no fluxo específico deste endpoint.</p>\n</blockquote>\n<h2 id=\"efeitos-colaterais\">Efeitos colaterais</h2>\n<ul>\n<li>Gera novas faturas/títulos para as parcelas informadas.</li>\n<li>Marca os títulos originais como renegociados, sem apagá-los; se algum tinha remessa bancária, gera instrução de baixa junto ao banco.</li>\n<li><strong>Não depende de ter chamado \"Consulta renegociação\" antes</strong> — pode ser chamado diretamente.</li>\n</ul>\n<h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi realizada com sucesso.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.parcels[].id</code></td>\n<td>integer</td>\n<td>Id da nova fatura (título) gerada.</td>\n</tr>\n<tr>\n<td><code>response.parcels[].title</code></td>\n<td>string</td>\n<td>Título da nova fatura.</td>\n</tr>\n<tr>\n<td><code>response.parcels[].expirationDate</code></td>\n<td>string (date)</td>\n<td>Data de vencimento da nova fatura.</td>\n</tr>\n<tr>\n<td><code>response.parcels[].amount</code></td>\n<td>decimal</td>\n<td>Valor da nova fatura.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request (não há exemplo de erro salvo; os erros de negócio retornam HTTP 400 — ver \"Erros comuns\" para as mensagens).</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>receivableIds</code> vazio</td>\n<td>\"Necessário informar as faturas antigas.\"</td>\n</tr>\n<tr>\n<td><code>parcels</code> vazio</td>\n<td>\"Necessário informar as novas parcelas.\"</td>\n</tr>\n<tr>\n<td><code>financialCollectionTypeCode</code> ausente</td>\n<td>\"Código do tipo de cobrança é obrigatório.\"</td>\n</tr>\n<tr>\n<td>Código de tipo de cobrança inválido</td>\n<td>\"O Tipo de Cobrança informado é inválido.\"</td>\n</tr>\n<tr>\n<td>Faturas não encontradas/não recebíveis</td>\n<td>\"Todas as faturas devem ser recebíveis e não deletadas.\"</td>\n</tr>\n<tr>\n<td>Alguma fatura informada não existe</td>\n<td>\"As faturas com identificador \"{ids}\" não estão disponíveis para renegociação.\"</td>\n</tr>\n<tr>\n<td>Faturas de locais diferentes</td>\n<td>\"Existem faturas para locais diferentes. Por favor, entre em contato com o suporte.\"</td>\n</tr>\n<tr>\n<td>Sem condição de pagamento para o nº de parcelas informado</td>\n<td>\"Não foi possível localizar uma condição de pagamento com {n} parcela(s). Por favor, entre em contato com o suporte.\"</td>\n</tr>\n<tr>\n<td>Valor da parcela única não bate com o total</td>\n<td>\"O valor da parcela não corresponde com o valor dos títulos.\"</td>\n</tr>\n<tr>\n<td>Ordem de parcelas com/sem valor inconsistente</td>\n<td>\"Parcelas com valores inválidos. Por favor, entre em contato com o suporte.\"</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Diferente da maioria dos endpoints desta collection, aqui um erro de negócio retorna <strong>HTTP 400</strong>, não 200 — confira o status HTTP normalmente.</p>\n</blockquote>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Independente de \"Consulta renegociação\" (que é só uma simulação de multa/juros, não um passo obrigatório).</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","registerrenegotiations"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"4e2e433f-0b29-4ee1-ad96-4a24722da4ee","name":"Efetiva renegociação","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":"Bearer  {{access_token}}","type":"text"},{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"receivableIds\": [\n        1,\n        2,\n        3,\n        4\n    ],\n    \"discount\": 0,\n    \"fine\": 0,\n    \"interest\": 0,\n    \"financialCollectionTypeCode\": 0,\n    \"observation\": \"\",\n    \"billingInvoiceAntecipad\": false,\n    \"parcels\":[\n        {\n            \"number\": 1,\n            \"amount\": 0, // [Não obrigatório] Se não informado deverá ser calculado o proporcional\n            \"expirationDate\": \"2023-11-01\"\n        },\n        {\n            \"number\": 2,\n            \"amount\": null, // O valor desta parcela será calculado com base no valor total, divido pelas parcelas menos as parcelas fixas\n            \"expirationDate\": \"2023-11-01\"\n        }        \n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/registerrenegotiations"},"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"parcels\": [\n        {\n            \"id\": 1, // ID da nova fatura\n            \"title\": \"FAT000\", // Título da nova fatura\n            \"expirationDate\": \"2023-11-01\", // Dada de vencimento da nova fatura\n            \"amount\": 0 // Valor da nova fatura\n        },\n        {\n            \"id\": 1,\n            \"title\": \"FAT111\",\n            \"expirationDate\": \"2023-11-01\",\n            \"amount\": 0\n        }\n    ]\n}"}],"_postman_id":"3c53fa9b-85be-4632-8af5-1385cce8aaaa"},{"name":"Baixa de título por perda","id":"ff011f53-1cc0-3465-6777-79f56d6f065b","request":{"method":"POST","header":[{"key":"accept","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título.\n    \"receivableTitleId\": 0, //(long, obrigatório) — Id do título a ser baixado.\n    \"date\": \"\", //(date, obrigatório) — Data da baixa.\n    \"justify\": \"\" //(string, obrigatório) — Justificativa da baixa; usada para gerar as ocorrências do título.\n\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/lossreceivabletitle","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Realiza a baixa de um título por perda, validando previamente que o título pertence ao cliente informado.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>IDs do cliente e do título, já cadastrados no ERPVoalle.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><strong>Regra de posse (obrigatória, exclusiva da camada ThirdParty):</strong> o <code>clientId</code> informado precisa ser o dono do título. Se não bater, a operação é recusada com \"O título não pertence ao cliente informado.\" <strong>antes</strong> de qualquer alteração no título.</li>\n<li>Título precisa existir e não estar deletado.</li>\n<li>Saldo do título (<code>Balance</code>) precisa ser maior que zero.</li>\n<li>A empresa precisa ter uma Natureza Financeira de Baixa configurada (parâmetros do sistema).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>clientId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do cliente dono do título</td>\n</tr>\n<tr>\n<td>receivableTitleId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do título a ser baixado</td>\n</tr>\n<tr>\n<td>date</td>\n<td>date</td>\n<td>Sim</td>\n<td>Data da baixa</td>\n</tr>\n<tr>\n<td>justify</td>\n<td>string</td>\n<td>Sim</td>\n<td>Justificativa da baixa; usada para gerar as ocorrências do título</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a baixa foi realizada com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>string|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>string</td>\n<td>Texto fixo de confirmação: \"Baixa realizada com sucesso.\"</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientId</code> não é o dono do <code>receivableTitleId</code> informado</td>\n<td>400</td>\n<td>false</td>\n<td>\"O título não pertence ao cliente informado.\"</td>\n</tr>\n<tr>\n<td>Saldo do título já zerado ou negativo</td>\n<td>400</td>\n<td>false</td>\n<td>\"Não é possível efetuar a baixa. O valor do título precisa ser maior que ZERO.\"</td>\n</tr>\n<tr>\n<td>Título ou parâmetros de baixa não encontrados/configurados</td>\n<td>400</td>\n<td>false</td>\n<td>Mensagem de erro correspondente</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o <code>receivableTitleId</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","lossreceivabletitle"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"e9883f2a-ce97-3e52-6602-56d53dfd72dd","name":"Sucesso","originalRequest":{"header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0,\n    \"receivableTitleId\": 0,\n    \"date\": \"\",\n    \"justify\": \"\"\n}","options":{"raw":{"language":"json"}}}},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [],\n    \"response\": \"Baixa realizada com sucesso.\",\n    \"elapsedTime\": null\n}"},{"id":"6c3f4a29-6af8-845d-2616-4d4915987fb5","name":"Erro — título não pertence ao cliente","originalRequest":{"header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0,\n    \"receivableTitleId\": 0,\n    \"date\": \"\",\n    \"justify\": \"\"\n}","options":{"raw":{"language":"json"}}}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"O título não pertence ao cliente informado.\", \"code\": null }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"5a8229f7-c974-e157-65c4-e292aae12c06","name":"Erro — saldo zerado","originalRequest":{"header":[{"key":"Content-Type","value":"application/json","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0,\n    \"receivableTitleId\": 0,\n    \"date\": \"\",\n    \"justify\": \"\"\n}","options":{"raw":{"language":"json"}}}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[{"expires":"Invalid Date","domain":"","path":""}],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"Não é possível efetuar a baixa. O valor do título precisa ser maior que ZERO.\", \"code\": null }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"ff011f53-1cc0-3465-6777-79f56d6f065b"},{"name":"Envia linha digitável do boleto por SMS","id":"cd80ba72-9585-70bb-9d51-96145922f50c","request":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletsms/{{id_fatura}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Envia por SMS a linha digitável do boleto de uma fatura para o celular cadastrado do cliente, a partir do ID da fatura.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>ID da fatura (<code>id_fatura</code>), obtido em algum método de consulta de faturas.</li>\n<li>Módulo de envio de SMS habilitado para a empresa.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><strong>Body:</strong> nenhum — o <code>id_fatura</code> vai na URL.</li>\n<li>O celular do cliente é resolvido automaticamente a partir do cadastro (celular principal, com fallback para o celular secundário) — o terceiro <strong>não</strong> informa o número.</li>\n<li>A fatura precisa existir e ser elegível (não pode ser uma parcela interna de boleto agrupado). Há uma segunda validação, mais restrita, feita já dentro do envio do SMS: o título também precisa ser definitivo, não estar perdido, não estar finalizado e não estar renegociado — se falhar apenas nessa segunda checagem, o erro é reportado de forma diferente (ver \"Erros comuns\").</li>\n<li>O boleto precisa ter linha digitável gerada.</li>\n<li>A fatura não pode estar quitada (saldo zerado).</li>\n<li>Módulo de envio de SMS precisa estar habilitado para a empresa.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Local</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>id_fatura</td>\n<td>Path (<code>/financial/sendbilletsms/{id_fatura}</code>)</td>\n<td>Sim</td>\n<td>ID da fatura</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>⚠ <strong>Importante:</strong> existem dois níveis de erro distintos aqui. Erros de validação de entrada (fatura não encontrada, cliente sem celular) retornam <code>HTTP 400</code> com <code>success: false</code> e <code>response: null</code>. Já erros de regra de negócio do próprio envio (título já quitado, boleto sem linha digitável, título não elegível para envio, módulo de SMS desabilitado) retornam <strong>HTTP 200</strong> com <code>success: true</code>, porém <code>response.Type: 2</code> — o status HTTP e o <code>success</code> sozinhos não garantem que o SMS foi enviado; sempre confira <code>response.Type</code>.</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>success</code></td>\n<td>boolean</td>\n<td>Indica se a fatura foi localizada e o cliente possui celular cadastrado (não indica, por si só, que o SMS foi efetivamente enviado — ver abaixo)</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code>, presente apenas nos erros de validação de entrada (HTTP 400). <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code> (HTTP 200 — fatura localizada e cliente com celular):</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.Type</code></td>\n<td>integer</td>\n<td><code>0</code> = SMS enviado com sucesso; <code>2</code> = erro de regra de negócio do próprio envio (ver \"Erros comuns\")</td>\n</tr>\n<tr>\n<td><code>response.Message</code></td>\n<td>string</td>\n<td>Mensagem de sucesso (\"Título(s) enviado(s) com sucesso!\") ou do erro de negócio</td>\n</tr>\n<tr>\n<td><code>response.Code</code></td>\n<td>null</td>\n<td>Não utilizado neste endpoint (sempre <code>null</code>)</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code> (HTTP 400 — erro de validação de entrada):</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> no erro de validação de entrada (HTTP 400).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>response.Type</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Fatura não encontrada</td>\n<td>400</td>\n<td>false</td>\n<td>—</td>\n<td>\"Fatura não encontrada.\"</td>\n</tr>\n<tr>\n<td>Cliente sem celular cadastrado</td>\n<td>400</td>\n<td>false</td>\n<td>—</td>\n<td>\"Cliente sem celular cadastrado, impossível enviar SMS.\"</td>\n</tr>\n<tr>\n<td>Módulo de SMS desabilitado para a empresa</td>\n<td>200</td>\n<td>true</td>\n<td>2</td>\n<td>\"Módulo para envio de SMS não disponível\"</td>\n</tr>\n<tr>\n<td>Título não encontrado (segunda checagem, mais restrita)</td>\n<td>200</td>\n<td>true</td>\n<td>2</td>\n<td>\"Título não encontrado\"</td>\n</tr>\n<tr>\n<td>Boleto sem linha digitável</td>\n<td>200</td>\n<td>true</td>\n<td>2</td>\n<td>\"Boleto sem linha digitável, impossível enviar\"</td>\n</tr>\n<tr>\n<td>Título já quitado</td>\n<td>200</td>\n<td>true</td>\n<td>2</td>\n<td>\"Título já quitado, impossível enviar\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Envia PDF do boleto por e-mail\" — canal alternativo de envio do boleto.</li>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o <code>id_fatura</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","sendbilletsms","{{id_fatura}}"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"d247f2f4-5419-db21-b431-7959f239b6b7","name":"Sucesso","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletsms/{{id_fatura}}","description":"## Propósito\nEnvia por SMS a linha digitável do boleto de uma fatura para o celular cadastrado do cliente, a partir do ID da fatura.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em algum método de consulta de faturas.\n- Módulo de envio de SMS habilitado para a empresa.\n\n## Regras de negócio\n- **Body:** nenhum — o `id_fatura` vai na URL.\n- O celular do cliente é resolvido automaticamente a partir do cadastro (celular principal, com fallback para o celular secundário) — o terceiro **não** informa o número.\n- A fatura precisa existir e ser elegível (não pode ser uma parcela interna de boleto agrupado). Há uma segunda validação, mais restrita, feita já dentro do envio do SMS: o título também precisa ser definitivo, não estar perdido, não estar finalizado e não estar renegociado — se falhar apenas nessa segunda checagem, o erro é reportado de forma diferente (ver \"Erros comuns\").\n- O boleto precisa ter linha digitável gerada.\n- A fatura não pode estar quitada (saldo zerado).\n- Módulo de envio de SMS precisa estar habilitado para a empresa.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| id_fatura | Path (`/financial/sendbilletsms/{id_fatura}`) | Sim | ID da fatura |\n\n## Estrutura da resposta\n\n⚠ **Importante:** existem dois níveis de erro distintos aqui. Erros de validação de entrada (fatura não encontrada, cliente sem celular) retornam `HTTP 400` com `success: false` e `response: null`. Já erros de regra de negócio do próprio envio (título já quitado, boleto sem linha digitável, título não elegível para envio, módulo de SMS desabilitado) retornam **HTTP 200** com `success: true`, porém `response.Type: 2` — o status HTTP e o `success` sozinhos não garantem que o SMS foi enviado; sempre confira `response.Type`.\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a fatura foi localizada e o cliente possui celular cadastrado (não indica, por si só, que o SMS foi efetivamente enviado — ver abaixo) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`, presente apenas nos erros de validação de entrada (HTTP 400). `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true` (HTTP 200 — fatura localizada e cliente com celular):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.Type` | integer | `0` = SMS enviado com sucesso; `2` = erro de regra de negócio do próprio envio (ver \"Erros comuns\") |\n| `response.Message` | string | Mensagem de sucesso (\"Título(s) enviado(s) com sucesso!\") ou do erro de negócio |\n| `response.Code` | null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false` (HTTP 400 — erro de validação de entrada):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` no erro de validação de entrada (HTTP 400). |\n\n## Erros comuns\n| Situação | HTTP | success | response.Type | Mensagem |\n|---|---|---|---|---|\n| Fatura não encontrada | 400 | false | — | \"Fatura não encontrada.\" |\n| Cliente sem celular cadastrado | 400 | false | — | \"Cliente sem celular cadastrado, impossível enviar SMS.\" |\n| Módulo de SMS desabilitado para a empresa | 200 | true | 2 | \"Módulo para envio de SMS não disponível\" |\n| Título não encontrado (segunda checagem, mais restrita) | 200 | true | 2 | \"Título não encontrado\" |\n| Boleto sem linha digitável | 200 | true | 2 | \"Boleto sem linha digitável, impossível enviar\" |\n| Título já quitado | 200 | true | 2 | \"Título já quitado, impossível enviar\" |\n\n## Fluxo relacionado\n- \"Envia PDF do boleto por e-mail\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `id_fatura`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"Type\": 0,\n        \"Message\": \"Título(s) enviado(s) com sucesso!\",\n        \"Code\": null\n    },\n    \"elapsedTime\": null\n}"},{"id":"62c7b67d-9c26-b369-9aa7-bdaed5af72bf","name":"Erro — Fatura não encontrada","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletsms/{{id_fatura}}","description":"## Propósito\nEnvia por SMS a linha digitável do boleto de uma fatura para o celular cadastrado do cliente, a partir do ID da fatura.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em algum método de consulta de faturas.\n- Módulo de envio de SMS habilitado para a empresa.\n\n## Regras de negócio\n- **Body:** nenhum — o `id_fatura` vai na URL.\n- O celular do cliente é resolvido automaticamente a partir do cadastro (celular principal, com fallback para o celular secundário) — o terceiro **não** informa o número.\n- A fatura precisa existir e ser elegível (não pode ser uma parcela interna de boleto agrupado). Há uma segunda validação, mais restrita, feita já dentro do envio do SMS: o título também precisa ser definitivo, não estar perdido, não estar finalizado e não estar renegociado — se falhar apenas nessa segunda checagem, o erro é reportado de forma diferente (ver \"Erros comuns\").\n- O boleto precisa ter linha digitável gerada.\n- A fatura não pode estar quitada (saldo zerado).\n- Módulo de envio de SMS precisa estar habilitado para a empresa.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| id_fatura | Path (`/financial/sendbilletsms/{id_fatura}`) | Sim | ID da fatura |\n\n## Estrutura da resposta\n\n⚠ **Importante:** existem dois níveis de erro distintos aqui. Erros de validação de entrada (fatura não encontrada, cliente sem celular) retornam `HTTP 400` com `success: false` e `response: null`. Já erros de regra de negócio do próprio envio (título já quitado, boleto sem linha digitável, título não elegível para envio, módulo de SMS desabilitado) retornam **HTTP 200** com `success: true`, porém `response.Type: 2` — o status HTTP e o `success` sozinhos não garantem que o SMS foi enviado; sempre confira `response.Type`.\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a fatura foi localizada e o cliente possui celular cadastrado (não indica, por si só, que o SMS foi efetivamente enviado — ver abaixo) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`, presente apenas nos erros de validação de entrada (HTTP 400). `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true` (HTTP 200 — fatura localizada e cliente com celular):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.Type` | integer | `0` = SMS enviado com sucesso; `2` = erro de regra de negócio do próprio envio (ver \"Erros comuns\") |\n| `response.Message` | string | Mensagem de sucesso (\"Título(s) enviado(s) com sucesso!\") ou do erro de negócio |\n| `response.Code` | null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false` (HTTP 400 — erro de validação de entrada):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` no erro de validação de entrada (HTTP 400). |\n\n## Erros comuns\n| Situação | HTTP | success | response.Type | Mensagem |\n|---|---|---|---|---|\n| Fatura não encontrada | 400 | false | — | \"Fatura não encontrada.\" |\n| Cliente sem celular cadastrado | 400 | false | — | \"Cliente sem celular cadastrado, impossível enviar SMS.\" |\n| Módulo de SMS desabilitado para a empresa | 200 | true | 2 | \"Módulo para envio de SMS não disponível\" |\n| Título não encontrado (segunda checagem, mais restrita) | 200 | true | 2 | \"Título não encontrado\" |\n| Boleto sem linha digitável | 200 | true | 2 | \"Boleto sem linha digitável, impossível enviar\" |\n| Título já quitado | 200 | true | 2 | \"Título já quitado, impossível enviar\" |\n\n## Fluxo relacionado\n- \"Envia PDF do boleto por e-mail\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `id_fatura`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Fatura não encontrada.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"5ba84b16-01c6-90f5-9103-0658b1280281","name":"Erro — Cliente sem celular cadastrado","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletsms/{{id_fatura}}","description":"## Propósito\nEnvia por SMS a linha digitável do boleto de uma fatura para o celular cadastrado do cliente, a partir do ID da fatura.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em algum método de consulta de faturas.\n- Módulo de envio de SMS habilitado para a empresa.\n\n## Regras de negócio\n- **Body:** nenhum — o `id_fatura` vai na URL.\n- O celular do cliente é resolvido automaticamente a partir do cadastro (celular principal, com fallback para o celular secundário) — o terceiro **não** informa o número.\n- A fatura precisa existir e ser elegível (não pode ser uma parcela interna de boleto agrupado). Há uma segunda validação, mais restrita, feita já dentro do envio do SMS: o título também precisa ser definitivo, não estar perdido, não estar finalizado e não estar renegociado — se falhar apenas nessa segunda checagem, o erro é reportado de forma diferente (ver \"Erros comuns\").\n- O boleto precisa ter linha digitável gerada.\n- A fatura não pode estar quitada (saldo zerado).\n- Módulo de envio de SMS precisa estar habilitado para a empresa.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| id_fatura | Path (`/financial/sendbilletsms/{id_fatura}`) | Sim | ID da fatura |\n\n## Estrutura da resposta\n\n⚠ **Importante:** existem dois níveis de erro distintos aqui. Erros de validação de entrada (fatura não encontrada, cliente sem celular) retornam `HTTP 400` com `success: false` e `response: null`. Já erros de regra de negócio do próprio envio (título já quitado, boleto sem linha digitável, título não elegível para envio, módulo de SMS desabilitado) retornam **HTTP 200** com `success: true`, porém `response.Type: 2` — o status HTTP e o `success` sozinhos não garantem que o SMS foi enviado; sempre confira `response.Type`.\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a fatura foi localizada e o cliente possui celular cadastrado (não indica, por si só, que o SMS foi efetivamente enviado — ver abaixo) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`, presente apenas nos erros de validação de entrada (HTTP 400). `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true` (HTTP 200 — fatura localizada e cliente com celular):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.Type` | integer | `0` = SMS enviado com sucesso; `2` = erro de regra de negócio do próprio envio (ver \"Erros comuns\") |\n| `response.Message` | string | Mensagem de sucesso (\"Título(s) enviado(s) com sucesso!\") ou do erro de negócio |\n| `response.Code` | null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false` (HTTP 400 — erro de validação de entrada):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` no erro de validação de entrada (HTTP 400). |\n\n## Erros comuns\n| Situação | HTTP | success | response.Type | Mensagem |\n|---|---|---|---|---|\n| Fatura não encontrada | 400 | false | — | \"Fatura não encontrada.\" |\n| Cliente sem celular cadastrado | 400 | false | — | \"Cliente sem celular cadastrado, impossível enviar SMS.\" |\n| Módulo de SMS desabilitado para a empresa | 200 | true | 2 | \"Módulo para envio de SMS não disponível\" |\n| Título não encontrado (segunda checagem, mais restrita) | 200 | true | 2 | \"Título não encontrado\" |\n| Boleto sem linha digitável | 200 | true | 2 | \"Boleto sem linha digitável, impossível enviar\" |\n| Título já quitado | 200 | true | 2 | \"Título já quitado, impossível enviar\" |\n\n## Fluxo relacionado\n- \"Envia PDF do boleto por e-mail\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `id_fatura`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Cliente sem celular cadastrado, impossível enviar SMS.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"916634d0-1b77-0fe3-9d24-138e6645c49f","name":"Erro de negócio do envio — Título já quitado (HTTP 200)","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletsms/{{id_fatura}}","description":"## Propósito\nEnvia por SMS a linha digitável do boleto de uma fatura para o celular cadastrado do cliente, a partir do ID da fatura.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- ID da fatura (`id_fatura`), obtido em algum método de consulta de faturas.\n- Módulo de envio de SMS habilitado para a empresa.\n\n## Regras de negócio\n- **Body:** nenhum — o `id_fatura` vai na URL.\n- O celular do cliente é resolvido automaticamente a partir do cadastro (celular principal, com fallback para o celular secundário) — o terceiro **não** informa o número.\n- A fatura precisa existir e ser elegível (não pode ser uma parcela interna de boleto agrupado). Há uma segunda validação, mais restrita, feita já dentro do envio do SMS: o título também precisa ser definitivo, não estar perdido, não estar finalizado e não estar renegociado — se falhar apenas nessa segunda checagem, o erro é reportado de forma diferente (ver \"Erros comuns\").\n- O boleto precisa ter linha digitável gerada.\n- A fatura não pode estar quitada (saldo zerado).\n- Módulo de envio de SMS precisa estar habilitado para a empresa.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Local | Obrigatório | Descrição |\n|---|---|---|---|\n| id_fatura | Path (`/financial/sendbilletsms/{id_fatura}`) | Sim | ID da fatura |\n\n## Estrutura da resposta\n\n⚠ **Importante:** existem dois níveis de erro distintos aqui. Erros de validação de entrada (fatura não encontrada, cliente sem celular) retornam `HTTP 400` com `success: false` e `response: null`. Já erros de regra de negócio do próprio envio (título já quitado, boleto sem linha digitável, título não elegível para envio, módulo de SMS desabilitado) retornam **HTTP 200** com `success: true`, porém `response.Type: 2` — o status HTTP e o `success` sozinhos não garantem que o SMS foi enviado; sempre confira `response.Type`.\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a fatura foi localizada e o cliente possui celular cadastrado (não indica, por si só, que o SMS foi efetivamente enviado — ver abaixo) |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`, presente apenas nos erros de validação de entrada (HTTP 400). `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true` (HTTP 200 — fatura localizada e cliente com celular):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.Type` | integer | `0` = SMS enviado com sucesso; `2` = erro de regra de negócio do próprio envio (ver \"Erros comuns\") |\n| `response.Message` | string | Mensagem de sucesso (\"Título(s) enviado(s) com sucesso!\") ou do erro de negócio |\n| `response.Code` | null | Não utilizado neste endpoint (sempre `null`) |\n\n**Quando `success: false` (HTTP 400 — erro de validação de entrada):**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` no erro de validação de entrada (HTTP 400). |\n\n## Erros comuns\n| Situação | HTTP | success | response.Type | Mensagem |\n|---|---|---|---|---|\n| Fatura não encontrada | 400 | false | — | \"Fatura não encontrada.\" |\n| Cliente sem celular cadastrado | 400 | false | — | \"Cliente sem celular cadastrado, impossível enviar SMS.\" |\n| Módulo de SMS desabilitado para a empresa | 200 | true | 2 | \"Módulo para envio de SMS não disponível\" |\n| Título não encontrado (segunda checagem, mais restrita) | 200 | true | 2 | \"Título não encontrado\" |\n| Boleto sem linha digitável | 200 | true | 2 | \"Boleto sem linha digitável, impossível enviar\" |\n| Título já quitado | 200 | true | 2 | \"Título já quitado, impossível enviar\" |\n\n## Fluxo relacionado\n- \"Envia PDF do boleto por e-mail\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `id_fatura`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"Type\": 2,\n        \"Message\": \"Título já quitado, impossível enviar\",\n        \"Code\": null\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"cd80ba72-9585-70bb-9d51-96145922f50c"},{"name":"Envia PDF do boleto por e-mail","id":"7ecf3d71-e3c7-fad1-3a64-f2ed566006b1","request":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"titleId\": {{id_fatura}},\n    \"email\": \"cliente@teste.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletbyemail","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Envia o PDF do boleto de uma fatura por e-mail, usando o mesmo mecanismo de geração de PDF da 2ª via de boleto da tela de atendimento.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>).</li>\n<li>Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" configurado em Configurações &gt; Faturamento.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A fatura precisa existir e estar em aberto (mesma regra de elegibilidade dos demais métodos de boleto).</li>\n<li>Quando <code>email</code> não é informado, o sistema resolve o destinatário a partir do cadastro do cliente/contrato, na mesma prioridade usada pelo envio do comunicado de faturamento: e-mail de NF-e do responsável financeiro do contrato → e-mail do responsável financeiro do contrato → e-mail de NF-e do cliente → e-mail do cliente. Se nenhum desses existir, a operação falha.</li>\n<li>O boleto é protegido por senha (6 primeiros dígitos do CPF/CNPJ) quando essa opção estiver habilitada nas configurações de faturamento da empresa.</li>\n<li>O assunto e o corpo do e-mail seguem o Modelo de E-mail configurado no parâmetro acima; esse modelo precisa estar configurado para o envio funcionar.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>titleId</td>\n<td>long</td>\n<td>Sim</td>\n<td>ID da fatura cujo boleto será enviado</td>\n</tr>\n<tr>\n<td>email</td>\n<td>string</td>\n<td>Não</td>\n<td>Endereço(s) de e-mail de destino, separados por <code>;</code> quando houver mais de um. Quando omitido, usa o e-mail já cadastrado do cliente/contrato</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se o e-mail foi enviado com sucesso</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.sent</code></td>\n<td>boolean</td>\n<td>Indica se o envio foi efetivado</td>\n</tr>\n<tr>\n<td><code>response.recipients</code></td>\n<td>array</td>\n<td>Lista de e-mails que efetivamente receberam o boleto</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code>/ausente em erro.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Fatura não encontrada ou não elegível</td>\n<td>400</td>\n<td>\"Fatura não encontrada.\"</td>\n</tr>\n<tr>\n<td>Modelo de e-mail não configurado nas Configurações de Faturamento</td>\n<td>400</td>\n<td>\"Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" não configurado. Configure-o em Configurações &gt; Faturamento.\"</td>\n</tr>\n<tr>\n<td><code>email</code> não informado e cliente/contrato sem nenhum e-mail cadastrado</td>\n<td>400</td>\n<td>\"Email não informado e o cliente não possui e-mail cadastrado.\"</td>\n</tr>\n<tr>\n<td>Nenhum e-mail válido resolvido (informado ou cadastrado)</td>\n<td>400</td>\n<td>\"Email(s) inválido(s).\"</td>\n</tr>\n<tr>\n<td>Falha ao gerar o PDF do boleto ou ao enviar o e-mail</td>\n<td>400</td>\n<td>\"Erro ao gerar o Boleto.\" / mensagem de falha do serviço de e-mail</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Envia linha digitável do boleto por SMS\" — canal alternativo de envio do boleto.</li>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o <code>titleId</code>.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","sendbilletbyemail"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"f44febd2-ee52-7b94-7a91-3ec9721dbe45","name":"Sucesso","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"titleId\": {{id_fatura}},\n    \"email\": \"cliente@teste.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletbyemail","description":"## Propósito\nEnvia o PDF do boleto de uma fatura por e-mail, usando o mesmo mecanismo de geração de PDF da 2ª via de boleto da tela de atendimento.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" configurado em Configurações > Faturamento.\n\n## Regras de negócio\n- A fatura precisa existir e estar em aberto (mesma regra de elegibilidade dos demais métodos de boleto).\n- Quando `email` não é informado, o sistema resolve o destinatário a partir do cadastro do cliente/contrato, na mesma prioridade usada pelo envio do comunicado de faturamento: e-mail de NF-e do responsável financeiro do contrato → e-mail do responsável financeiro do contrato → e-mail de NF-e do cliente → e-mail do cliente. Se nenhum desses existir, a operação falha.\n- O boleto é protegido por senha (6 primeiros dígitos do CPF/CNPJ) quando essa opção estiver habilitada nas configurações de faturamento da empresa.\n- O assunto e o corpo do e-mail seguem o Modelo de E-mail configurado no parâmetro acima; esse modelo precisa estar configurado para o envio funcionar.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | long | Sim | ID da fatura cujo boleto será enviado |\n| email | string | Não | Endereço(s) de e-mail de destino, separados por `;` quando houver mais de um. Quando omitido, usa o e-mail já cadastrado do cliente/contrato |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o e-mail foi enviado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.sent` | boolean | Indica se o envio foi efetivado |\n| `response.recipients` | array | Lista de e-mails que efetivamente receberam o boleto |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null`/ausente em erro. |\n\n## Erros comuns\n| Situação | HTTP | Mensagem |\n|---|---|---|\n| Fatura não encontrada ou não elegível | 400 | \"Fatura não encontrada.\" |\n| Modelo de e-mail não configurado nas Configurações de Faturamento | 400 | \"Parâmetro \\\"Modelo de e-mail para envio de 2ª via de boleto por API\\\" não configurado. Configure-o em Configurações > Faturamento.\" |\n| `email` não informado e cliente/contrato sem nenhum e-mail cadastrado | 400 | \"Email não informado e o cliente não possui e-mail cadastrado.\" |\n| Nenhum e-mail válido resolvido (informado ou cadastrado) | 400 | \"Email(s) inválido(s).\" |\n| Falha ao gerar o PDF do boleto ou ao enviar o e-mail | 400 | \"Erro ao gerar o Boleto.\" / mensagem de falha do serviço de e-mail |\n\n## Fluxo relacionado\n- \"Envia linha digitável do boleto por SMS\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `titleId`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"sent\": true,\n        \"recipients\": [\n            \"cliente@teste.com\"\n        ]\n    }\n}"},{"id":"f2fd16a2-9ce8-a13c-646b-6952c21f4395","name":"Erro — Fatura não encontrada","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"titleId\": {{id_fatura}},\n    \"email\": \"cliente@teste.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletbyemail","description":"## Propósito\nEnvia o PDF do boleto de uma fatura por e-mail, usando o mesmo mecanismo de geração de PDF da 2ª via de boleto da tela de atendimento.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" configurado em Configurações > Faturamento.\n\n## Regras de negócio\n- A fatura precisa existir e estar em aberto (mesma regra de elegibilidade dos demais métodos de boleto).\n- Quando `email` não é informado, o sistema resolve o destinatário a partir do cadastro do cliente/contrato, na mesma prioridade usada pelo envio do comunicado de faturamento: e-mail de NF-e do responsável financeiro do contrato → e-mail do responsável financeiro do contrato → e-mail de NF-e do cliente → e-mail do cliente. Se nenhum desses existir, a operação falha.\n- O boleto é protegido por senha (6 primeiros dígitos do CPF/CNPJ) quando essa opção estiver habilitada nas configurações de faturamento da empresa.\n- O assunto e o corpo do e-mail seguem o Modelo de E-mail configurado no parâmetro acima; esse modelo precisa estar configurado para o envio funcionar.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | long | Sim | ID da fatura cujo boleto será enviado |\n| email | string | Não | Endereço(s) de e-mail de destino, separados por `;` quando houver mais de um. Quando omitido, usa o e-mail já cadastrado do cliente/contrato |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o e-mail foi enviado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.sent` | boolean | Indica se o envio foi efetivado |\n| `response.recipients` | array | Lista de e-mails que efetivamente receberam o boleto |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null`/ausente em erro. |\n\n## Erros comuns\n| Situação | HTTP | Mensagem |\n|---|---|---|\n| Fatura não encontrada ou não elegível | 400 | \"Fatura não encontrada.\" |\n| Modelo de e-mail não configurado nas Configurações de Faturamento | 400 | \"Parâmetro \\\"Modelo de e-mail para envio de 2ª via de boleto por API\\\" não configurado. Configure-o em Configurações > Faturamento.\" |\n| `email` não informado e cliente/contrato sem nenhum e-mail cadastrado | 400 | \"Email não informado e o cliente não possui e-mail cadastrado.\" |\n| Nenhum e-mail válido resolvido (informado ou cadastrado) | 400 | \"Email(s) inválido(s).\" |\n| Falha ao gerar o PDF do boleto ou ao enviar o e-mail | 400 | \"Erro ao gerar o Boleto.\" / mensagem de falha do serviço de e-mail |\n\n## Fluxo relacionado\n- \"Envia linha digitável do boleto por SMS\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `titleId`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Fatura não encontrada.\",\n            \"code\": 404,\n            \"type\": \"Error\"\n        }\n    ]\n}"},{"id":"f2413c76-3089-4cba-5d21-39a7513f5886","name":"Erro — Modelo de e-mail não configurado","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"titleId\": {{id_fatura}},\n    \"email\": \"cliente@teste.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletbyemail","description":"## Propósito\nEnvia o PDF do boleto de uma fatura por e-mail, usando o mesmo mecanismo de geração de PDF da 2ª via de boleto da tela de atendimento.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" configurado em Configurações > Faturamento.\n\n## Regras de negócio\n- A fatura precisa existir e estar em aberto (mesma regra de elegibilidade dos demais métodos de boleto).\n- Quando `email` não é informado, o sistema resolve o destinatário a partir do cadastro do cliente/contrato, na mesma prioridade usada pelo envio do comunicado de faturamento: e-mail de NF-e do responsável financeiro do contrato → e-mail do responsável financeiro do contrato → e-mail de NF-e do cliente → e-mail do cliente. Se nenhum desses existir, a operação falha.\n- O boleto é protegido por senha (6 primeiros dígitos do CPF/CNPJ) quando essa opção estiver habilitada nas configurações de faturamento da empresa.\n- O assunto e o corpo do e-mail seguem o Modelo de E-mail configurado no parâmetro acima; esse modelo precisa estar configurado para o envio funcionar.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | long | Sim | ID da fatura cujo boleto será enviado |\n| email | string | Não | Endereço(s) de e-mail de destino, separados por `;` quando houver mais de um. Quando omitido, usa o e-mail já cadastrado do cliente/contrato |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o e-mail foi enviado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.sent` | boolean | Indica se o envio foi efetivado |\n| `response.recipients` | array | Lista de e-mails que efetivamente receberam o boleto |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null`/ausente em erro. |\n\n## Erros comuns\n| Situação | HTTP | Mensagem |\n|---|---|---|\n| Fatura não encontrada ou não elegível | 400 | \"Fatura não encontrada.\" |\n| Modelo de e-mail não configurado nas Configurações de Faturamento | 400 | \"Parâmetro \\\"Modelo de e-mail para envio de 2ª via de boleto por API\\\" não configurado. Configure-o em Configurações > Faturamento.\" |\n| `email` não informado e cliente/contrato sem nenhum e-mail cadastrado | 400 | \"Email não informado e o cliente não possui e-mail cadastrado.\" |\n| Nenhum e-mail válido resolvido (informado ou cadastrado) | 400 | \"Email(s) inválido(s).\" |\n| Falha ao gerar o PDF do boleto ou ao enviar o e-mail | 400 | \"Erro ao gerar o Boleto.\" / mensagem de falha do serviço de e-mail |\n\n## Fluxo relacionado\n- \"Envia linha digitável do boleto por SMS\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `titleId`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Parâmetro \\\"Modelo de e-mail para envio de 2ª via de boleto por API\\\" não configurado. Configure-o em Configurações > Faturamento.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ]\n}"},{"id":"da1aceee-bbff-7926-3e65-c786d51230d1","name":"Erro — E-mail não informado e cliente sem e-mail cadastrado","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n    \"titleId\": {{id_fatura}},\n    \"email\": \"cliente@teste.com\"\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/sendbilletbyemail","description":"## Propósito\nEnvia o PDF do boleto de uma fatura por e-mail, usando o mesmo mecanismo de geração de PDF da 2ª via de boleto da tela de atendimento.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`).\n- Parâmetro \"Modelo de e-mail para envio de 2ª via de boleto por API\" configurado em Configurações > Faturamento.\n\n## Regras de negócio\n- A fatura precisa existir e estar em aberto (mesma regra de elegibilidade dos demais métodos de boleto).\n- Quando `email` não é informado, o sistema resolve o destinatário a partir do cadastro do cliente/contrato, na mesma prioridade usada pelo envio do comunicado de faturamento: e-mail de NF-e do responsável financeiro do contrato → e-mail do responsável financeiro do contrato → e-mail de NF-e do cliente → e-mail do cliente. Se nenhum desses existir, a operação falha.\n- O boleto é protegido por senha (6 primeiros dígitos do CPF/CNPJ) quando essa opção estiver habilitada nas configurações de faturamento da empresa.\n- O assunto e o corpo do e-mail seguem o Modelo de E-mail configurado no parâmetro acima; esse modelo precisa estar configurado para o envio funcionar.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| titleId | long | Sim | ID da fatura cujo boleto será enviado |\n| email | string | Não | Endereço(s) de e-mail de destino, separados por `;` quando houver mais de um. Quando omitido, usa o e-mail já cadastrado do cliente/contrato |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se o e-mail foi enviado com sucesso |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.sent` | boolean | Indica se o envio foi efetivado |\n| `response.recipients` | array | Lista de e-mails que efetivamente receberam o boleto |\n\n**Quando `success: false`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null`/ausente em erro. |\n\n## Erros comuns\n| Situação | HTTP | Mensagem |\n|---|---|---|\n| Fatura não encontrada ou não elegível | 400 | \"Fatura não encontrada.\" |\n| Modelo de e-mail não configurado nas Configurações de Faturamento | 400 | \"Parâmetro \\\"Modelo de e-mail para envio de 2ª via de boleto por API\\\" não configurado. Configure-o em Configurações > Faturamento.\" |\n| `email` não informado e cliente/contrato sem nenhum e-mail cadastrado | 400 | \"Email não informado e o cliente não possui e-mail cadastrado.\" |\n| Nenhum e-mail válido resolvido (informado ou cadastrado) | 400 | \"Email(s) inválido(s).\" |\n| Falha ao gerar o PDF do boleto ou ao enviar o e-mail | 400 | \"Erro ao gerar o Boleto.\" / mensagem de falha do serviço de e-mail |\n\n## Fluxo relacionado\n- \"Envia linha digitável do boleto por SMS\" — canal alternativo de envio do boleto.\n- \"Busca faturas em aberto por CPF/CNPJ\" / \"por contrato\" — para obter o `titleId`."},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Email não informado e o cliente não possui e-mail cadastrado.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ]\n}"}],"_postman_id":"7ecf3d71-e3c7-fad1-3a64-f2ed566006b1"},{"name":"Desfaz renegociação","id":"cb27bde2-732b-4554-b35c-a573a0a383e9","request":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Desfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Token de autenticação válido (<code>Authorization: Bearer {{access_token}}</code>), de um usuário integrador.</li>\n<li>Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o <code>id</code> de um dos títulos gerados por ela: é o campo <code>id</code> de cada item de <code>parcels</code> na resposta daquele endpoint.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>A renegociação é identificada pelo título gerado informado (<code>financialReceivableTitleId</code>), e não pelo id da renegociação.</li>\n<li><strong>Regra de posse:</strong> o <code>clientId</code> informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.</li>\n<li>Só é possível desfazer uma <strong>renegociação</strong>. Reparcelamento é recusado.</li>\n<li>É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).</li>\n<li>É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.</li>\n<li>Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.</li>\n<li>Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.</li>\n<li>Se a operação falhar no meio, nenhuma alteração é mantida.</li>\n<li>Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam <strong>HTTP 200</strong> com <code>success: false</code> (e não 400). Sempre verifique <code>success</code> e <code>messages</code> na resposta.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>clientId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id do cliente dono do título e da renegociação. Deve ser maior que zero.</td>\n</tr>\n<tr>\n<td>financialReceivableTitleId</td>\n<td>long</td>\n<td>Sim</td>\n<td>Id de um título gerado pela renegociação (<code>parcels[].id</code> em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado.</td>\n</tr>\n<tr>\n<td>justification</td>\n<td>string</td>\n<td>Sim</td>\n<td>Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a renegociação foi desfeita</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code>. <code>null</code> em sucesso. Em recusa de negócio vem um item com <code>type: \"Error\"</code> e <code>code: 300</code>. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"quando-success-true\">Quando <code>success: true</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>response.financialRenegotiationId</code></td>\n<td>long</td>\n<td>Id da renegociação que foi desfeita</td>\n</tr>\n<tr>\n<td><code>response.reopenedTitleIds</code></td>\n<td>array de long</td>\n<td>Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles</td>\n</tr>\n<tr>\n<td><code>response.deletedTitleIds</code></td>\n<td>array de long</td>\n<td>Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"quando-success-false\">Quando <code>success: false</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>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> em recusa. O motivo está em <code>messages[0].message</code>.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Todas as recusas abaixo retornam HTTP 200 com <code>success: false</code> e nada é alterado.</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n<th>success</th>\n<th>Mensagem</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientId</code> ou <code>financialReceivableTitleId</code> ausente ou menor ou igual a zero</td>\n<td>200</td>\n<td>false</td>\n<td>\"Informe o cliente e o título gerado pela renegociação.\"</td>\n</tr>\n<tr>\n<td><code>justification</code> vazia ou só com espaços</td>\n<td>200</td>\n<td>false</td>\n<td>\"A justificativa é obrigatória.\"</td>\n</tr>\n<tr>\n<td>Título inexistente, de outro cliente, ou renegociação de outro cliente</td>\n<td>200</td>\n<td>false</td>\n<td>\"O título não pertence ao cliente informado.\"</td>\n</tr>\n<tr>\n<td>O título informado não foi gerado por uma renegociação (por exemplo, é o título original)</td>\n<td>200</td>\n<td>false</td>\n<td>\"O título informado não foi gerado por uma renegociação.\"</td>\n</tr>\n<tr>\n<td>A renegociação já foi desfeita</td>\n<td>200</td>\n<td>false</td>\n<td>\"A renegociação deste título já foi desfeita.\"</td>\n</tr>\n<tr>\n<td>A renegociação é um reparcelamento</td>\n<td>200</td>\n<td>false</td>\n<td>\"Reparcelamento não pode ser desfeito por esta API.\"</td>\n</tr>\n<tr>\n<td>Algum título gerado já foi renegociado novamente</td>\n<td>200</td>\n<td>false</td>\n<td>\"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\"</td>\n</tr>\n<tr>\n<td>Algum título gerado já foi pago (total ou parcialmente)</td>\n<td>200</td>\n<td>false</td>\n<td>\"Não é possível desfazer: há título da renegociação já pago.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ul>\n<li>\"Efetiva renegociação\": gera as parcelas da renegociação; o <code>id</code> de cada item de <code>parcels</code> na resposta é o valor de <code>financialReceivableTitleId</code> deste endpoint.</li>\n<li>\"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer.</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","financial","undorenegotiation"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"29a42548-465e-4a88-bd81-0332a169de6f","name":"Sucesso","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"## Propósito\nDesfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), de um usuário integrador.\n- Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o `id` de um dos títulos gerados por ela: é o campo `id` de cada item de `parcels` na resposta daquele endpoint.\n\n## Regras de negócio\n- A renegociação é identificada pelo título gerado informado (`financialReceivableTitleId`), e não pelo id da renegociação.\n- **Regra de posse:** o `clientId` informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.\n- Só é possível desfazer uma **renegociação**. Reparcelamento é recusado.\n- É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).\n- É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.\n- Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.\n- Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.\n- Se a operação falhar no meio, nenhuma alteração é mantida.\n- Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam **HTTP 200** com `success: false` (e não 400). Sempre verifique `success` e `messages` na resposta.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| clientId | long | Sim | Id do cliente dono do título e da renegociação. Deve ser maior que zero. |\n| financialReceivableTitleId | long | Sim | Id de um título gerado pela renegociação (`parcels[].id` em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado. |\n| justification | string | Sim | Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando a renegociação foi desfeita |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`. `null` em sucesso. Em recusa de negócio vem um item com `type: \"Error\"` e `code: 300`. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.financialRenegotiationId` | long | Id da renegociação que foi desfeita |\n| `response.reopenedTitleIds` | array de long | Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles |\n| `response.deletedTitleIds` | array de long | Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles |\n\n### Quando `success: false`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em recusa. O motivo está em `messages[0].message`. |\n\n## Erros comuns\nTodas as recusas abaixo retornam HTTP 200 com `success: false` e nada é alterado.\n\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `clientId` ou `financialReceivableTitleId` ausente ou menor ou igual a zero | 200 | false | \"Informe o cliente e o título gerado pela renegociação.\" |\n| `justification` vazia ou só com espaços | 200 | false | \"A justificativa é obrigatória.\" |\n| Título inexistente, de outro cliente, ou renegociação de outro cliente | 200 | false | \"O título não pertence ao cliente informado.\" |\n| O título informado não foi gerado por uma renegociação (por exemplo, é o título original) | 200 | false | \"O título informado não foi gerado por uma renegociação.\" |\n| A renegociação já foi desfeita | 200 | false | \"A renegociação deste título já foi desfeita.\" |\n| A renegociação é um reparcelamento | 200 | false | \"Reparcelamento não pode ser desfeito por esta API.\" |\n| Algum título gerado já foi renegociado novamente | 200 | false | \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\" |\n| Algum título gerado já foi pago (total ou parcialmente) | 200 | false | \"Não é possível desfazer: há título da renegociação já pago.\" |\n\n## Fluxo relacionado\n- \"Efetiva renegociação\": gera as parcelas da renegociação; o `id` de cada item de `parcels` na resposta é o valor de `financialReceivableTitleId` deste endpoint.\n- \"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"financialRenegotiationId\": 3174, // Id da renegociação que foi desfeita\n        \"reopenedTitleIds\": [141519], // Título original que voltou a ficar em aberto\n        \"deletedTitleIds\": [141689, 141688] // Título gerado pela renegociação e a parcela com boleto próprio dele, excluídos\n    },\n    \"elapsedTime\": null\n}"},{"id":"0a8746fa-f96e-47e9-bed6-9694038df19c","name":"Erro — renegociação já desfeita","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"## Propósito\nDesfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), de um usuário integrador.\n- Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o `id` de um dos títulos gerados por ela: é o campo `id` de cada item de `parcels` na resposta daquele endpoint.\n\n## Regras de negócio\n- A renegociação é identificada pelo título gerado informado (`financialReceivableTitleId`), e não pelo id da renegociação.\n- **Regra de posse:** o `clientId` informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.\n- Só é possível desfazer uma **renegociação**. Reparcelamento é recusado.\n- É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).\n- É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.\n- Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.\n- Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.\n- Se a operação falhar no meio, nenhuma alteração é mantida.\n- Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam **HTTP 200** com `success: false` (e não 400). Sempre verifique `success` e `messages` na resposta.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| clientId | long | Sim | Id do cliente dono do título e da renegociação. Deve ser maior que zero. |\n| financialReceivableTitleId | long | Sim | Id de um título gerado pela renegociação (`parcels[].id` em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado. |\n| justification | string | Sim | Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando a renegociação foi desfeita |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`. `null` em sucesso. Em recusa de negócio vem um item com `type: \"Error\"` e `code: 300`. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.financialRenegotiationId` | long | Id da renegociação que foi desfeita |\n| `response.reopenedTitleIds` | array de long | Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles |\n| `response.deletedTitleIds` | array de long | Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles |\n\n### Quando `success: false`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em recusa. O motivo está em `messages[0].message`. |\n\n## Erros comuns\nTodas as recusas abaixo retornam HTTP 200 com `success: false` e nada é alterado.\n\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `clientId` ou `financialReceivableTitleId` ausente ou menor ou igual a zero | 200 | false | \"Informe o cliente e o título gerado pela renegociação.\" |\n| `justification` vazia ou só com espaços | 200 | false | \"A justificativa é obrigatória.\" |\n| Título inexistente, de outro cliente, ou renegociação de outro cliente | 200 | false | \"O título não pertence ao cliente informado.\" |\n| O título informado não foi gerado por uma renegociação (por exemplo, é o título original) | 200 | false | \"O título informado não foi gerado por uma renegociação.\" |\n| A renegociação já foi desfeita | 200 | false | \"A renegociação deste título já foi desfeita.\" |\n| A renegociação é um reparcelamento | 200 | false | \"Reparcelamento não pode ser desfeito por esta API.\" |\n| Algum título gerado já foi renegociado novamente | 200 | false | \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\" |\n| Algum título gerado já foi pago (total ou parcialmente) | 200 | false | \"Não é possível desfazer: há título da renegociação já pago.\" |\n\n## Fluxo relacionado\n- \"Efetiva renegociação\": gera as parcelas da renegociação; o `id` de cada item de `parcels` na resposta é o valor de `financialReceivableTitleId` deste endpoint.\n- \"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"A renegociação deste título já foi desfeita.\", \"code\": 300 }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"ed5fa133-abe5-49c6-bc8c-ef0a25e8fd5e","name":"Erro — título gerado já pago","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"## Propósito\nDesfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), de um usuário integrador.\n- Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o `id` de um dos títulos gerados por ela: é o campo `id` de cada item de `parcels` na resposta daquele endpoint.\n\n## Regras de negócio\n- A renegociação é identificada pelo título gerado informado (`financialReceivableTitleId`), e não pelo id da renegociação.\n- **Regra de posse:** o `clientId` informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.\n- Só é possível desfazer uma **renegociação**. Reparcelamento é recusado.\n- É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).\n- É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.\n- Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.\n- Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.\n- Se a operação falhar no meio, nenhuma alteração é mantida.\n- Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam **HTTP 200** com `success: false` (e não 400). Sempre verifique `success` e `messages` na resposta.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| clientId | long | Sim | Id do cliente dono do título e da renegociação. Deve ser maior que zero. |\n| financialReceivableTitleId | long | Sim | Id de um título gerado pela renegociação (`parcels[].id` em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado. |\n| justification | string | Sim | Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando a renegociação foi desfeita |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`. `null` em sucesso. Em recusa de negócio vem um item com `type: \"Error\"` e `code: 300`. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.financialRenegotiationId` | long | Id da renegociação que foi desfeita |\n| `response.reopenedTitleIds` | array de long | Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles |\n| `response.deletedTitleIds` | array de long | Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles |\n\n### Quando `success: false`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em recusa. O motivo está em `messages[0].message`. |\n\n## Erros comuns\nTodas as recusas abaixo retornam HTTP 200 com `success: false` e nada é alterado.\n\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `clientId` ou `financialReceivableTitleId` ausente ou menor ou igual a zero | 200 | false | \"Informe o cliente e o título gerado pela renegociação.\" |\n| `justification` vazia ou só com espaços | 200 | false | \"A justificativa é obrigatória.\" |\n| Título inexistente, de outro cliente, ou renegociação de outro cliente | 200 | false | \"O título não pertence ao cliente informado.\" |\n| O título informado não foi gerado por uma renegociação (por exemplo, é o título original) | 200 | false | \"O título informado não foi gerado por uma renegociação.\" |\n| A renegociação já foi desfeita | 200 | false | \"A renegociação deste título já foi desfeita.\" |\n| A renegociação é um reparcelamento | 200 | false | \"Reparcelamento não pode ser desfeito por esta API.\" |\n| Algum título gerado já foi renegociado novamente | 200 | false | \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\" |\n| Algum título gerado já foi pago (total ou parcialmente) | 200 | false | \"Não é possível desfazer: há título da renegociação já pago.\" |\n\n## Fluxo relacionado\n- \"Efetiva renegociação\": gera as parcelas da renegociação; o `id` de cada item de `parcels` na resposta é o valor de `financialReceivableTitleId` deste endpoint.\n- \"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"Não é possível desfazer: há título da renegociação já pago.\", \"code\": 300 }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"8b164706-8f45-4fb9-9c67-c60f8238cff2","name":"Erro — título renegociado novamente","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"## Propósito\nDesfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), de um usuário integrador.\n- Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o `id` de um dos títulos gerados por ela: é o campo `id` de cada item de `parcels` na resposta daquele endpoint.\n\n## Regras de negócio\n- A renegociação é identificada pelo título gerado informado (`financialReceivableTitleId`), e não pelo id da renegociação.\n- **Regra de posse:** o `clientId` informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.\n- Só é possível desfazer uma **renegociação**. Reparcelamento é recusado.\n- É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).\n- É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.\n- Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.\n- Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.\n- Se a operação falhar no meio, nenhuma alteração é mantida.\n- Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam **HTTP 200** com `success: false` (e não 400). Sempre verifique `success` e `messages` na resposta.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| clientId | long | Sim | Id do cliente dono do título e da renegociação. Deve ser maior que zero. |\n| financialReceivableTitleId | long | Sim | Id de um título gerado pela renegociação (`parcels[].id` em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado. |\n| justification | string | Sim | Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando a renegociação foi desfeita |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`. `null` em sucesso. Em recusa de negócio vem um item com `type: \"Error\"` e `code: 300`. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.financialRenegotiationId` | long | Id da renegociação que foi desfeita |\n| `response.reopenedTitleIds` | array de long | Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles |\n| `response.deletedTitleIds` | array de long | Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles |\n\n### Quando `success: false`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em recusa. O motivo está em `messages[0].message`. |\n\n## Erros comuns\nTodas as recusas abaixo retornam HTTP 200 com `success: false` e nada é alterado.\n\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `clientId` ou `financialReceivableTitleId` ausente ou menor ou igual a zero | 200 | false | \"Informe o cliente e o título gerado pela renegociação.\" |\n| `justification` vazia ou só com espaços | 200 | false | \"A justificativa é obrigatória.\" |\n| Título inexistente, de outro cliente, ou renegociação de outro cliente | 200 | false | \"O título não pertence ao cliente informado.\" |\n| O título informado não foi gerado por uma renegociação (por exemplo, é o título original) | 200 | false | \"O título informado não foi gerado por uma renegociação.\" |\n| A renegociação já foi desfeita | 200 | false | \"A renegociação deste título já foi desfeita.\" |\n| A renegociação é um reparcelamento | 200 | false | \"Reparcelamento não pode ser desfeito por esta API.\" |\n| Algum título gerado já foi renegociado novamente | 200 | false | \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\" |\n| Algum título gerado já foi pago (total ou parcialmente) | 200 | false | \"Não é possível desfazer: há título da renegociação já pago.\" |\n\n## Fluxo relacionado\n- \"Efetiva renegociação\": gera as parcelas da renegociação; o `id` de cada item de `parcels` na resposta é o valor de `financialReceivableTitleId` deste endpoint.\n- \"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\", \"code\": 300 }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"},{"id":"26000ea2-e88f-439c-b92a-5a942e635d3a","name":"Erro — título não pertence ao cliente","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"accept"},{"value":"Bearer {{access_token}}","key":"Authorization"},{"value":"application/json","key":"Content-Type"}],"body":{"mode":"raw","raw":"{\n    \"clientId\": 0, //(long, obrigatório) — Id do cliente dono do título e da renegociação.\n    \"financialReceivableTitleId\": 0, //(long, obrigatório) — Id de um título gerado pela renegociação (campo `id` de cada item de `parcels` na resposta de \"Efetiva renegociação\").\n    \"justification\": \"\" //(string, obrigatório) — Justificativa do cancelamento; gravada na ocorrência de cada título envolvido.\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/integrations/thirdparty/financial/undorenegotiation","description":"## Propósito\nDesfaz uma renegociação de faturas já efetivada, a partir de um dos títulos gerados por ela. Os títulos originais voltam a ficar em aberto, os títulos gerados pela renegociação (e as parcelas com boleto próprio deles) são excluídos, e cada título envolvido recebe uma ocorrência de cancelamento da renegociação com a justificativa informada. Use quando o acordo não será cumprido ou foi feito por engano e nenhuma parcela gerada foi paga.\n\n## Pré-requisitos\n- Token de autenticação válido (`Authorization: Bearer {{access_token}}`), de um usuário integrador.\n- Uma renegociação já efetivada (ver \"Efetiva renegociação\") e o `id` de um dos títulos gerados por ela: é o campo `id` de cada item de `parcels` na resposta daquele endpoint.\n\n## Regras de negócio\n- A renegociação é identificada pelo título gerado informado (`financialReceivableTitleId`), e não pelo id da renegociação.\n- **Regra de posse:** o `clientId` informado precisa ser o dono do título e também da renegociação. Se não for, a operação é recusada com \"O título não pertence ao cliente informado.\" antes de qualquer alteração.\n- Só é possível desfazer uma **renegociação**. Reparcelamento é recusado.\n- É recusado se qualquer título gerado pela renegociação já foi pago, total ou parcialmente (saldo zerado, recebimento registrado ou pagamento já avisado pelo banco).\n- É recusado se algum título gerado já foi renegociado novamente. Nesse caso, desfaça primeiro a renegociação mais recente.\n- Chamar de novo para uma renegociação que já foi desfeita é recusado e não altera nada.\n- Ao desfazer: os títulos originais deixam de constar como renegociados e voltam a ficar em aberto (o tratamento do nosso número e da remessa dos originais é o mesmo do cancelamento de renegociação feito dentro do ERP); os títulos gerados e as parcelas com boleto próprio deles são excluídos; os títulos gerados que já tinham sido enviados em remessa recebem a instrução de baixa ao banco; a justificativa é gravada na ocorrência de cancelamento de cada título.\n- Se a operação falhar no meio, nenhuma alteração é mantida.\n- Diferente de outros endpoints de Financeiro desta collection, as recusas de negócio retornam **HTTP 200** com `success: false` (e não 400). Sempre verifique `success` e `messages` na resposta.\n\n## Campos obrigatórios e valores aceitos\n| Campo | Tipo | Obrigatório | Descrição |\n|---|---|---|---|\n| clientId | long | Sim | Id do cliente dono do título e da renegociação. Deve ser maior que zero. |\n| financialReceivableTitleId | long | Sim | Id de um título gerado pela renegociação (`parcels[].id` em \"Efetiva renegociação\"). Deve ser maior que zero. Informar o id de um título original (o que foi renegociado) é recusado. |\n| justification | string | Sim | Justificativa do cancelamento, gravada na ocorrência de cada título. Texto vazio ou só com espaços é recusado. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando a renegociação foi desfeita |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }`. `null` em sucesso. Em recusa de negócio vem um item com `type: \"Error\"` e `code: 300`. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n### Quando `success: true`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.financialRenegotiationId` | long | Id da renegociação que foi desfeita |\n| `response.reopenedTitleIds` | array de long | Ids dos títulos originais que voltaram a ficar em aberto, incluindo as parcelas com boleto próprio deles |\n| `response.deletedTitleIds` | array de long | Ids dos títulos excluídos: os gerados pela renegociação e as parcelas com boleto próprio deles |\n\n### Quando `success: false`\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response` | null | Sempre `null` em recusa. O motivo está em `messages[0].message`. |\n\n## Erros comuns\nTodas as recusas abaixo retornam HTTP 200 com `success: false` e nada é alterado.\n\n| Situação | HTTP | success | Mensagem |\n|---|---|---|---|\n| `clientId` ou `financialReceivableTitleId` ausente ou menor ou igual a zero | 200 | false | \"Informe o cliente e o título gerado pela renegociação.\" |\n| `justification` vazia ou só com espaços | 200 | false | \"A justificativa é obrigatória.\" |\n| Título inexistente, de outro cliente, ou renegociação de outro cliente | 200 | false | \"O título não pertence ao cliente informado.\" |\n| O título informado não foi gerado por uma renegociação (por exemplo, é o título original) | 200 | false | \"O título informado não foi gerado por uma renegociação.\" |\n| A renegociação já foi desfeita | 200 | false | \"A renegociação deste título já foi desfeita.\" |\n| A renegociação é um reparcelamento | 200 | false | \"Reparcelamento não pode ser desfeito por esta API.\" |\n| Algum título gerado já foi renegociado novamente | 200 | false | \"Não é possível desfazer: um título da renegociação já foi renegociado novamente.\" |\n| Algum título gerado já foi pago (total ou parcialmente) | 200 | false | \"Não é possível desfazer: há título da renegociação já pago.\" |\n\n## Fluxo relacionado\n- \"Efetiva renegociação\": gera as parcelas da renegociação; o `id` de cada item de `parcels` na resposta é o valor de `financialReceivableTitleId` deste endpoint.\n- \"Busca faturas em aberto por CPF/CNPJ\" ou \"Busca faturas em aberto por contrato\": para conferir que a fatura original voltou a ficar em aberto depois de desfazer."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        { \"type\": \"Error\", \"message\": \"O título não pertence ao cliente informado.\", \"code\": 300 }\n    ],\n    \"response\": null,\n    \"elapsedTime\": null\n}"}],"_postman_id":"cb27bde2-732b-4554-b35c-a573a0a383e9"}],"id":"a83c2bcb-e499-4b37-8fd3-a14ff0113b7f","_postman_id":"a83c2bcb-e499-4b37-8fd3-a14ff0113b7f","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Faturamento Terceiro/Cofaturamento","item":[{"name":"Webhook","item":[{"name":"Webhook de emissão de documento fiscal","id":"c1335074-cb2d-4618-92f1-65056a6377c0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"id\": \"fe8bf662-11e9-4448-85d7-e611b8341ec3\", // Identificador da emissão de terceiros/co-faturamento no elleven\n    \"accessKey\": \"\", // Chave de acesso do documento fiscal gerado\n    \"documentNumber\": 58334, // Número do documento\n    \"serie\": \"62\", // Série\n    \"status\": 1, // Status do documento fiscal. 1 = Autorizado ou 9= Cancelado\n    \"amount\": 99.9, // Valor do item\n    \"issueDate\": \"0000-00-00\", // Data de emissão do documento\n    \"competence\": \"0000-00-00\", // Competencia\n    \"person\": { // Destinátario do documento\n        \"typeTxId\": 2, // Tipo do documento. 1 = CNPJ ou 2 = CPF\n        \"txId\": \"08507405924\", // Numero do documento (CNPJ ou CPF)\n        \"name\": \"\", // Nome do cliente\n        \"type\": 0, // Tipo do cliente. 1 - Comercial, 2 - Industrial, 3 - Residencial/Pessoa Física, 4 - Produtor Rural, 5 - Órgão da administração pública estadual direta e suas fundações e autarquias, quando mantidas pelo poder público estadual e regidas por normas de direito público, nos termos do Convênio ICMS 107/95, 6 - Prestador de serviço de telecomunicação responsável pelo recolhimento do imposto incidente sobre a cessão dos meios de rede do prestador do serviço ao usuário final, nos termos do Convênio ICMS 17/13, 7 - Missões Diplomáticas, Repartições Consulares e Organismos Internacionais, nos termos do Convênio ICMS 158/94, 8 - Igrejas e Templos de qualquer natureza, 99 - Outros não especificados anteriormente\n        \"stateRegistration\": \"\", // Inscrição estadual\n        \"stateRegistrationType\": 0, // Tipo da inscrição estadual. 1 - Contribuinte, 2 - Isento, 9 - Não Contribuinte\n        \"address\": {\n            \"street\": \"\", // Endereço\n            \"number\": \"\", // Numero\n            \"neighborhood\": \"\", // Bairro\n            \"city\": \"\", // Código da cidade (conforme ibge)\n            \"postalCode\": \"\" // CEP\n        },\n        \"phone\": \"\", // Telefone\n        \"mail\": \"\" // Email\n    },\n    \"integrationCode\": \"\" // Código de integração (vinculado ao item do contrato)\n}"},"url":"{{URL_INTEGRADOR}}","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Este endpoint representa um <strong>webhook OUTBOUND</strong>: é o Elleven quem chama o <strong>integrador</strong>, e não o contrário. Por isso a URL utiliza a variável <code>{{URL_INTEGRADOR}}</code> — o endereço do sistema do integrador, configurado no cadastro do webhook — e não <code>{{URL}}</code> (que aponta para o próprio Elleven). Isso é intencional.</p>\n<p>É utilizado para notificar o integrador sobre a geração de um <strong>documento fiscal</strong> relacionado a <strong>faturamento de terceiros</strong> ou <strong>cofaturamento</strong>.</p>\n<p>O campo <code>id</code> recebido nesta notificação deve ser utilizado posteriormente pelo integrador para <strong>confirmar a emissão</strong> do documento fiscal no Elleven, através do endpoint <strong>Confirmação da emissão do documento fiscal</strong>.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>O integrador precisa ter um endpoint HTTP próprio, publicamente acessível, cadastrado como destino deste webhook (<code>{{URL_INTEGRADOR}}</code>) na configuração de Webhook de Faturamento de Terceiro/Cofaturamento no Elleven.</li>\n<li>Os headers/autenticação que o Elleven envia ao chamar o integrador (por exemplo, <code>Authorization: Bearer {{access_token}}</code>) são definidos no cadastro do webhook, do lado do integrador — não se trata de um token emitido pelo endpoint de Autenticação desta coleção.</li>\n<li>O integrador precisa estar pronto para receber chamadas de forma assíncrona, a qualquer momento, sempre que um documento fiscal de terceiro/cofaturamento for emitido ou cancelado.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O webhook é disparado quando o documento fiscal de faturamento de terceiro/cofaturamento é emitido (status <strong>Autorizado</strong>) ou cancelado (status <strong>Cancelado</strong>).</li>\n<li>Não é disparado para documentos em outros status.</li>\n<li>Uma notificação de cancelamento só é disparada se o documento já tiver sido notificado como emitido anteriormente — o Elleven não notifica o cancelamento de um documento que nunca chegou a ser integrado como emitido (evita enviar dado inconsistente ao integrador).</li>\n<li>Para integradores do tipo <strong>Elleven MVNO Standard</strong>, a notificação é tratada de forma agrupada por nota fiscal: quando confirmada, todos os itens de faturamento da mesma nota são marcados como integrados de uma só vez.</li>\n<li>Para os demais tipos de integrador, cada linha de faturamento de terceiro/cofaturamento gera seu próprio disparo de webhook.</li>\n<li>Se o item já havia sido integrado anteriormente (por exemplo, outro item do mesmo grupo de cofaturamento já confirmado), o Elleven não reenvia a notificação para aquele item.</li>\n<li>Em caso de falha na entrega (ver seção \"Estrutura da resposta\"), o Elleven reagenda novas tentativas de envio, respeitando o número máximo de tentativas configurado no cadastro do webhook.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<p>Corpo enviado pelo Elleven ao integrador nesta chamada:</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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>id</strong></td>\n<td><code>guid</code></td>\n<td>Identificador único da emissão de terceiros/cofaturamento no Elleven.</td>\n</tr>\n<tr>\n<td><strong>accessKey</strong></td>\n<td><code>string</code></td>\n<td>Chave de acesso do documento fiscal gerado.</td>\n</tr>\n<tr>\n<td><strong>documentNumber</strong></td>\n<td><code>integer</code></td>\n<td>Número do documento fiscal.</td>\n</tr>\n<tr>\n<td><strong>serie</strong></td>\n<td><code>string</code></td>\n<td>Série do documento fiscal.</td>\n</tr>\n<tr>\n<td><strong>status</strong></td>\n<td><code>integer</code></td>\n<td>Status do documento fiscal:<br />• <strong>1</strong> - Autorizado<br />• <strong>9</strong> - Cancelado</td>\n</tr>\n<tr>\n<td><strong>amount</strong></td>\n<td><code>number</code></td>\n<td>Valor total do item ou documento.</td>\n</tr>\n<tr>\n<td><strong>issueDate</strong></td>\n<td><code>string</code></td>\n<td>Data de emissão do documento fiscal (yyyy-MM-dd).</td>\n</tr>\n<tr>\n<td><strong>competence</strong></td>\n<td><code>string</code></td>\n<td>Competência referente ao documento fiscal (yyyy-MM-dd).</td>\n</tr>\n<tr>\n<td><strong>integrationCode</strong></td>\n<td><code>string</code></td>\n<td>Código de integração vinculado ao item do contrato.</td>\n</tr>\n<tr>\n<td><strong>person</strong></td>\n<td><code>object</code></td>\n<td>Dados do destinatário do documento fiscal.</td>\n</tr>\n<tr>\n<td><strong>person.typeTxId</strong></td>\n<td><code>integer</code></td>\n<td>Tipo do documento do destinatário:<br />• <strong>1</strong> - CNPJ<br />• <strong>2</strong> - CPF</td>\n</tr>\n<tr>\n<td><strong>person.txId</strong></td>\n<td><code>string</code></td>\n<td>Número do documento (CNPJ ou CPF).</td>\n</tr>\n<tr>\n<td><strong>person.name</strong></td>\n<td><code>string</code></td>\n<td>Nome ou razão social do destinatário.</td>\n</tr>\n<tr>\n<td><strong>person.type</strong></td>\n<td><code>integer</code></td>\n<td>Tipo do cliente:<br />• <strong>1</strong> - Comercial<br />• <strong>2</strong> - Industrial<br />• <strong>3</strong> - Residencial/Pessoa Física<br />• <strong>4</strong> - Produtor Rural<br />• <strong>5</strong> - Órgão público estadual direto e entidades vinculadas<br />• <strong>6</strong> - Prestador de serviço de telecom<br />• <strong>7</strong> - Missões Diplomáticas<br />• <strong>8</strong> - Igrejas e Templos<br />• <strong>99</strong> - Outros</td>\n</tr>\n<tr>\n<td><strong>person.stateRegistration</strong></td>\n<td><code>string</code></td>\n<td>Inscrição estadual do destinatário.</td>\n</tr>\n<tr>\n<td><strong>person.stateRegistrationType</strong></td>\n<td><code>integer</code></td>\n<td>Tipo da inscrição estadual:<br />• <strong>1</strong> - Contribuinte<br />• <strong>2</strong> - Isento<br />• <strong>9</strong> - Não Contribuinte</td>\n</tr>\n<tr>\n<td><strong>person.address</strong></td>\n<td><code>object</code></td>\n<td>Endereço completo do destinatário.</td>\n</tr>\n<tr>\n<td><strong>person.address.street</strong></td>\n<td><code>string</code></td>\n<td>Logradouro.</td>\n</tr>\n<tr>\n<td><strong>person.address.number</strong></td>\n<td><code>string</code></td>\n<td>Número.</td>\n</tr>\n<tr>\n<td><strong>person.address.neighborhood</strong></td>\n<td><code>string</code></td>\n<td>Bairro.</td>\n</tr>\n<tr>\n<td><strong>person.address.city</strong></td>\n<td><code>string</code></td>\n<td>Código IBGE do município.</td>\n</tr>\n<tr>\n<td><strong>person.address.postalCode</strong></td>\n<td><code>string</code></td>\n<td>CEP.</td>\n</tr>\n<tr>\n<td><strong>person.phone</strong></td>\n<td><code>string</code></td>\n<td>Telefone do destinatário.</td>\n</tr>\n<tr>\n<td><strong>person.mail</strong></td>\n<td><code>string</code></td>\n<td>E-mail do destinatário.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da resposta</h2>\n<p>Como este é um webhook outbound, esta seção descreve o que o <strong>Elleven espera receber do integrador</strong> como resposta a esta chamada — não uma resposta gerada pelo Elleven.</p>\n<ul>\n<li>O Elleven considera a entrega <strong>bem-sucedida somente quando o integrador responde com HTTP <code>200</code></strong>. Qualquer outro código HTTP (incluindo outros códigos de sucesso, como 201 ou 204) é tratado como falha de entrega.</li>\n<li>O corpo da resposta do integrador <strong>não é validado</strong> nem precisa seguir um formato específico — o conteúdo retornado é apenas registrado em log para fins de diagnóstico. Recomenda-se responder com um corpo vazio ou <code>{}</code> (ver exemplo salvo \"Sucesso — resposta esperada do integrador\").</li>\n<li>O timeout da chamada é de <strong>3 minutos</strong>. Se o integrador não responder dentro desse prazo, ou ocorrer erro de conexão, o Elleven trata como falha de entrega.</li>\n<li>Recomenda-se que o integrador responda <strong>rapidamente</strong> (persistir o evento e responder 200 de imediato), processando o restante de forma assíncrona, para evitar timeouts e reenvios desnecessários.</li>\n</ul>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Comportamento do Elleven</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Integrador responde com HTTP diferente de 200</td>\n<td>Entrega considerada falha; nova tentativa é reagendada (até o limite configurado no cadastro do webhook)</td>\n</tr>\n<tr>\n<td>Integrador não responde em até 3 minutos, ou ocorre erro de conexão</td>\n<td>Entrega considerada falha; nova tentativa é reagendada</td>\n</tr>\n<tr>\n<td>Número máximo de tentativas esgotado</td>\n<td>O Elleven envia e-mail de alerta aos responsáveis cadastrados; dependendo da configuração, a entrega pode ser encerrada definitivamente sem novas tentativas</td>\n</tr>\n<tr>\n<td>Documento com status diferente de Autorizado/Cancelado</td>\n<td>O webhook não é disparado</td>\n</tr>\n<tr>\n<td>Documento cancelado sem nunca ter sido notificado como emitido</td>\n<td>O webhook de cancelamento não é disparado</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ol>\n<li>Um documento fiscal de faturamento de terceiro/cofaturamento é emitido (ou cancelado) no Elleven.</li>\n<li>O Elleven dispara este webhook para <code>{{URL_INTEGRADOR}}</code>, informando o <code>id</code> da emissão.</li>\n<li>O integrador processa a notificação e, após emitir o documento em seu próprio sistema fiscal, confirma a emissão através do endpoint <strong>Confirmação da emissão do documento fiscal</strong>, utilizando o mesmo <code>id</code>.</li>\n</ol>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"host":["{{URL_INTEGRADOR}}"],"query":[],"variable":[]}},"response":[{"id":"a0629f52-7606-4e7e-b3a1-03780615a791","name":"Sucesso — resposta esperada do integrador","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"id\": \"fe8bf662-11e9-4448-85d7-e611b8341ec3\", // Identificador da emissão de terceiros/co-faturamento no elleven\n    \"accessKey\": \"\", // Chave de acesso do documento fiscal gerado\n    \"documentNumber\": 58334, // Número do documento\n    \"serie\": \"62\", // Série\n    \"status\": 1, // Status do documento fiscal. 1 = Autorizado ou 9= Cancelado\n    \"amount\": 99.9, // Valor do item\n    \"issueDate\": \"0000-00-00\", // Data de emissão do documento\n    \"competence\": \"0000-00-00\", // Competencia\n    \"person\": { // Destinátario do documento\n        \"typeTxId\": 2, // Tipo do documento. 1 = CNPJ ou 2 = CPF\n        \"txId\": \"08507405924\", // Numero do documento (CNPJ ou CPF)\n        \"name\": \"\", // Nome do cliente\n        \"type\": 0, // Tipo do cliente. 1 - Comercial, 2 - Industrial, 3 - Residencial/Pessoa Física, 4 - Produtor Rural, 5 - Órgão da administração pública estadual direta e suas fundações e autarquias, quando mantidas pelo poder público estadual e regidas por normas de direito público, nos termos do Convênio ICMS 107/95, 6 - Prestador de serviço de telecomunicação responsável pelo recolhimento do imposto incidente sobre a cessão dos meios de rede do prestador do serviço ao usuário final, nos termos do Convênio ICMS 17/13, 7 - Missões Diplomáticas, Repartições Consulares e Organismos Internacionais, nos termos do Convênio ICMS 158/94, 8 - Igrejas e Templos de qualquer natureza, 99 - Outros não especificados anteriormente\n        \"stateRegistration\": \"\", // Inscrição estadual\n        \"stateRegistrationType\": 0, // Tipo da inscrição estadual. 1 - Contribuinte, 2 - Isento, 9 - Não Contribuinte\n        \"address\": {\n            \"street\": \"\", // Endereço\n            \"number\": \"\", // Numero\n            \"neighborhood\": \"\", // Bairro\n            \"city\": \"\", // Código da cidade (conforme ibge)\n            \"postalCode\": \"\" // CEP\n        },\n        \"phone\": \"\", // Telefone\n        \"mail\": \"\" // Email\n    },\n    \"integrationCode\": \"\" // Código de integração (vinculado ao item do contrato)\n}"},"url":"{{URL_INTEGRADOR}}","description":"## Propósito\n\nEste endpoint representa um **webhook OUTBOUND**: é o Elleven quem chama o **integrador**, e não o contrário. Por isso a URL utiliza a variável `{{URL_INTEGRADOR}}` — o endereço do sistema do integrador, configurado no cadastro do webhook — e não `{{URL}}` (que aponta para o próprio Elleven). Isso é intencional.\n\nÉ utilizado para notificar o integrador sobre a geração de um **documento fiscal** relacionado a **faturamento de terceiros** ou **cofaturamento**.\n\nO campo `id` recebido nesta notificação deve ser utilizado posteriormente pelo integrador para **confirmar a emissão** do documento fiscal no Elleven, através do endpoint **Confirmação da emissão do documento fiscal**.\n\n## Pré-requisitos\n\n- O integrador precisa ter um endpoint HTTP próprio, publicamente acessível, cadastrado como destino deste webhook (`{{URL_INTEGRADOR}}`) na configuração de Webhook de Faturamento de Terceiro/Cofaturamento no Elleven.\n- Os headers/autenticação que o Elleven envia ao chamar o integrador (por exemplo, `Authorization: Bearer {{access_token}}`) são definidos no cadastro do webhook, do lado do integrador — não se trata de um token emitido pelo endpoint de Autenticação desta coleção.\n- O integrador precisa estar pronto para receber chamadas de forma assíncrona, a qualquer momento, sempre que um documento fiscal de terceiro/cofaturamento for emitido ou cancelado.\n\n## Regras de negócio\n\n- O webhook é disparado quando o documento fiscal de faturamento de terceiro/cofaturamento é emitido (status **Autorizado**) ou cancelado (status **Cancelado**).\n- Não é disparado para documentos em outros status.\n- Uma notificação de cancelamento só é disparada se o documento já tiver sido notificado como emitido anteriormente — o Elleven não notifica o cancelamento de um documento que nunca chegou a ser integrado como emitido (evita enviar dado inconsistente ao integrador).\n- Para integradores do tipo **Elleven MVNO Standard**, a notificação é tratada de forma agrupada por nota fiscal: quando confirmada, todos os itens de faturamento da mesma nota são marcados como integrados de uma só vez.\n- Para os demais tipos de integrador, cada linha de faturamento de terceiro/cofaturamento gera seu próprio disparo de webhook.\n- Se o item já havia sido integrado anteriormente (por exemplo, outro item do mesmo grupo de cofaturamento já confirmado), o Elleven não reenvia a notificação para aquele item.\n- Em caso de falha na entrega (ver seção \"Estrutura da resposta\"), o Elleven reagenda novas tentativas de envio, respeitando o número máximo de tentativas configurado no cadastro do webhook.\n\n## Campos obrigatórios e valores aceitos\n\nCorpo enviado pelo Elleven ao integrador nesta chamada:\n\n| Campo                            | Tipo      | Descrição                                                                                                                                                                                                                                                                                                                               |\n| --------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| **id**                           | `guid`    | Identificador único da emissão de terceiros/cofaturamento no Elleven.                                                                                                                                                                                                                                                                   |\n| **accessKey**                    | `string`  | Chave de acesso do documento fiscal gerado.                                                                                                                                                                                                                                                                                             |\n| **documentNumber**               | `integer` | Número do documento fiscal.                                                                                                                                                                                                                                                                                                             |\n| **serie**                        | `string`  | Série do documento fiscal.                                                                                                                                                                                                                                                                                                              |\n| **status**                       | `integer` | Status do documento fiscal:<br>• **1** - Autorizado<br>• **9** - Cancelado                                                                                                                                                                                                                                                              |\n| **amount**                       | `number`  | Valor total do item ou documento.                                                                                                                                                                                                                                                                                                       |\n| **issueDate**                    | `string`  | Data de emissão do documento fiscal (yyyy-MM-dd).                                                                                                                                                                                                                                                                                       |\n| **competence**                   | `string`  | Competência referente ao documento fiscal (yyyy-MM-dd).                                                                                                                                                                                                                                                                                 |\n| **integrationCode**              | `string`  | Código de integração vinculado ao item do contrato.                                                                                                                                                                                                                                                                                     |\n| **person**                       | `object`  | Dados do destinatário do documento fiscal.                                                                                                                                                                                                                                                                                              |\n| **person.typeTxId**              | `integer` | Tipo do documento do destinatário:<br>• **1** - CNPJ<br>• **2** - CPF                                                                                                                                                                                                                                                                   |\n| **person.txId**                  | `string`  | Número do documento (CNPJ ou CPF).                                                                                                                                                                                                                                                                                                      |\n| **person.name**                  | `string`  | Nome ou razão social do destinatário.                                                                                                                                                                                                                                                                                                   |\n| **person.type**                  | `integer` | Tipo do cliente:<br>• **1** - Comercial<br>• **2** - Industrial<br>• **3** - Residencial/Pessoa Física<br>• **4** - Produtor Rural<br>• **5** - Órgão público estadual direto e entidades vinculadas<br>• **6** - Prestador de serviço de telecom<br>• **7** - Missões Diplomáticas<br>• **8** - Igrejas e Templos<br>• **99** - Outros |\n| **person.stateRegistration**     | `string`  | Inscrição estadual do destinatário.                                                                                                                                                                                                                                                                                                     |\n| **person.stateRegistrationType** | `integer` | Tipo da inscrição estadual:<br>• **1** - Contribuinte<br>• **2** - Isento<br>• **9** - Não Contribuinte                                                                                                                                                                                                                                 |\n| **person.address**               | `object`  | Endereço completo do destinatário.                                                                                                                                                                                                                                                                                                       |\n| **person.address.street**        | `string`  | Logradouro.                                                                                                                                                                                                                                                                                                                              |\n| **person.address.number**        | `string`  | Número.                                                                                                                                                                                                                                                                                                                                  |\n| **person.address.neighborhood**  | `string`  | Bairro.                                                                                                                                                                                                                                                                                                                                  |\n| **person.address.city**          | `string`  | Código IBGE do município.                                                                                                                                                                                                                                                                                                               |\n| **person.address.postalCode**    | `string`  | CEP.                                                                                                                                                                                                                                                                                                                                     |\n| **person.phone**                 | `string`  | Telefone do destinatário.                                                                                                                                                                                                                                                                                                               |\n| **person.mail**                  | `string`  | E-mail do destinatário.                                                                                                                                                                                                                                                                                                                  |\n\n## Estrutura da resposta\n\nComo este é um webhook outbound, esta seção descreve o que o **Elleven espera receber do integrador** como resposta a esta chamada — não uma resposta gerada pelo Elleven.\n\n- O Elleven considera a entrega **bem-sucedida somente quando o integrador responde com HTTP `200`**. Qualquer outro código HTTP (incluindo outros códigos de sucesso, como 201 ou 204) é tratado como falha de entrega.\n- O corpo da resposta do integrador **não é validado** nem precisa seguir um formato específico — o conteúdo retornado é apenas registrado em log para fins de diagnóstico. Recomenda-se responder com um corpo vazio ou `{}` (ver exemplo salvo \"Sucesso — resposta esperada do integrador\").\n- O timeout da chamada é de **3 minutos**. Se o integrador não responder dentro desse prazo, ou ocorrer erro de conexão, o Elleven trata como falha de entrega.\n- Recomenda-se que o integrador responda **rapidamente** (persistir o evento e responder 200 de imediato), processando o restante de forma assíncrona, para evitar timeouts e reenvios desnecessários.\n\n## Erros comuns\n\n| Situação | Comportamento do Elleven |\n| --- | --- |\n| Integrador responde com HTTP diferente de 200 | Entrega considerada falha; nova tentativa é reagendada (até o limite configurado no cadastro do webhook) |\n| Integrador não responde em até 3 minutos, ou ocorre erro de conexão | Entrega considerada falha; nova tentativa é reagendada |\n| Número máximo de tentativas esgotado | O Elleven envia e-mail de alerta aos responsáveis cadastrados; dependendo da configuração, a entrega pode ser encerrada definitivamente sem novas tentativas |\n| Documento com status diferente de Autorizado/Cancelado | O webhook não é disparado |\n| Documento cancelado sem nunca ter sido notificado como emitido | O webhook de cancelamento não é disparado |\n\n## Fluxo relacionado\n\n1. Um documento fiscal de faturamento de terceiro/cofaturamento é emitido (ou cancelado) no Elleven.\n2. O Elleven dispara este webhook para `{{URL_INTEGRADOR}}`, informando o `id` da emissão.\n3. O integrador processa a notificação e, após emitir o documento em seu próprio sistema fiscal, confirma a emissão através do endpoint **Confirmação da emissão do documento fiscal**, utilizando o mesmo `id`."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{}"}],"_postman_id":"c1335074-cb2d-4618-92f1-65056a6377c0"}],"id":"d85479c1-f251-4b5e-9bf8-e0252db33c29","_postman_id":"d85479c1-f251-4b5e-9bf8-e0252db33c29","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Confirmação da emissão do documento fiscal","id":"50122fb6-5e3e-4f4c-99a7-83e44a301aa0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"id\": \"\", // Identificador da emissão de terceiros/co-faturamento no elleven\n    \"accessKey\": \"\", // Chave de acesso do documento gerado\n    \"issueDate\": \"0000-00-00\" // Data de emissão do documento\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/thirdparty_billing/invoice_note/confirm","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Este endpoint deve ser utilizado pelo <strong>integrador</strong> para <strong>confirmar</strong> ao Elleven que um <strong>documento fiscal</strong> de <strong>faturamento de terceiros/cofaturamento</strong>, previamente notificado pelo webhook <strong>Webhook de emissão de documento fiscal</strong>, foi efetivamente emitido.</p>\n<p>A confirmação deve ser feita utilizando o mesmo <strong><code>id</code></strong> recebido na notificação inicial.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Ter recebido previamente a notificação via webhook de emissão de documento fiscal, contendo o <code>id</code> da emissão de terceiros/cofaturamento.</li>\n<li>O documento fiscal referente a esse <code>id</code> precisa estar com status <strong>Emitida</strong> (Autorizado) no Elleven no momento da confirmação.</li>\n<li>Cada combinação de <code>id</code> + <code>accessKey</code> só pode ser confirmada uma única vez.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>O <code>id</code> informado precisa corresponder a um faturamento de terceiro/cofaturamento existente no Elleven.</li>\n<li>O status do documento fiscal precisa ser <strong>Emitida</strong> — não é possível confirmar um documento com status diferente (por exemplo, ainda não emitido ou já cancelado).</li>\n<li><code>issueDate</code> é obrigatório e não pode ser uma data vazia/mínima.</li>\n<li><code>accessKey</code> é obrigatório; ao considerar apenas os dígitos, o resultado precisa ter exatamente <strong>44 caracteres</strong> (tamanho padrão de chave de acesso de documento fiscal).</li>\n<li>Não é possível confirmar novamente o mesmo <code>id</code> com a mesma <code>accessKey</code> — cada combinação <code>id</code> + <code>accessKey</code> só é aceita uma vez.</li>\n<li>Quando a confirmação é aceita, o Elleven grava o registro de confirmação vinculado à emissão.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</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>id</code></td>\n<td><code>guid</code></td>\n<td>Sim</td>\n<td>Identificador único da emissão de terceiros/cofaturamento no Elleven. Deve ser o mesmo <code>id</code> recebido na notificação de geração do documento (webhook).</td>\n</tr>\n<tr>\n<td><code>accessKey</code></td>\n<td><code>string</code></td>\n<td>Sim</td>\n<td>Chave de acesso do documento fiscal efetivamente emitido. Apenas os dígitos são considerados; o resultado precisa ter 44 caracteres.</td>\n</tr>\n<tr>\n<td><code>issueDate</code></td>\n<td><code>string (YYYY-MM-DD)</code></td>\n<td>Sim</td>\n<td>Data de emissão do documento fiscal.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando a confirmação foi aceita; <code>false</code> caso contrário.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</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>Campo</th>\n<th>Tipo</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code>, tanto em sucesso quanto em erro — este endpoint não retorna dados adicionais. Mesma estrutura em sucesso e erro.</td>\n</tr>\n</tbody>\n</table>\n</div><p>⚠ O HTTP status retornado é sempre <strong>200</strong>, inclusive quando <code>success</code> é <code>false</code> — o resultado da operação deve ser verificado pelo campo <code>success</code> do corpo da resposta, e não pelo HTTP status. Ver exemplos salvos \"Sucesso\" e \"Erro — já confirmado para a chave de acesso informada\".</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Mensagem retornada</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>id</code> não corresponde a nenhum faturamento de terceiro/cofaturamento</td>\n<td>\"Faturamento de terceiro/cofaturamento não encontrado.\"</td>\n</tr>\n<tr>\n<td>Documento com status diferente de Emitida</td>\n<td>\"Faturamento de terceiro/cofaturamento com status diferente de emitido.\"</td>\n</tr>\n<tr>\n<td><code>issueDate</code> ausente ou inválida</td>\n<td>\"Data de emissão inválida.\"</td>\n</tr>\n<tr>\n<td><code>accessKey</code> vazia, ou com menos/mais de 44 dígitos após considerar apenas os dígitos</td>\n<td>\"Chave de acesso inválida.\"</td>\n</tr>\n<tr>\n<td>Confirmação já registrada anteriormente para esse <code>id</code> + <code>accessKey</code></td>\n<td>\"Faturamento de terceiro/cofaturamento já confirmado para a chave de acesso informada.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ol>\n<li>O Elleven emite o documento fiscal de terceiro/cofaturamento e dispara o webhook <strong>Webhook de emissão de documento fiscal</strong> para o integrador, informando o <code>id</code> da emissão.</li>\n<li>O integrador emite o documento em seu próprio sistema fiscal.</li>\n<li>O integrador chama este endpoint para confirmar a emissão, usando o mesmo <code>id</code> recebido no passo 1.</li>\n</ol>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","thirdparty_billing","invoice_note","confirm"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"d821eb00-54cf-430f-86b5-ec80c5358987","name":"Erro — já confirmado para a chave de acesso informada","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"id\": \"\", // Identificador da emissão de terceiros/co-faturamento no elleven\n    \"accessKey\": \"\", // Chave de acesso do documento gerado\n    \"issueDate\": \"0000-00-00\" // Data de emissão do documento\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/thirdparty_billing/invoice_note/confirm"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": false,\n    \"messages\": [\n        {\n            \"message\": \"Faturamento de terceiro/cofaturamento já confirmado para a chave de acesso informada.\",\n            \"code\": 300,\n            \"type\": \"Error\"\n        }\n    ]\n}"},{"id":"c6568876-e9e3-4976-b932-f39697200a99","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"id\": \"\", // Identificador da emissão de terceiros/co-faturamento no elleven\n    \"accessKey\": \"\", // Chave de acesso do documento gerado\n    \"issueDate\": \"0000-00-00\" // Data de emissão do documento\n}"},"url":"{{URL}}:45715/external/integrations/thirdparty/thirdparty_billing/invoice_note/confirm"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": [\n        {\n            \"message\": \"Faturamento de terceiros/co-faturamento confirmado com sucesso!\",\n            \"code\": null,\n            \"type\": \"Success\"\n        }\n    ]\n}"}],"_postman_id":"50122fb6-5e3e-4f4c-99a7-83e44a301aa0"}],"id":"ce7b127e-6623-498c-92e3-799ad7d42e8a","_postman_id":"ce7b127e-6623-498c-92e3-799ad7d42e8a","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Materials","item":[{"name":"Busca patrimônios por pessoa","id":"54bb399f-8469-d22b-379a-1ee8a2dc5939","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/materials/person/patrimonies?personId=123123","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os patrimônios (ativos físicos, ex.: ONU, roteador, modem) e os produtos (itens de estoque consumíveis) atualmente disponíveis/alocados para uma pessoa — normalmente um técnico responsável por estoque de campo.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Pessoa (<code>personId</code>) cadastrada no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>patrimonies</code>: retorna os patrimônios não excluídos vinculados à pessoa informada.</li>\n<li><code>products</code>: retorna os produtos com saldo disponível (maior que zero) no estoque da pessoa.</li>\n<li>Se a pessoa não possuir patrimônios/produtos, a API retorna sucesso com as duas listas vazias — não é tratado como erro.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (query)</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>personId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador da pessoa. Deve ser maior que zero.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.patrimonies</code></td>\n<td>array</td>\n<td>Patrimônios da pessoa (<code>id</code>, <code>description</code>, <code>type</code>, <code>serialNumber</code>, <code>tagNumber</code>).</td>\n</tr>\n<tr>\n<td><code>response.products</code></td>\n<td>array</td>\n<td>Produtos disponíveis no estoque da pessoa (<code>id</code>, <code>description</code>, <code>type</code>, <code>units</code>, <code>unitMeasure</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>personId</code> não informado ou ≤ 0</td>\n<td>\"Identificador da pessoa não informado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar a \"Busca patrimônios alocados em um cliente\". Os patrimônios/produtos aqui listados podem ser alocados a uma solicitação via \"Aloca um patrimônio em uma solicitação\" / \"Aloca um produto em uma solicitação\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","materials","person","patrimonies"],"host":["{{URL}}"],"query":[{"key":"personId","value":"123123"}],"variable":[]}},"response":[{"id":"d9f205bc-2458-82cf-7d77-ff80f00b3770","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/materials/person/patrimonies?personId=123123","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","materials","person","patrimonies"],"query":[{"key":"personId","value":"123123"}]},"description":"## Propósito\nRetorna os patrimônios (ativos físicos, ex.: ONU, roteador, modem) e os produtos (itens de estoque consumíveis) atualmente disponíveis/alocados para uma pessoa — normalmente um técnico responsável por estoque de campo.\n\n## Pré-requisitos\n- Autenticação via Bearer Token.\n- Pessoa (`personId`) cadastrada no ERP.\n\n## Regras de negócio\n- `patrimonies`: retorna os patrimônios não excluídos vinculados à pessoa informada.\n- `products`: retorna os produtos com saldo disponível (maior que zero) no estoque da pessoa.\n- Se a pessoa não possuir patrimônios/produtos, a API retorna sucesso com as duas listas vazias — não é tratado como erro.\n\n## Campos obrigatórios e valores aceitos\n\n| Parâmetro (query) | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `personId` | long | Sim | Identificador da pessoa. Deve ser maior que zero. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi bem-sucedida. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.patrimonies` | array | Patrimônios da pessoa (`id`, `description`, `type`, `serialNumber`, `tagNumber`). |\n| `response.products` | array | Produtos disponíveis no estoque da pessoa (`id`, `description`, `type`, `units`, `unitMeasure`). |\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `personId` não informado ou ≤ 0 | \"Identificador da pessoa não informado.\" |\n\n## Fluxo relacionado\nComplementar a \"Busca patrimônios alocados em um cliente\". Os patrimônios/produtos aqui listados podem ser alocados a uma solicitação via \"Aloca um patrimônio em uma solicitação\" / \"Aloca um produto em uma solicitação\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"patrimonies\": [\n            {\n                \"id\": 1,\n                \"description\": \"Patrimonio xyz\", // Descrição do produto/modelo do patrimônio\n                \"type\": \"\", // Tipo do patrimônio (ex.: Roteador, ONU)\n                \"serialNumber\": \"xxx\",\n                \"tagNumber\": \"yyy\" // Número de etiqueta/patrimônio\n            }\n        ],\n        \"products\": [\n            {\n                \"id\": 0,\n                \"description\": \"\", // Descrição do produto\n                \"type\": \"\", // Tipo do produto\n                \"units\": 0, // Saldo disponível no estoque da pessoa\n                \"unitMeasure\": \"\" // Unidade de medida do produto\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"54bb399f-8469-d22b-379a-1ee8a2dc5939"},{"name":"Busca patrimônios alocados em um cliente","id":"d4bdc838-0a2b-3a2c-26fe-35c84fe32193","request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":"{{URL}}:45715/external/integrations/thirdparty/materials/client/allocated?clientId=123123","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Retorna os patrimônios (ativos físicos) atualmente alocados/instalados para um cliente específico.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação via Bearer Token.</li>\n<li>Cliente (<code>clientId</code>) cadastrado e não excluído no ERP.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li>Valida se o cliente informado existe e não está excluído; caso contrário, retorna erro \"Cliente {clientId} não encontrado.\"</li>\n<li>Retorna os patrimônios não excluídos vinculados ao cliente informado.</li>\n<li>Lista vazia é um retorno válido (cliente sem patrimônios alocados) — não é erro.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Parâmetro (query)</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>clientId</code></td>\n<td>long</td>\n<td>Sim</td>\n<td>Identificador do cliente. Deve ser maior que zero.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td>Indica se a operação foi bem-sucedida.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.patrimonies</code></td>\n<td>array</td>\n<td>Patrimônios alocados ao cliente (<code>id</code>, <code>title</code>, <code>serialNumber</code>, <code>tagNumber</code>, <code>mac</code>, <code>type</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Retorno</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>clientId</code> não informado ou ≤ 0</td>\n<td>\"Identificador do cliente não informado.\"</td>\n</tr>\n<tr>\n<td>Cliente não encontrado ou excluído</td>\n<td>\"Cliente {clientId} não encontrado.\"</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Complementar a \"Busca patrimônios por pessoa\". A devolução de um patrimônio alocado a uma solicitação é feita via \"Retorna um patrimônio alocado a uma solicitação\".</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","integrations","thirdparty","materials","client","allocated"],"host":["{{URL}}"],"query":[{"key":"clientId","value":"123123"}],"variable":[]}},"response":[{"id":"61c3a6d1-9b77-574e-f51b-2f54fb33f9ec","name":"Sucesso","originalRequest":{"method":"GET","header":[{"key":"Authorization","value":"Bearer {{access_token}}"},{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{URL}}:45715/external/integrations/thirdparty/materials/client/allocated?clientId=123123","host":["{{URL}}"],"port":"45715","path":["external","integrations","thirdparty","materials","client","allocated"],"query":[{"key":"clientId","value":"123123"}]},"description":"## Propósito\nRetorna os patrimônios (ativos físicos) atualmente alocados/instalados para um cliente específico.\n\n## Pré-requisitos\n- Autenticação via Bearer Token.\n- Cliente (`clientId`) cadastrado e não excluído no ERP.\n\n## Regras de negócio\n- Valida se o cliente informado existe e não está excluído; caso contrário, retorna erro \"Cliente {clientId} não encontrado.\"\n- Retorna os patrimônios não excluídos vinculados ao cliente informado.\n- Lista vazia é um retorno válido (cliente sem patrimônios alocados) — não é erro.\n\n## Campos obrigatórios e valores aceitos\n\n| Parâmetro (query) | Tipo | Obrigatório | Descrição |\n| --- | --- | --- | --- |\n| `clientId` | long | Sim | Identificador do cliente. Deve ser maior que zero. |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | Indica se a operação foi bem-sucedida. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Ver estrutura por cenário abaixo. |\n\n**Quando `success: true`:**\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `response.patrimonies` | array | Patrimônios alocados ao cliente (`id`, `title`, `serialNumber`, `tagNumber`, `mac`, `type`). |\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request.\n\n## Erros comuns\n\n| Situação | Retorno |\n| --- | --- |\n| `clientId` não informado ou ≤ 0 | \"Identificador do cliente não informado.\" |\n| Cliente não encontrado ou excluído | \"Cliente {clientId} não encontrado.\" |\n\n## Fluxo relacionado\nComplementar a \"Busca patrimônios por pessoa\". A devolução de um patrimônio alocado a uma solicitação é feita via \"Retorna um patrimônio alocado a uma solicitação\"."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n    \"success\": true,\n    \"messages\": null,\n    \"response\": {\n        \"patrimonies\": [\n            {\n                \"id\": 1,\n                \"title\": \"Patrimonio xyz\", // Descrição/título do patrimônio\n                \"serialNumber\": \"xxx\",\n                \"tagNumber\": \"yyy\", // Número de etiqueta/patrimônio\n                \"mac\": \"\", // MAC do equipamento, quando aplicável\n                \"type\": \"\" // Tipo do patrimônio\n            }\n        ]\n    },\n    \"elapsedTime\": null\n}"}],"_postman_id":"d4bdc838-0a2b-3a2c-26fe-35c84fe32193"}],"id":"faf1503e-2376-c042-9fa4-3b9abad6ab4b","_postman_id":"faf1503e-2376-c042-9fa4-3b9abad6ab4b","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}},{"name":"Omnichannel","item":[{"name":"Mensagens ativas em lote","id":"b2df4a96-1d4f-4359-a99a-8727d63091c0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Idempotency-Key","description":"<p>Opcional. Mesma chave em 24h retorna o mesmo lote (deduplicação).</p>\n","value":"83782b77-3fe5-4ba0-a642-f79dd1cb25cf"},{"key":"Authorization","value":"Bearer {{access_token}}"}],"body":{"mode":"raw","raw":"{\n    \"batchModelCode\": \"{{batchModelCode}}\",\n    \"waitingTime\": 24,\n    \"items\": [\n        {\n            \"phone\": \"5547999999999\",\n            \"txId\": \"12345678901\",\n            \"peopleId\": 12345,\n            \"templateVariables\": {\n                \"nome\": \"João Silva\",\n                \"valor\": \"R$ 150,00\"\n            }\n        },\n        {\n            \"phone\": \"5547888888888\",\n            \"templateVariables\": {\n                \"nome\": \"Maria Souza\",\n                \"valor\": \"R$ 150,00\"\n            }\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Omnichannel/ActiveMessages","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Permite disparar <strong>mensagens ativas em lote</strong> (1 a 100 itens por requisição) para clientes via Omnichannel, reaproveitando a mesma rotina de processamento do envio em lote por planilha, porém iniciado via API (lote marcado com origem \"API\").</p>\n<p>Suporta:</p>\n<ul>\n<li>Idempotência opcional por chave (<code>Idempotency-Key</code>)</li>\n<li>Sucesso parcial indexado por item (HTTP 207)</li>\n<li>Rate limit de 30 requisições/minuto por integrador</li>\n</ul>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<ul>\n<li>Autenticação Bearer token (<code>Authorization: Bearer {{access_token}}</code>), obtido no endpoint de <strong>Autenticação</strong>, com policy <code>self-integration</code>.</li>\n<li>Um <strong>Modelo de Lote</strong> já cadastrado e <strong>ativo</strong> em Service Desk &gt; Envios Ativos &gt; Modelos de Lote, com seu código (coluna <strong>Código</strong> do grid) informado em <code>batchModelCode</code>. O modelo define template, canal, fluxo de resposta e tipo de envio para todos os itens do lote.</li>\n<li>A variável <code>{{URL}}</code> desta coleção apontando para o ambiente do cliente.</li>\n</ul>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<ul>\n<li><code>batchModelCode</code> é obrigatório; a busca é case-insensitive e o modelo precisa existir e estar ativo.</li>\n<li><code>items</code> é obrigatório, aceitando de 1 a 100 destinatários por requisição.</li>\n<li><code>waitingTime</code>, quando informado, deve estar entre 4 e 168 horas (7 dias); define o tempo para encerrar automaticamente as salas criadas pelo envio. Quando omitido, aplica o padrão configurado no Modelo de Lote.</li>\n<li>Cada item é validado individualmente: o telefone é obrigatório e precisa casar com o padrão <code>^\\+?\\d{10,15}$</code> (aceito com ou sem <code>+</code>). Itens inválidos são reportados em <code>rejected[]</code>, sem reprovar o lote inteiro (sucesso parcial).</li>\n<li><code>peopleId</code>, quando informado, tem precedência sobre <code>txId</code> para vincular o destinatário a uma Pessoa cadastrada.</li>\n<li>Se <strong>todos</strong> os itens forem rejeitados na validação, o lote não é criado (<code>response.id</code> retorna <code>null</code>).</li>\n<li><strong>Idempotência</strong>: o header opcional <code>Idempotency-Key</code> (recomenda-se UUID v4) permite que requisições repetidas dentro de 24h retornem a mesma resposta já processada (mesmo <code>id</code> de lote, mesmos <code>accepted</code>/<code>rejected</code>, mesmo HTTP status), sem reprocessar. O cache é por instância: em ambientes com múltiplas réplicas, requisições roteadas para pods diferentes podem gerar lotes duplicados mesmo usando a mesma chave.</li>\n<li><strong>Rate limit</strong>: 30 requisições por minuto por integrador.</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batchModelCode</code></td>\n<td>Sim</td>\n<td>Código do Modelo de Lote (string, case-insensitive), conforme coluna <strong>Código</strong> em Service Desk &gt; Envios Ativos &gt; Modelos de Lote.</td>\n</tr>\n<tr>\n<td><code>waitingTime</code></td>\n<td>Não</td>\n<td>Horas (4–168) para encerrar a sala automaticamente. Omitir aplica o padrão do modelo.</td>\n</tr>\n<tr>\n<td><code>items</code></td>\n<td>Sim</td>\n<td>Lista de 1 a 100 destinatários.</td>\n</tr>\n<tr>\n<td><code>items[].phone</code></td>\n<td>Sim</td>\n<td>Telefone no formato <code>^\\+?\\d{10,15}$</code> (aceita com ou sem <code>+</code>).</td>\n</tr>\n<tr>\n<td><code>items[].txId</code></td>\n<td>Não</td>\n<td>CPF ou CNPJ — vincula o destinatário a uma Pessoa cadastrada.</td>\n</tr>\n<tr>\n<td><code>items[].peopleId</code></td>\n<td>Não</td>\n<td>ID direto da Pessoa — tem precedência sobre <code>txId</code> quando informado.</td>\n</tr>\n<tr>\n<td><code>items[].templateVariables</code></td>\n<td>Não</td>\n<td>Placeholders do template escolhido, em pares chave/valor.</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"header-opcional\">Header opcional</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Header</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>Idempotency-Key</code></td>\n<td>Chave para deduplicação em retentativas (válida por 24h). UUID v4 recomendado. Cache por instância.</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando ao menos 1 item foi aceito.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Ver estrutura por cenário abaixo.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response.id</code></td>\n<td>long|null</td>\n<td>Id do lote criado. <code>null</code> quando nenhum item foi aceito (lote não criado).</td>\n</tr>\n<tr>\n<td><code>response.totalRequested</code></td>\n<td>integer</td>\n<td>Total de itens recebidos no request.</td>\n</tr>\n<tr>\n<td><code>response.totalAccepted</code></td>\n<td>integer</td>\n<td>Total de itens aceitos e enfileirados para processamento.</td>\n</tr>\n<tr>\n<td><code>response.totalRejected</code></td>\n<td>integer</td>\n<td>Total de itens rejeitados na validação síncrona.</td>\n</tr>\n<tr>\n<td><code>response.accepted[]</code></td>\n<td>array</td>\n<td>Itens aceitos: <code>index</code> (posição no array enviado) e <code>phone</code>.</td>\n</tr>\n<tr>\n<td><code>response.rejected[]</code></td>\n<td>array</td>\n<td>Itens rejeitados: <code>index</code>, <code>phone</code>, <code>field</code> (campo que falhou) e <code>error</code> (mensagem).</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: false</code>:</strong></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>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>response</code></td>\n<td>null</td>\n<td>Sempre <code>null</code> quando a requisição falha antes de qualquer validação de item (ex.: <code>batchModelCode</code> ausente/inválido, <code>items</code> ausente, limite de 100 excedido, <code>waitingTime</code> fora do intervalo). Ver exemplo salvo \"Erro — modelo de lote não encontrado (código 1100)\".</td>\n</tr>\n</tbody>\n</table>\n</div><p>O HTTP status é inferido a partir de <code>totalAccepted</code>/<code>totalRejected</code> (ver exemplos salvos \"Sucesso\", \"Sucesso parcial\" e \"Erro — modelo de lote não encontrado\"):</p>\n<ul>\n<li><strong>200</strong> — todos os itens aceitos (<code>totalRejected == 0</code>).</li>\n<li><strong>207</strong> — sucesso parcial (<code>totalAccepted &gt; 0</code> e <code>totalRejected &gt; 0</code>).</li>\n<li><strong>400</strong> — nenhum item aceito (<code>totalAccepted == 0</code>), incluindo os casos de erro anteriores à validação de itens.</li>\n</ul>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>Code</th>\n<th>Mensagem</th>\n<th>HTTP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batchModelCode</code> ausente</td>\n<td>1100</td>\n<td>\"O batchModelCode é obrigatório.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td><code>batchModelCode</code> não encontrado</td>\n<td>1100</td>\n<td>\"Modelo de Lote \"X\" não encontrado.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Modelo de Lote inativo</td>\n<td>1101</td>\n<td>\"Modelo de Lote \"X\" está inativo.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td><code>items</code> ausente ou vazio</td>\n<td>—</td>\n<td>\"É obrigatório informar ao menos 1 item.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Mais de 100 itens</td>\n<td>—</td>\n<td>\"Limite de 100 itens por request excedido. Recebidos N.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td><code>waitingTime</code> fora de 4–168</td>\n<td>—</td>\n<td>\"Tempo de espera deve estar entre 4 e 168 horas (7 dias).\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Falha ao criar o lote no processamento (ex.: modelo sem template/canal habilitado)</td>\n<td>1102</td>\n<td>\"Modelo de Lote \"X\": \"</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Todos os itens rejeitados na validação (ex.: telefone inválido)</td>\n<td>—</td>\n<td>\"Lote não criado: todos os itens foram rejeitados.\"</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Parte dos itens rejeitados</td>\n<td>—</td>\n<td>\"Lote gerado com N de M itens.\" + aviso \"X item(ns) rejeitado(s) por validação.\"</td>\n<td>207</td>\n</tr>\n<tr>\n<td>Rate limit excedido (30 req/min)</td>\n<td>—</td>\n<td>—</td>\n<td>429</td>\n</tr>\n<tr>\n<td>Token sem policy <code>self-integration</code></td>\n<td>—</td>\n<td>—</td>\n<td>403</td>\n</tr>\n<tr>\n<td>Sem token / token inválido</td>\n<td>—</td>\n<td>—</td>\n<td>401</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<ol>\n<li>Rode o endpoint de <strong>Autenticação</strong> e copie o <code>access_token</code> da resposta para a variável <code>{{access_token}}</code>.</li>\n<li>Cadastre (ou confirme) um Modelo de Lote ativo em Service Desk &gt; Envios Ativos &gt; Modelos de Lote e anote seu <code>batchModelCode</code>.</li>\n<li>Rode <strong>Mensagens ativas em lote</strong> com o <code>batchModelCode</code> e os destinatários desejados.</li>\n<li>Confira o lote criado no grid Service Desk &gt; Envios Ativos &gt; Histórico (coluna <strong>Origem</strong> = \"API\").</li>\n<li>Para um teste rápido com apenas 1 item e os campos mínimos, use <strong>Mensagens ativas em lote (versão mínima, 1 item)</strong>.</li>\n</ol>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","Omnichannel","ActiveMessages"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"52d862aa-c2e1-4c19-ad31-0acc0111f302","name":"Sucesso","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json","type":"text"},{"key":"Authorization","value":"Bearer {{token}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"batchModelCode\": \"{{batchModelCode}}\",\n    \"waitingTime\": 24,\n    \"items\": [\n        {\n            \"phone\": \"5547999999999\",\n            \"txId\": \"12345678901\",\n            \"peopleId\": 12345,\n            \"templateVariables\": {\n                \"nome\": \"João Silva\",\n                \"valor\": \"R$ 150,00\"\n            }\n        },\n        {\n            \"phone\": \"5547888888888\",\n            \"templateVariables\": {\n                \"nome\": \"Maria Souza\",\n                \"valor\": \"R$ 150,00\"\n            }\n        }\n    ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL_ERP}}:45715/external/Omnichannel/ActiveMessages"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [\n    { \"message\": \"Lote gerado com 2 de 2 itens.\", \"type\": \"Success\" }\n  ],\n  \"response\": {\n    \"id\": 358,\n    \"totalRequested\": 2,\n    \"totalAccepted\": 2,\n    \"totalRejected\": 0,\n    \"accepted\": [\n      { \"index\": 0, \"phone\": \"5547999999999\" },\n      { \"index\": 1, \"phone\": \"5547888888888\" }\n    ],\n    \"rejected\": []\n  }\n}"},{"id":"cbfec570-96c8-466c-b6b7-588d7b235690","name":"Sucesso parcial (3 de 4 itens aceitos)","originalRequest":{"method":"POST","header":[],"url":""},"status":"Multi-Status","code":207,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [\n    { \"message\": \"Lote gerado com 3 de 4 itens.\", \"type\": \"Success\" },\n    { \"message\": \"1 item rejeitado por validação.\", \"type\": \"Warning\" }\n  ],\n  \"response\": {\n    \"id\": 359,\n    \"totalRequested\": 4,\n    \"totalAccepted\": 3,\n    \"totalRejected\": 1,\n    \"accepted\": [\n      { \"index\": 0, \"phone\": \"+5547999000001\" },\n      { \"index\": 1, \"phone\": \"+5547999000002\" },\n      { \"index\": 3, \"phone\": \"+5547999000003\" }\n    ],\n    \"rejected\": [\n      { \"index\": 2, \"phone\": \"abc\", \"field\": \"phone\", \"error\": \"Telefone inválido: \\\"abc\\\".\" }\n    ]\n  }\n}"},{"id":"7931cc6a-1504-4c5d-a9b6-4946baf12e18","name":"Erro — modelo de lote não encontrado (código 1100)","originalRequest":{"method":"POST","header":[],"url":""},"status":"Bad Request","code":400,"_postman_previewlanguage":"Text","header":[{"key":"Content-Type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": false,\n  \"messages\": [\n    { \"message\": \"Modelo de Lote \\\"zzz-inexistente-9999\\\" não encontrado.\", \"code\": 1100, \"type\": \"Error\" }\n  ],\n  \"response\": null\n}"}],"_postman_id":"b2df4a96-1d4f-4359-a99a-8727d63091c0"},{"name":"Mensagens ativas em lote (versão mínima, 1 item)","id":"38c66a25-d6a1-4b5d-b69b-99ce020ec899","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n  \"batchModelCode\": \"{{batchModelCode}}\",\n  \"items\": [\n    { \"phone\": \"5547999999999\" }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Omnichannel/ActiveMessages","description":"<h2 id=\"propósito\">Propósito</h2>\n<p>Variante mínima da requisição <strong>Mensagens ativas em lote</strong>, enviando apenas os campos obrigatórios (<code>batchModelCode</code> + <code>items[].phone</code>), útil para um teste rápido do endpoint com um único destinatário.</p>\n<h2 id=\"pré-requisitos\">Pré-requisitos</h2>\n<p>Os mesmos da requisição <strong>Mensagens ativas em lote</strong>: autenticação Bearer token (<code>Authorization: Bearer {{access_token}}</code>) com policy <code>self-integration</code>, e um <code>batchModelCode</code> de um Modelo de Lote ativo (Service Desk &gt; Envios Ativos &gt; Modelos de Lote).</p>\n<h2 id=\"regras-de-negócio\">Regras de negócio</h2>\n<p>Aplicam-se exatamente as mesmas regras de validação do endpoint completo (ver <strong>Mensagens ativas em lote</strong>). Nesta variante:</p>\n<ul>\n<li><code>waitingTime</code> é omitido — aplica o padrão configurado no Modelo de Lote.</li>\n<li>Apenas <code>items[].phone</code> é informado — sem <code>txId</code>, <code>peopleId</code> ou <code>templateVariables</code>.</li>\n<li>Como há apenas 1 item e ele é válido, o resultado esperado é sucesso total (HTTP 200).</li>\n</ul>\n<h2 id=\"campos-obrigatórios-e-valores-aceitos\">Campos obrigatórios e valores aceitos</h2>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Campo</th>\n<th>Obrigatório</th>\n<th>Descrição</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batchModelCode</code></td>\n<td>Sim</td>\n<td>Código do Modelo de Lote (string, case-insensitive).</td>\n</tr>\n<tr>\n<td><code>items[].phone</code></td>\n<td>Sim</td>\n<td>Telefone no formato <code>^\\+?\\d{10,15}$</code> (aceita com ou sem <code>+</code>).</td>\n</tr>\n</tbody>\n</table>\n</div><h2 id=\"estrutura-da-resposta\">Estrutura da 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>success</code></td>\n<td>boolean</td>\n<td><code>true</code> quando o único item foi aceito.</td>\n</tr>\n<tr>\n<td><code>messages</code></td>\n<td>array|null</td>\n<td>Lista de objetos <code>{ type, message, code }</code> — <code>type</code>: \"Success\"|\"Warning\"|\"Error\"; <code>code</code>: identificador do erro, <code>null</code> em sucesso. Ver \"Erros comuns\" para os textos possíveis.</td>\n</tr>\n<tr>\n<td><code>response</code></td>\n<td>object|null</td>\n<td>Mesmo envelope do endpoint completo — ver o detalhamento de todos os campos de <code>response</code> em <strong>Mensagens ativas em lote</strong>.</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Quando <code>success: true</code>:</strong></p>\n<p>Com o único item válido, o resultado esperado é HTTP <code>200</code> com <code>response.totalAccepted = 1</code> e <code>response.totalRejected = 0</code> (ver exemplo salvo \"Sucesso\" desta request). Campos de <code>response</code> detalhados em <strong>Mensagens ativas em lote</strong>.</p>\n<p><strong>Quando <code>success: false</code>:</strong></p>\n<p>Comportamento de <code>response</code> em erro não confirmado nos exemplos salvos desta request.</p>\n<h2 id=\"erros-comuns\">Erros comuns</h2>\n<p>Como há um único item, qualquer rejeição esvazia o lote inteiro:</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Situação</th>\n<th>HTTP</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>batchModelCode</code> ausente, não encontrado ou inativo</td>\n<td>400</td>\n</tr>\n<tr>\n<td>Telefone do único item inválido — nenhum item aceito, lote não criado</td>\n<td>400</td>\n</tr>\n</tbody>\n</table>\n</div><p>Mensagens exatas e demais cenários (mais de 100 itens, <code>waitingTime</code> fora do intervalo, rate limit, etc.) em <strong>Mensagens ativas em lote</strong>.</p>\n<h2 id=\"fluxo-relacionado\">Fluxo relacionado</h2>\n<p>Mesmo fluxo do endpoint completo: rode <strong>Autenticação</strong> para obter o <code>access_token</code>, garanta um Modelo de Lote ativo e então dispare esta requisição. Para lotes com mais de 1 destinatário, ou usando <code>waitingTime</code>/<code>txId</code>/<code>peopleId</code>/<code>templateVariables</code>, use <strong>Mensagens ativas em lote</strong>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}},"urlObject":{"port":"45715","path":["external","Omnichannel","ActiveMessages"],"host":["{{URL}}"],"query":[],"variable":[]}},"response":[{"id":"723201a1-f706-4eec-8972-2986cd8d1958","name":"Sucesso","originalRequest":{"method":"POST","header":[{"value":"application/json","key":"Content-Type"},{"value":"Bearer {{access_token}}","key":"Authorization"}],"body":{"mode":"raw","raw":"{\n  \"batchModelCode\": \"{{batchModelCode}}\",\n  \"items\": [\n    { \"phone\": \"5547999999999\" }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{URL}}:45715/external/Omnichannel/ActiveMessages","description":"## Propósito\n\nVariante mínima da requisição **Mensagens ativas em lote**, enviando apenas os campos obrigatórios (`batchModelCode` + `items[].phone`), útil para um teste rápido do endpoint com um único destinatário.\n\n## Pré-requisitos\n\nOs mesmos da requisição **Mensagens ativas em lote**: autenticação Bearer token (`Authorization: Bearer {{access_token}}`) com policy `self-integration`, e um `batchModelCode` de um Modelo de Lote ativo (Service Desk > Envios Ativos > Modelos de Lote).\n\n## Regras de negócio\n\nAplicam-se exatamente as mesmas regras de validação do endpoint completo (ver **Mensagens ativas em lote**). Nesta variante:\n\n- `waitingTime` é omitido — aplica o padrão configurado no Modelo de Lote.\n- Apenas `items[].phone` é informado — sem `txId`, `peopleId` ou `templateVariables`.\n- Como há apenas 1 item e ele é válido, o resultado esperado é sucesso total (HTTP 200).\n\n## Campos obrigatórios e valores aceitos\n\n| Campo | Obrigatório | Descrição |\n| --- | --- | --- |\n| `batchModelCode` | Sim | Código do Modelo de Lote (string, case-insensitive). |\n| `items[].phone` | Sim | Telefone no formato `^\\+?\\d{10,15}$` (aceita com ou sem `+`). |\n\n## Estrutura da resposta\n\n| Campo | Tipo | Descrição |\n| --- | --- | --- |\n| `success` | boolean | `true` quando o único item foi aceito. |\n| `messages` | array\\|null | Lista de objetos `{ type, message, code }` — `type`: \"Success\"\\|\"Warning\"\\|\"Error\"; `code`: identificador do erro, `null` em sucesso. Ver \"Erros comuns\" para os textos possíveis. |\n| `response` | object\\|null | Mesmo envelope do endpoint completo — ver o detalhamento de todos os campos de `response` em **Mensagens ativas em lote**. |\n\n**Quando `success: true`:**\n\nCom o único item válido, o resultado esperado é HTTP `200` com `response.totalAccepted = 1` e `response.totalRejected = 0` (ver exemplo salvo \"Sucesso\" desta request). Campos de `response` detalhados em **Mensagens ativas em lote**.\n\n**Quando `success: false`:**\n\nComportamento de `response` em erro não confirmado nos exemplos salvos desta request.\n\n## Erros comuns\n\nComo há um único item, qualquer rejeição esvazia o lote inteiro:\n\n| Situação | HTTP |\n| --- | --- |\n| `batchModelCode` ausente, não encontrado ou inativo | 400 |\n| Telefone do único item inválido — nenhum item aceito, lote não criado | 400 |\n\nMensagens exatas e demais cenários (mais de 100 itens, `waitingTime` fora do intervalo, rate limit, etc.) em **Mensagens ativas em lote**.\n\n## Fluxo relacionado\n\nMesmo fluxo do endpoint completo: rode **Autenticação** para obter o `access_token`, garanta um Modelo de Lote ativo e então dispare esta requisição. Para lotes com mais de 1 destinatário, ou usando `waitingTime`/`txId`/`peopleId`/`templateVariables`, use **Mensagens ativas em lote**."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"value":"application/json","key":"Content-Type"}],"cookie":[],"responseTime":null,"body":"{\n  \"success\": true,\n  \"messages\": [\n    { \"message\": \"Lote gerado com 1 de 1 itens.\", \"type\": \"Success\" }\n  ],\n  \"response\": {\n    \"id\": 360,\n    \"totalRequested\": 1,\n    \"totalAccepted\": 1,\n    \"totalRejected\": 0,\n    \"accepted\": [\n      { \"index\": 0, \"phone\": \"5547999999999\" }\n    ],\n    \"rejected\": []\n  }\n}"}],"_postman_id":"38c66a25-d6a1-4b5d-b69b-99ce020ec899"}],"id":"b686eb38-a063-4b6e-9b71-a221265218cb","_postman_id":"b686eb38-a063-4b6e-9b71-a221265218cb","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[]},"isInherited":true,"source":{"_postman_id":"fab82460-8195-4bc8-a769-b21548e86d11","id":"fab82460-8195-4bc8-a769-b21548e86d11","name":"API's para Terceiros - ERPVoalle","type":"collection"}}}],"auth":{"type":"bearer","bearer":{"basicConfig":[]}},"event":[{"listen":"prerequest","script":{"id":"7cd2e70c-6f41-4620-9158-f980742ce9bb","type":"text/javascript","packages":{},"requests":{},"exec":[""]}},{"listen":"test","script":{"id":"ddb301bd-2c4f-4dd2-a7a1-e343a1d52259","type":"text/javascript","packages":{},"requests":{},"exec":[""]}}]}