{
  "info": {
    "name": "GAS4US — integração Linx",
    "_postman_id": "gas4us-gas4us-integração-linx",
    "description": "Coleção gerada da documentação oficial (https://wiki.txfuel.com.br/pt-br/gas4us/api). Preencha as variáveis da coleção: base_url, tipo_identificador (APP, REDE, CNPJ ou CPF), valor_identificador, identificador e app_id. A senha do dia é calculada automaticamente.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Autenticação das APIs de terceiro do GAS4US: acrescenta APP|REDE|CNPJ|CPF, SENHA (do dia) e A em todo pedido.",
          "// SENHA = md5(identificador + AAAA-MM-DD + valor enviado em APP/REDE/CNPJ/CPF), data de Brasília.",
          "const tipo = pm.variables.get('tipo_identificador') || 'APP';",
          "const valor = pm.variables.get('valor_identificador') || '';",
          "const identificador = pm.variables.get('identificador') || '';",
          "const hoje = new Date(Date.now() - 3 * 3600 * 1000).toISOString().slice(0, 10);",
          "const chave = (tipo === 'CNPJ' || tipo === 'CPF') ? valor.replace(/\\D/g, '') : valor;",
          "const senha = CryptoJS.MD5(identificador + hoje + chave).toString();",
          "['APP', 'REDE', 'CNPJ', 'CPF', 'SENHA', 'A'].forEach(k => pm.request.url.query.remove(k));",
          "pm.request.url.query.add({ key: tipo, value: chave });",
          "pm.request.url.query.add({ key: 'SENHA', value: senha });",
          "pm.request.url.query.add({ key: 'A', value: pm.variables.get('app_id') });"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://gas4us1.txfuel.com.br/api"
    },
    {
      "key": "tipo_identificador",
      "value": "APP"
    },
    {
      "key": "valor_identificador",
      "value": "NOME DO APP"
    },
    {
      "key": "identificador",
      "value": ""
    },
    {
      "key": "app_id",
      "value": "0"
    }
  ],
  "item": [
    {
      "name": "Integração Linx",
      "description": "Integração com a Linx (App do Consumidor/POS e AutoSystem): validação do código do cliente, pós-venda, cancelamento e preços. Rotas /v1/integracao/, com corpo e respostas no formato da Linx (sem o envelope status) e acesso alternativo pelo prefixo /linx com o cabeçalho Authorization. Perfis e senha do dia seguem o manual geral das APIs de terceiro.",
      "item": [
        {
          "name": "POST integracao/validarcodigo/lista — Valida o código e registra a venda pendente",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/integracao/validarcodigo/lista",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "integracao",
                "validarcodigo",
                "lista"
              ],
              "query": []
            },
            "description": "Chamado pelo POS/AutoSystem da Linx antes de fechar a venda: confere o token do cliente (codigoValidacao), calcula preço com desconto e quanto o saldo do app paga, e deixa a venda PENDENTE (P) para a pós-venda confirmar. O token pode vir normal, em base64 ou como o JSON do QR \"completo\" da Linx. Como em terceiro/venda, o token vale para o posto e para o total da venda (soma dos valorVenda) informado no app. Autenticação como as demais (APP/REDE/CNPJ/CPF + SENHA + A na query; para a Linx, CNPJ do posto). Alternativa usada pela Linx: chamar o mesmo caminho com o prefixo /linx (…/linx/api/v1/integracao/…, fora do /api) com o cabeçalho Authorization: Basic <identificador>.<CNPJ do posto>.<A> (texto puro, sem base64); o servidor calcula a senha do dia e repassa para a rota normal. O tokenIntegracao do corpo só precisa existir (não é conferido).\n\nPerfis: App, Rede, Posto, Cliente, Pessoa.",
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"codigoValidacao\": \"123456789012\",\n    \"codigoEmpresa\": \"00000000000100\",\n    \"identificadorExternoProduto\": \"101\",\n    \"valorVenda\": 120.0,\n    \"quantidade\": 20.0,\n    \"dataVenda\": \"2026-11-12T10:15:00\",\n    \"parametroOpcional\": \"1\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST integracao/posvenda — Confirma a venda pendente do token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/integracao/posvenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "integracao",
                "posvenda"
              ],
              "query": []
            },
            "description": "Chamado pela Linx depois de concluir a venda: confirma (P → C) a venda pendente do token no posto e devolve os itens. Reenvio da mesma pós-venda devolve os mesmos dados sem gravar de novo; reenvio de venda confirmada há mais de 1 dia devolve 400 (chave inválida), para o POS descartar a pendência. O posto é o do acesso (CNPJ do posto); no acesso de app, id_posto na query. Autenticação como as demais (APP/REDE/CNPJ/CPF + SENHA + A na query; para a Linx, CNPJ do posto). Alternativa usada pela Linx: chamar o mesmo caminho com o prefixo /linx (…/linx/api/v1/integracao/…, fora do /api) com o cabeçalho Authorization: Basic <identificador>.<CNPJ do posto>.<A> (texto puro, sem base64); o servidor calcula a senha do dia e repassa para a rota normal. O tokenIntegracao do corpo só precisa existir (não é conferido).\n\nPerfis: App, Rede, Posto, Cliente, Pessoa.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tokenIntegracao\": \"<token da Linx>\",\n  \"chaveAutenticacao\": \"123456789012\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST integracao/cancelarvenda — Cancela pelo token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/integracao/cancelarvenda",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "integracao",
                "cancelarvenda"
              ],
              "query": []
            },
            "description": "Cancela (situação X) a venda do token feita há no máximo 30 minutos e libera o token e a trava da pessoa. Autenticação como as demais (APP/REDE/CNPJ/CPF + SENHA + A na query; para a Linx, CNPJ do posto). Alternativa usada pela Linx: chamar o mesmo caminho com o prefixo /linx (…/linx/api/v1/integracao/…, fora do /api) com o cabeçalho Authorization: Basic <identificador>.<CNPJ do posto>.<A> (texto puro, sem base64); o servidor calcula a senha do dia e repassa para a rota normal. O tokenIntegracao do corpo só precisa existir (não é conferido). Só cancela venda feita em posto do escopo do acesso (o próprio posto, ou os postos da rede); se vier codigoEmpresa, também tem de ser desse posto.\n\nPerfis: App, Rede, Posto, Cliente, Pessoa.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"tokenIntegracao\": \"<token da Linx>\",\n  \"chaveAutenticacao\": \"123456789012\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        },
        {
          "name": "POST integracao/produto/lista — Atualiza os preços de bomba",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/integracao/produto/lista",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "integracao",
                "produto",
                "lista"
              ],
              "query": []
            },
            "description": "A Linx envia a lista de produtos com preço; para cada produto com de-para no GAS4US, grava o novo preço de bomba quando mudou (ATIVO) ou zera o preço (INATIVO). Autenticação como as demais (APP/REDE/CNPJ/CPF + SENHA + A na query; para a Linx, CNPJ do posto). Alternativa usada pela Linx: chamar o mesmo caminho com o prefixo /linx (…/linx/api/v1/integracao/…, fora do /api) com o cabeçalho Authorization: Basic <identificador>.<CNPJ do posto>.<A> (texto puro, sem base64); o servidor calcula a senha do dia e repassa para a rota normal. O tokenIntegracao do corpo só precisa existir (não é conferido).\n\nPerfis: App, Rede, Posto, Cliente, Pessoa.",
            "body": {
              "mode": "raw",
              "raw": "[\n  {\n    \"codigoEmpresa\": \"00000000000100\",\n    \"identificadorExternoProduto\": \"101\",\n    \"descricaoProduto\": \"GASOLINA COMUM\",\n    \"modalidadeProduto\": \"COMBUSTIVEL\",\n    \"valor\": 6.09,\n    \"status\": \"ATIVO\",\n    \"tokenIntegracao\": \"<token da Linx>\"\n  }\n]",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          }
        }
      ]
    }
  ]
}
