[{"data":1,"prerenderedAt":203},["ShallowReactive",2],{"i-mdi:magnify":3,"i-mdi:open-in-new":8,"i-mdi:menu":10,"i-mdi:download-outline":12,"i-mdi:phone":14,"guia-autenticacao":16,"i-mdi:chevron-right":185,"i-mdi:check-circle":187,"i-mdi:alert-octagon-outline":189,"i-mdi:content-copy":191,"i-mdi:information-outline":193,"i-mdi:alert-outline":195,"i-mdi:arrow-left":197,"i-mdi:arrow-right":199,"i-mdi:text-box-outline":201},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cpath fill=\"currentColor\" d=\"M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5l-1.5 1.5l-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16A6.5 6.5 0 0 1 3 9.5A6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14S14 12 14 9.5S12 5 9.5 5\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"currentColor\" d=\"M14 3v2h3.59l-9.83 9.83l1.41 1.41L19 6.41V10h2V3m-2 16H5V5h7V3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7h-2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":11},"\u003Cpath fill=\"currentColor\" d=\"M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":13},"\u003Cpath fill=\"currentColor\" d=\"M13 5v6h1.17L12 13.17L9.83 11H11V5zm2-2H9v6H5l7 7l7-7h-4zm4 15H5v2h14z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":15},"\u003Cpath fill=\"currentColor\" d=\"M6.62 10.79c1.44 2.83 3.76 5.15 6.59 6.59l2.2-2.2c.28-.28.67-.36 1.02-.25c1.12.37 2.32.57 3.57.57a1 1 0 0 1 1 1V20a1 1 0 0 1-1 1A17 17 0 0 1 3 4a1 1 0 0 1 1-1h3.5a1 1 0 0 1 1 1c0 1.25.2 2.45.57 3.57c.11.35.03.74-.25 1.02z\"\u002F>",[17,20,23,25,28,33,35,37,43,48,52,54,56,61,80,82,88,90,111,113,115,117,127,129,131,133,135,137,141,143,145,148,150,183],{"type":18,"html":19},"paragraph","Toda chamada à API leva um \u003Cstrong>token de acesso\u003C\u002Fstrong> no header \u003Ccode>Authorization\u003C\u002Fcode>. Você gera o token no seu servidor, enviando a \u003Cstrong>chave de integração\u003C\u002Fstrong> ao serviço de autenticação.",{"type":21,"text":22},"heading","Chave de integração",{"type":18,"html":24},"A chave é criada pelo \u003Cstrong>administrador do grupo\u003C\u002Fstrong>, no sistema VendaSimples. Cada integração tem a sua chave, que identifica a integração e define quais empresas ela acessa. A tela de integrações é só do administrador: peça a chave a ele.",{"type":21,"level":26,"text":27},3,"O que pedir ao administrador",{"type":29,"items":30},"list",[31,32],"\u003Cstrong>Nome da integração:\u003C\u002Fstrong> o nome do seu sistema, para ele reconhecer a integração depois.","\u003Cstrong>Empresas:\u003C\u002Fstrong> quais empresas do grupo a integração deve acessar. Se nenhuma for escolhida, a integração acessa todas as empresas do grupo com contrato ativo.",{"type":18,"html":34},"Em qualquer caso, só ficam acessíveis as empresas que têm a API de Integração no contrato.",{"type":21,"level":26,"text":36},"O que o administrador faz",{"type":29,"ordered":38,"items":39},true,[40,41,42],"No sistema, cria uma integração nova, com o nome e as empresas.","Grava e copia a chave gerada.","Envia a chave a você por um canal seguro.",{"type":44,"variant":45,"title":46,"html":47},"callout","warning","A chave aparece uma única vez","A chave é exibida só uma vez, logo depois de gravar a integração, e não pode ser consultada depois. O administrador precisa copiá-la nesse momento. Se ela se perder, não há como gerar outra para a mesma integração: o administrador cria uma integração nova.",{"type":44,"variant":49,"title":50,"html":51},"danger","Trate a chave como uma senha","Guarde a chave só no servidor, nunca no navegador nem em aplicativo instalado no celular do usuário. Não a envie por e-mail ou chat em texto aberto. A chave só serve para gerar tokens: as chamadas à API usam o token.",{"type":21,"text":53},"Gerar o token",{"type":18,"html":55},"Envie a chave no corpo de um \u003Ccode>POST\u003C\u002Fcode> para o serviço de autenticação, a partir do seu servidor:",{"type":57,"method":58,"path":59,"description":60},"endpoint","POST","\u002Fauth\u002Fintegracao","Gerar o token de acesso",{"type":62,"tabs":63},"code",[64,68,72,76],{"label":65,"language":66,"code":67},"curl","bash","curl -X POST https:\u002F\u002Fproduction.bredasapi.com.br\u002Foverall\u002Fauth\u002Fintegracao \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"chave\": \"SUA_CHAVE_DE_INTEGRACAO\" }'",{"label":69,"language":70,"code":71},"C#","csharp","using System.Net.Http.Json;\nusing System.Text.Json;\n\nusing var http = new HttpClient();\n\n\u002F\u002F Em produção, leia a chave de uma variável de ambiente ou de um cofre de segredos\nvar resposta = await http.PostAsJsonAsync(\"https:\u002F\u002Fproduction.bredasapi.com.br\u002Foverall\u002Fauth\u002Fintegracao\", new { chave = \"SUA_CHAVE_DE_INTEGRACAO\" });\nresposta.EnsureSuccessStatusCode();\n\nvar corpo = await resposta.Content.ReadFromJsonAsync\u003CJsonElement>();\nvar dados = corpo.GetProperty(\"data\");\nvar token = dados.GetProperty(\"access_token\").GetString();\nvar expiraEm = dados.GetProperty(\"expire_date\").GetDateTime();",{"label":73,"language":74,"code":75},"JavaScript (Node.js, no servidor)","javascript","\u002F\u002F Node.js 18 ou mais novo (fetch nativo), em módulo ES (.mjs)\n\u002F\u002F Em produção, leia a chave de uma variável de ambiente ou de um cofre de segredos\nconst resposta = await fetch('https:\u002F\u002Fproduction.bredasapi.com.br\u002Foverall\u002Fauth\u002Fintegracao', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application\u002Fjson' },\n  body: JSON.stringify({ chave: 'SUA_CHAVE_DE_INTEGRACAO' }),\n})\nif (!resposta.ok) throw new Error('Erro ' + resposta.status + ': ' + (await resposta.text()))\n\nconst { data } = await resposta.json()\nconst token = data.access_token\nconst expiraEm = new Date(data.expire_date)",{"label":77,"language":78,"code":79},"Python","python","import requests\n\n# Em produção, leia a chave de uma variável de ambiente ou de um cofre de segredos\nresposta = requests.post(\n    \"https:\u002F\u002Fproduction.bredasapi.com.br\u002Foverall\u002Fauth\u002Fintegracao\",\n    json={\"chave\": \"SUA_CHAVE_DE_INTEGRACAO\"},\n    timeout=30,\n)\nresposta.raise_for_status()\n\ndados = resposta.json()[\"data\"]\ntoken = dados[\"access_token\"]\nexpira_em = dados[\"expire_date\"]  # UTC, ISO 8601",{"type":18,"html":81},"Resposta \u003Ccode>201 Created\u003C\u002Fcode>:",{"type":62,"tabs":83},[84],{"label":85,"language":86,"code":87},"JSON","json","{\n  \"data\": {\n    \"access_token\": \"3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7bbredas0a1b2c3d4e5f60718293a4b5c6d7e8f9\",\n    \"expires_in\": 1440,\n    \"created_date\": \"2026-10-23T14:00:00.1234567Z\",\n    \"expire_date\": \"2026-10-24T14:00:00.1234567Z\",\n    \"gmt_offset\": -3\n  }\n}",{"type":21,"level":26,"text":89},"Campos da resposta",{"type":91,"headers":92,"rows":95},"table",[93,94],"Campo","Descrição",[96,99,102,105,108],[97,98],"\u003Ccode>access_token\u003C\u002Fcode>","Token a enviar no header \u003Ccode>Authorization\u003C\u002Fcode> das chamadas à API",[100,101],"\u003Ccode>created_date\u003C\u002Fcode>","Quando o token foi gerado, em UTC",[103,104],"\u003Ccode>expire_date\u003C\u002Fcode>","Quando o token expira, em UTC: 24 horas depois de \u003Ccode>created_date\u003C\u002Fcode>",[106,107],"\u003Ccode>expires_in\u003C\u002Fcode>","Validade do token \u003Cstrong>em minutos\u003C\u002Fstrong> (\u003Ccode>1440\u003C\u002Fcode>), não em segundos",[109,110],"\u003Ccode>gmt_offset\u003C\u002Fcode>","Fuso horário do grupo, em horas em relação ao UTC (por exemplo, \u003Ccode>-3\u003C\u002Fcode>). Use para converter as datas da API, que vêm em UTC, para o horário do grupo",{"type":18,"html":112},"Os campos desta resposta são \u003Cem>snake_case\u003C\u002Fem>, diferente do resto da API, que usa \u003Cem>camelCase\u003C\u002Fem>. A \u003Ca href=\"\u002Fapi\u002Freferencia\u002Fpost-auth-integracao\u002F\">página desse endpoint\u003C\u002Fa> não tem o botão Testar, porque ela recebe a chave, que nunca deve ir para o navegador.",{"type":21,"text":114},"Usar o token",{"type":18,"html":116},"Envie o token no header \u003Ccode>Authorization\u003C\u002Fcode> de todas as chamadas à API, \u003Cstrong>sem o prefixo \u003Ccode>Bearer\u003C\u002Fcode>\u003C\u002Fstrong>. Com \u003Ccode>Bearer\u003C\u002Fcode>, a chamada é recusada com \u003Ccode>401\u003C\u002Fcode>.",{"type":62,"tabs":118},[119,121,123,125],{"label":65,"language":66,"code":120},"curl https:\u002F\u002Fproduction.bredasapi.com.br\u002Fapi\u002Fv1\u002Fempresa \\\n  -H \"Authorization: 3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7bbredas0a1b2c3d4e5f60718293a4b5c6d7e8f9\"",{"label":69,"language":70,"code":122},"\u002F\u002F Só o token, sem Bearer: TryAddWithoutValidation envia o header como está\nhttp.DefaultRequestHeaders.TryAddWithoutValidation(\"Authorization\", token);\n\nvar empresas = await http.GetFromJsonAsync\u003CJsonElement>(\"https:\u002F\u002Fproduction.bredasapi.com.br\u002Fapi\u002Fv1\u002Fempresa\");",{"label":73,"language":74,"code":124},"const respostaEmpresas = await fetch('https:\u002F\u002Fproduction.bredasapi.com.br\u002Fapi\u002Fv1\u002Fempresa', {\n  headers: { Authorization: token }, \u002F\u002F só o token, sem Bearer\n})\nif (!respostaEmpresas.ok) throw new Error('Erro ' + respostaEmpresas.status + ': ' + (await respostaEmpresas.text()))\n\nconst { data: empresas } = await respostaEmpresas.json()",{"label":77,"language":78,"code":126},"resposta = requests.get(\n    \"https:\u002F\u002Fproduction.bredasapi.com.br\u002Fapi\u002Fv1\u002Fempresa\",\n    headers={\"Authorization\": token},  # só o token, sem Bearer\n    timeout=30,\n)\nresposta.raise_for_status()\n\nempresas = resposta.json()[\"data\"]",{"type":18,"html":128},"Em C#, \u003Ccode>DefaultRequestHeaders.Authorization\u003C\u002Fcode> exige um esquema, como \u003Ccode>Bearer\u003C\u002Fcode>. Por isso o exemplo usa \u003Ccode>TryAddWithoutValidation\u003C\u002Fcode>, que envia só o token.",{"type":21,"text":130},"Renovar o token",{"type":18,"html":132},"O token vale 24 horas. Não há renovação automática nem \u003Cem>refresh token\u003C\u002Fem>: quando ele expirar, gere outro com a mesma chave. Enquanto ele valer, reaproveite o mesmo token em todas as chamadas.",{"type":18,"html":134},"Guarde o \u003Ccode>expire_date\u003C\u002Fcode> e gere um token novo um pouco antes dele, ou ao receber um \u003Ccode>401\u003C\u002Fcode>.",{"type":18,"html":136},"Gerar um token novo não invalida os anteriores: cada token vale até o próprio \u003Ccode>expire_date\u003C\u002Fcode>. Assim, mais de uma instância do seu sistema pode ter o seu token ao mesmo tempo.",{"type":44,"variant":138,"title":139,"html":140},"info","O token guarda as empresas do momento","O token guarda as empresas liberadas no momento em que foi gerado, inclusive quando a integração foi criada sem empresas escolhidas. Se uma empresa for liberada para a integração, ou uma empresa nova entrar no grupo, gere um token novo para acessá-la. Se uma empresa for removida da integração, os tokens gerados antes continuam acessando essa empresa até expirar.",{"type":21,"text":142},"Revogar a chave",{"type":18,"html":144},"Se a chave vazar, peça ao administrador para revogar a integração. A revogação encerra a integração de vez: ela não volta a ficar ativa nem recebe chave nova. Para continuar integrando, o administrador cria uma integração nova, com outra chave. Depois da revogação, a chave antiga recebe \u003Ccode>400\u003C\u002Fcode> com \"Chave de integração inválida\".",{"type":44,"variant":45,"title":146,"html":147},"O que continua valendo depois da revogação","Os tokens já gerados com a chave revogada continuam valendo até expirar, em até 24 horas. Os webhooks também continuam ativos, porque são do grupo e não da integração: se for o caso, peça ao administrador para inativá-los. Veja \u003Ca href=\"\u002Fapi\u002Fwebhooks\u002F\">Webhooks\u003C\u002Fa>.",{"type":21,"text":149},"Erros comuns",{"type":91,"headers":151,"rows":155},[152,153,154],"Situação","Resposta","O que fazer",[156,160,164,168,172,176,179],[157,158,159],"Chave errada ou revogada, grupo inativo, ou nenhuma empresa da integração com contrato ativo","\u003Ccode>400\u003C\u002Fcode> com \"Chave de integração inválida\"","Confira a chave. Se ela estiver certa, fale com o administrador do grupo",[161,162,163],"Chave em branco","\u003Ccode>400\u003C\u002Fcode> com \"Chave de integração não informada\"","Envie o campo \u003Ccode>chave\u003C\u002Fcode> no corpo",[165,166,167],"Corpo enviado sem o header \u003Ccode>Content-Type: application\u002Fjson\u003C\u002Fcode> na geração do token","\u003Ccode>415\u003C\u002Fcode> sem corpo","Envie o header \u003Ccode>Content-Type: application\u002Fjson\u003C\u002Fcode>",[169,170,171],"Corpo ausente ou JSON inválido na geração do token","\u003Ccode>500\u003C\u002Fcode>","Envie \u003Ccode>{\"chave\": \"...\"}\u003C\u002Fcode> com o header \u003Ccode>Content-Type: application\u002Fjson\u003C\u002Fcode>",[173,174,175],"Token com \u003Ccode>Bearer\u003C\u002Fcode> na frente","\u003Ccode>401\u003C\u002Fcode> com \u003Ccode>{\"errors\":[{\"errorMessage\":\"Unauthorized\"}]}\u003C\u002Fcode>","Envie só o token",[177,174,178],"Token ausente, expirado ou inexistente","Gere um token novo",[180,181,182],"Token válido, mas nenhuma empresa da integração tem a API de Integração no contrato, ou o token não é de uma integração (por exemplo, o de login de um usuário do sistema)","\u003Ccode>401\u003C\u002Fcode> sem corpo","Use um token gerado com a chave de integração. Se o erro continuar, \u003Ca href=\"\u002Fapi\u002Fperguntas-frequentes\u002F#como-peco-ajuda-ao-suporte\">fale com o suporte\u003C\u002Fa>",{"type":18,"html":184},"Os outros códigos de resposta estão em \u003Ca href=\"\u002Fapi\u002Ferros-e-limites\u002F#codigos-de-resposta\">Erros e limites\u003C\u002Fa>.",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":186},"\u003Cpath fill=\"currentColor\" d=\"M8.59 16.58L13.17 12L8.59 7.41L10 6l6 6l-6 6z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":188},"\u003Cpath fill=\"currentColor\" d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10s10-4.5 10-10S17.5 2 12 2m-2 15l-5-5l1.41-1.41L10 14.17l7.59-7.59L19 8z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":190},"\u003Cpath fill=\"currentColor\" d=\"M8.27 3L3 8.27v7.46L8.27 21h7.46C17.5 19.24 21 15.73 21 15.73V8.27L15.73 3M9.1 5h5.8L19 9.1v5.8L14.9 19H9.1L5 14.9V9.1m6 5.9h2v2h-2zm0-8h2v6h-2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":192},"\u003Cpath fill=\"currentColor\" d=\"M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":194},"\u003Cpath fill=\"currentColor\" d=\"M11 9h2V7h-2m1 13c-4.41 0-8-3.59-8-8s3.59-8 8-8s8 3.59 8 8s-3.59 8-8 8m0-18A10 10 0 0 0 2 12a10 10 0 0 0 10 10a10 10 0 0 0 10-10A10 10 0 0 0 12 2m-1 15h2v-6h-2z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":196},"\u003Cpath fill=\"currentColor\" d=\"M12 2L1 21h22M12 6l7.53 13H4.47M11 10v4h2v-4m-2 6v2h2v-2\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":198},"\u003Cpath fill=\"currentColor\" d=\"M20 11v2H8l5.5 5.5l-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5L8 11z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":200},"\u003Cpath fill=\"currentColor\" d=\"M4 11v2h12l-5.5 5.5l1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5L16 11z\"\u002F>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":202},"\u003Cpath fill=\"currentColor\" d=\"M5 3c-1.11 0-2 .89-2 2v14c0 1.11.89 2 2 2h14c1.11 0 2-.89 2-2V5c0-1.11-.89-2-2-2zm0 2h14v14H5zm2 2v2h10V7zm0 4v2h10v-2zm0 4v2h7v-2z\"\u002F>",1793977941402]