{
  "openapi": "3.0.3",
  "info": {
    "title": "GAS4US — APIs de terceiro",
    "version": "1.0.0",
    "description": "APIs para integrar sistemas de terceiros (automação de posto, PDV, ERP…) ao GAS4US.\n\n**Autenticação**: todo pedido leva na query o identificador do perfil (`APP`, `REDE`, `CNPJ` ou `CPF`), a `SENHA` do dia e `A` (id do app). `SENHA = md5(identificador + AAAA-MM-DD + valor enviado em APP/REDE/CNPJ/CPF)`, com a data de Brasília (vale ontem, hoje e amanhã). O identificador é fornecido pela TX Fuel e deve ser guardado em segredo.\n\nManual completo: https://wiki.txfuel.com.br/pt-br/gas4us/api",
    "contact": {
      "name": "Suporte TX Fuel",
      "email": "suporte@txfuel.com.br"
    }
  },
  "servers": [
    {
      "url": "https://gas4us1.txfuel.com.br/api",
      "description": "Servidor 1"
    },
    {
      "url": "https://gas4us2.txfuel.com.br/api",
      "description": "Servidor 2"
    }
  ],
  "tags": [
    {
      "name": "Vendas e abastecimento",
      "description": "Abastecimento com o token do app do cliente: validar, registrar, consultar e cancelar vendas no posto."
    },
    {
      "name": "Preços e promoções",
      "description": "Preço de bomba, preço do app (promoção vigente) e agenda semanal de descontos por posto e combustível."
    },
    {
      "name": "Financeiro e relatórios",
      "description": "Faturamento, créditos, movimento e saldo dos clientes, repasses aos postos e situação de boleto."
    },
    {
      "name": "Clientes e fidelidade",
      "description": "Exportação do cadastro de clientes para o sistema do posto e programa de fidelidade (cupons, extrato, parceiros)."
    },
    {
      "name": "Geral",
      "description": "Teste de credencial, tabelas de códigos (combustíveis) e observações livres."
    }
  ],
  "security": [
    {
      "APP": [],
      "SENHA": [],
      "A": []
    },
    {
      "REDE": [],
      "SENHA": [],
      "A": []
    },
    {
      "CNPJ": [],
      "SENHA": [],
      "A": []
    },
    {
      "CPF": [],
      "SENHA": [],
      "A": []
    }
  ],
  "components": {
    "securitySchemes": {
      "APP": {
        "type": "apiKey",
        "in": "query",
        "name": "APP",
        "description": "Nome do app (perfil App) — use um entre APP, REDE, CNPJ e CPF"
      },
      "REDE": {
        "type": "apiKey",
        "in": "query",
        "name": "REDE",
        "description": "Nome da rede (perfil Rede)"
      },
      "CNPJ": {
        "type": "apiKey",
        "in": "query",
        "name": "CNPJ",
        "description": "CNPJ da filial ou do cliente, só números (perfis Filial e Cliente)"
      },
      "CPF": {
        "type": "apiKey",
        "in": "query",
        "name": "CPF",
        "description": "CPF, só números"
      },
      "SENHA": {
        "type": "apiKey",
        "in": "query",
        "name": "SENHA",
        "description": "md5(identificador + AAAA-MM-DD + valor de APP/REDE/CNPJ/CPF)"
      },
      "A": {
        "type": "apiKey",
        "in": "query",
        "name": "A",
        "description": "Id do app no GAS4US"
      }
    },
    "schemas": {
      "Erro": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "example": "error"
          },
          "errors": {
            "type": "object",
            "additionalProperties": {
              "type": "string"
            },
            "example": {
              "id_ordem": "Valor inválido"
            }
          }
        }
      }
    },
    "responses": {
      "Erro400": {
        "description": "Dados inválidos ou regra de negócio",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            }
          }
        }
      },
      "Erro401": {
        "description": "Identificador, senha ou app inválidos",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "status": "error",
              "errors": {
                "error": "Não autorizada!"
              }
            }
          }
        }
      },
      "Erro403": {
        "description": "Perfil sem permissão para este método, ou registro fora do escopo do identificador",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "status": "error",
              "errors": {
                "acesso": "Negado"
              }
            }
          }
        }
      },
      "Erro405": {
        "description": "Método não implementado neste endpoint"
      }
    }
  },
  "paths": {
    "/v1/terceiro/venda": {
      "get": {
        "tags": [
          "Vendas e abastecimento"
        ],
        "summary": "Vendas confirmadas do posto (paginada)",
        "description": "Lista as vendas do posto em situação confirmada ou liberada (C/L). Sem posto não há resultado.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_venda",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita também id_estabelecimento ou id_posto). No acesso de posto (CNPJ do posto) é fixado pelo acesso e não precisa ser enviado; nos acessos de app e rede é obrigatório na prática (sem ele não há resultado)."
          },
          {
            "name": "id_venda",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Uma venda."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Vendas com esse combustível em qualquer dos 5 itens (aceita id_produto)."
          },
          {
            "name": "data_inicial",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da venda, AAAA-MM-DD (aceita data_inicio/data_ini). Padrão 1980-01-01."
          },
          {
            "name": "data_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "AAAA-MM-DD (aceita data_fim). Padrão 2099-12-31."
          },
          {
            "name": "cpf_caixa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtra pelo CPF do caixa."
          },
          {
            "name": "cpf_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtra pelo CPF do frentista."
          },
          {
            "name": "recebimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "caixa, app ou * (padrão, todas)."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_venda": 123456,
                      "id_comb": 1,
                      "id_comb1": 1,
                      "id_comb2": 0,
                      "nome_comb": "GASOLINA COMUM",
                      "nome_comb1": "GASOLINA COMUM",
                      "quantidade": 20.0,
                      "quantidade1": 20.0,
                      "quantidade_total": 20.0,
                      "unit_sem_desconto": 6.0,
                      "abast_sem_desconto": 120.0,
                      "outros_sem_desconto": 0.0,
                      "total_sem_desconto": 120.0,
                      "unit_com_desconto1": 5.8,
                      "abast_com_desconto": 116.0,
                      "outros_com_desconto": 0.0,
                      "total_com_desconto": 116.0,
                      "desconto_abast": 4.0,
                      "desconto_abast_total": 4.0,
                      "desconto_outros": 0.0,
                      "pontos_ent": 0,
                      "pontos_sai": 0,
                      "data_hora_venda": "2026-11-12 10:15:00",
                      "cpf_caixa": "",
                      "cpf_frentista": "",
                      "recebimento": "app"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "post": {
        "tags": [
          "Vendas e abastecimento"
        ],
        "summary": "Valida (padrão) ou registra a venda",
        "description": "Sem acao=registrar a chamada só VALIDA: calcula descontos e forma de pagamento e devolve os valores, sem gravar nada (o token não é consumido). Com acao=registrar grava a venda: usa primeiro o saldo do cliente e o resto vai para o cartão favorito (recebimento=app) ou fica para o caixa (recebimento=caixa). Proteções ao registrar: o mesmo token não registra duas vezes (nem em reenvios até 6 h depois), e a mesma pessoa fica travada por 15 s durante a venda (\"Em uso… aguarde 15 segundos\"). Fora de produção (ambiente de testes) os tokens 100100100100, 200200200200 e 300300300300 passam pela validação do token (sandbox).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "post_venda",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token do app (12 dígitos; aceita também base64 ou o JSON do QR, ver acima).",
            "example": "123456789012"
          },
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita também id_estabelecimento ou id_posto). No acesso de posto (CNPJ do posto) é fixado pelo acesso e não precisa ser enviado; nos acessos de app e rede é obrigatório na prática (sem ele não há resultado)."
          },
          {
            "name": "id_comb1",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível 1 (id de tabelas?id_tabela=1). Aceita também id_comb ou id_produto.",
            "example": 1
          },
          {
            "name": "total_abast1",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Valor do abastecimento do combustível 1 a preço de bomba (R$, até 15.000). Aceita também total_abast.",
            "example": 120.0
          },
          {
            "name": "litros_abast1",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Litros do combustível 1. Sem ele, a quantidade é calculada por total_abast1 / preço de bomba. Aceita também litros_abast."
          },
          {
            "name": "id_comb2..5 / total_abast2..5 / litros_abast2..5",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Demais combustíveis da mesma venda (até 5)."
          },
          {
            "name": "total_outros",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Outros produtos (sem desconto do app), R$."
          },
          {
            "name": "acao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "validar (padrão: só simula) ou registrar (grava a venda).",
            "example": "registrar"
          },
          {
            "name": "recebimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "app (padrão: saldo + cartão favorito do cliente) ou caixa (saldo + restante pago no caixa do posto)."
          },
          {
            "name": "placa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Placa do veículo (validada quando enviada)."
          },
          {
            "name": "quilometragem",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Hodômetro; só com placa."
          },
          {
            "name": "cpf_caixa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "CPF do operador de caixa (validado quando enviado)."
          },
          {
            "name": "cpf_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "CPF do frentista (validado quando enviado)."
          },
          {
            "name": "observacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Texto livre gravado na venda."
          },
          {
            "name": "gerar_pontos / gerar_cashback / gerar_sorte / gerar_cupom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "Só desligam benefícios que o app já daria para o cliente (false); não ligam o que o app não dá."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "id_venda": 123456,
                  "token": "123456789012",
                  "id_comb": 1,
                  "nome_comb": "GASOLINA COMUM",
                  "quantidade": 20.0,
                  "unit_sem_desconto": 6.0,
                  "abast_sem_desconto": 120.0,
                  "unit_com_desconto": 5.8,
                  "abast_com_desconto": 116.0,
                  "desconto_abast": 4.0,
                  "id_comb1": 1,
                  "nome_comb1": "GASOLINA COMUM",
                  "quantidade1": 20.0,
                  "unit_sem_desconto1": 6.0,
                  "abast_sem_desconto1": 120.0,
                  "unit_com_desconto1": 5.8,
                  "abast_com_desconto1": 116.0,
                  "desconto_abast1": 4.0,
                  "id_comb2": 0,
                  "nome_comb2": "",
                  "quantidade2": 0.0,
                  "unit_sem_desconto2": 0.0,
                  "abast_sem_desconto2": 0.0,
                  "unit_com_desconto2": 0,
                  "abast_com_desconto2": 0.0,
                  "desconto_abast2": 0.0,
                  "total_sem_desconto": 120.0,
                  "outros_sem_desconto": 0.0,
                  "total_com_desconto": 116.0,
                  "outros_com_desconto": 0.0,
                  "desconto_outros": 0.0,
                  "desconto_total": 4.0,
                  "valor_pago_caixa": 0.0,
                  "valor_pago_saldo": 16.0,
                  "valor_pago_cartao": 100.0,
                  "cartao": "**** 0000",
                  "cpf_caixa": "",
                  "cpf_frentista": "",
                  "placa": "ABC1D23",
                  "quilometragem": 0,
                  "recebimento": "app",
                  "acao": "registrar",
                  "data_hora": "2026-11-12 10:15:00",
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "delete": {
        "tags": [
          "Vendas e abastecimento"
        ],
        "summary": "Cancela uma venda (até 30 minutos)",
        "description": "Cancela (situação X) a venda feita há no máximo 30 minutos, desde que o posto da venda seja do app e, nos acessos de rede/posto, da rede/posto do acesso.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "delete_venda",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_venda",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Id da venda (id_venda devolvido no registro).",
            "example": 123456
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/precoBomba": {
      "get": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Preço de bomba atual por combustível",
        "description": "Consulta e atualiza o preço de bomba (sem desconto) por combustível do posto. É a base dos descontos do app: as promoções da agenda são calculadas sobre ele.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_precoBomba",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita também id_estabelecimento ou id_posto). No acesso de posto (CNPJ do posto) é fixado pelo acesso e não precisa ser enviado; nos acessos de app e rede é obrigatório na prática (sem ele não há resultado)."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Um combustível (aceita id_produto). Sem ele, todos os combustíveis ativos."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_comb": 1,
                      "nome_comb": "GASOLINA COMUM",
                      "preco_bomba": 6.09,
                      "data_hora_atu": "2026-11-12 06:00:00"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "put": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Atualiza o preço de bomba de um combustível",
        "description": "Grava um novo preço de bomba quando o valor é diferente do atual. Com posto ou combustível ausente, valor negativo ou valor igual ao atual, nada é feito e a resposta é ok mesmo assim.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "put_precoBomba",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita também id_estabelecimento ou id_posto). No acesso de posto (CNPJ do posto) é fixado pelo acesso e não precisa ser enviado; nos acessos de app e rede é obrigatório na prática (sem ele não há resultado)."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto).",
            "example": 1
          },
          {
            "name": "valor",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Novo preço por litro (aceita preco_bomba). Ponto como separador decimal.",
            "example": 6.09
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/precoAplicativo": {
      "get": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Promoções vigentes do posto",
        "description": "Preço com desconto do app que vale agora no posto (promoção ativa no momento). Não mostra o desconto extra por limite de litros nem o preço de convênio.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_precoAplicativo",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita também id_estabelecimento ou id_posto). No acesso de posto (CNPJ do posto) é fixado pelo acesso e não precisa ser enviado; nos acessos de app e rede é obrigatório na prática (sem ele não há resultado)."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Um combustível (aceita id_produto)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_comb": 1,
                      "nome_comb": "GASOLINA COMUM",
                      "preco_aplicativo": 5.89,
                      "data_hora_inicio": "2026-11-12 08:00:00",
                      "data_hora_fim": "2026-11-12 11:59:59"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/agendaPosto": {
      "get": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Agenda da semana (7 dias × 6 faixas)",
        "description": "A agenda define o desconto do app por posto, combustível, dia da semana e faixa de 4 horas (00:00, 04:00, 08:00, 12:00, 16:00 e 20:00). Uma rotina cria a promoção de cada faixa uns 10 minutos antes de ela começar, com preço = preço de bomba − desconto, e só para postos com a agenda ligada (cadastro do posto); alteração feita durante uma faixa vale a partir da próxima. dia_da_semana: 0 = domingo … 6 = sábado. Escopo pelo acesso: posto, só o próprio; rede, os postos da rede; app, os postos do app. Posto fora do escopo: o GET volta vazio e o PUT recebe 403.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_agendaPosto",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_posto",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Posto, ou lista de postos separados por vírgula (ex.: 10,11). Com vários postos, um valor só aparece quando é igual em todos (senão 0). No acesso de posto, sem ele vale o posto do acesso.",
            "example": "10"
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto).",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_promocao_agenda": 501,
                      "dia_da_semana": 0,
                      "hora_inicial": "00:00:00",
                      "hora_final": "03:59:59",
                      "valor": 0.2,
                      "valor_secundario": 0.3,
                      "limite_litros": 50,
                      "valor_bomba": 6.09,
                      "produto": "GASOLINA COMUM"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "put": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Grava o desconto normal",
        "description": "Grava o desconto normal (R$ por litro) de um dia + faixa, ou, sem dia_da_semana, de todas as 42 faixas da semana. Não mexe no desconto extra.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "put_agendaPosto",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_posto",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Posto ou lista separada por vírgula (grava em todos). No acesso de posto, sem ele vale o posto do acesso.",
            "example": "10"
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto).",
            "example": 1
          },
          {
            "name": "valor",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Desconto normal em R$ por litro (0 ou mais; 0 = sem desconto).",
            "example": 0.2
          },
          {
            "name": "dia_da_semana",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "0 (domingo) a 6 (sábado). Ausente = a semana inteira (todas as faixas)."
          },
          {
            "name": "hora",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Início da faixa: 00:00, 04:00, 08:00, 12:00, 16:00 ou 20:00. Obrigatório com dia_da_semana."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/agendaPostoExtra": {
      "get": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Agenda da semana (a mesma consulta de agendaPosto)",
        "description": "A agenda define o desconto do app por posto, combustível, dia da semana e faixa de 4 horas (00:00, 04:00, 08:00, 12:00, 16:00 e 20:00). Uma rotina cria a promoção de cada faixa uns 10 minutos antes de ela começar, com preço = preço de bomba − desconto, e só para postos com a agenda ligada (cadastro do posto); alteração feita durante uma faixa vale a partir da próxima. dia_da_semana: 0 = domingo … 6 = sábado. O desconto extra (valor_secundario) vale para os primeiros limite_litros do abastecimento; acima do limite vale o desconto normal. Escopo pelo acesso: posto, só o próprio; rede, os postos da rede; app, os postos do app. Posto fora do escopo: o GET volta vazio e o PUT recebe 403.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_agendaPostoExtra",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_posto",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Posto, ou lista de postos separados por vírgula (ex.: 10,11). Com vários postos, um valor só aparece quando é igual em todos (senão 0). No acesso de posto, sem ele vale o posto do acesso.",
            "example": "10"
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto).",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_promocao_agenda": 501,
                      "dia_da_semana": 0,
                      "hora_inicial": "00:00:00",
                      "hora_final": "03:59:59",
                      "valor": 0.2,
                      "valor_secundario": 0.3,
                      "limite_litros": 50,
                      "valor_bomba": 6.09,
                      "produto": "GASOLINA COMUM"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "put": {
        "tags": [
          "Preços e promoções"
        ],
        "summary": "Grava o desconto extra e o limite de litros",
        "description": "Grava o desconto extra e o limite de litros de um dia + faixa, ou, sem dia_da_semana, de todas as faixas da semana. Não mexe no desconto normal.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "put_agendaPostoExtra",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_posto",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Posto ou lista separada por vírgula. No acesso de posto, sem ele vale o posto do acesso.",
            "example": "10"
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto).",
            "example": 1
          },
          {
            "name": "valor_secundario",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Desconto extra em R$ por litro (0 = sem desconto extra).",
            "example": 0.3
          },
          {
            "name": "limite_litros",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Litros com o desconto extra; obrigatório (> 0) quando valor_secundario > 0.",
            "example": 50
          },
          {
            "name": "dia_da_semana",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "0 (domingo) a 6 (sábado). Ausente = a semana inteira."
          },
          {
            "name": "hora",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "00:00, 04:00, 08:00, 12:00, 16:00 ou 20:00. Obrigatório com dia_da_semana."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/faturamento": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Vendas do período com resumo (paginada)",
        "description": "Relatório de faturamento (vendas confirmadas) do app, com resumo. O escopo segue o acesso: rede, posto e pessoa ficam fixos no acesso desses tipos; o acesso de cliente não restringe (vê o app inteiro). A ordem das linhas não é garantida entre páginas.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_faturamento",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_inicial",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da venda, AAAA-MM-DD (aceita data_inicio/data_ini). Padrão 1980-01-01."
          },
          {
            "name": "data_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "AAAA-MM-DD (aceita data_fim). Padrão 2099-12-31."
          },
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita id_estabelecimento/id_posto). Fixo no acesso de posto."
          },
          {
            "name": "id_tx_rede",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Rede. Fixa no acesso de rede."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Cliente (consumidor). Fixo no acesso de pessoa."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Vendas com esse combustível (aceita id_produto)."
          },
          {
            "name": "valor_inicial / valor_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa do total com desconto (padrão 0 a 999999999,99)."
          },
          {
            "name": "caixa_app",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = recebidas no caixa, N = pagas no app, * (padrão) = todas."
          },
          {
            "name": "id_posto_convenio",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Vendas com esse convênio."
          },
          {
            "name": "fraude",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S, N ou * (padrão)."
          },
          {
            "name": "id_pessoa_caixa / id_pessoa_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Caixa ou frentista (pessoa)."
          },
          {
            "name": "tem_caixa / tem_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S (com CPF informado), N (sem) ou * (padrão)."
          },
          {
            "name": "funcionario",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = só vendas a funcionários ativos, N = sem elas, * (padrão) = todas."
          },
          {
            "name": "somente_usuarios_novos",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = só clientes cadastrados dentro do período."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_operacao": 123456,
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "id_tx_estabelecimento": 10,
                      "estabelecimento": "POSTO EXEMPLO",
                      "placa": "ABC1D23",
                      "quilometragem": 0,
                      "id_produto": 1,
                      "produto": "GASOLINA COMUM",
                      "quantidade1": 20.0,
                      "unitario_sem_desconto": 6.0,
                      "abast_sem_desconto1": 120.0,
                      "unitario": 5.8,
                      "abast_com_desconto1": 116.0,
                      "perc_desconto_abastecimento": 3.33,
                      "id_posto_convenio": 0,
                      "posto_convenio": "",
                      "nome_pessoa_caixa": "",
                      "cpf_caixa": "",
                      "nome_pessoa_frentista": "",
                      "cpf_frentista": "",
                      "quantidade": 20.0,
                      "total_sem_desconto": 120.0,
                      "total": 116.0,
                      "desconto": 4.0,
                      "data_hora_operacao": "2026-11-12 10:15:00",
                      "caixa": "N",
                      "valor_saldo": 16.0,
                      "valor_cartao": 100.0,
                      "valor_limite": 0.0,
                      "valor_pago": 100.0,
                      "fraude": "N",
                      "cashback": 0.0,
                      "pontos": 0,
                      "cupons": 0,
                      "sorte": 0
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "quantidade": 20.0,
                    "total_sem_desconto": 120.0,
                    "total_com_desconto": 116.0,
                    "desconto": 4.0,
                    "valor_saldo": 16.0,
                    "valor_cartao": 100.0,
                    "valor_pago": 100.0,
                    "caixa_total": null,
                    "app_total": 116.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/faturamentoApp": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Vendas do período com resumo (paginada)",
        "description": "Outro endereço do mesmo serviço de faturamento (mesmo código, parâmetros e resposta). Relatório de faturamento (vendas confirmadas) do app, com resumo. O escopo segue o acesso: rede, posto e pessoa ficam fixos no acesso desses tipos; o acesso de cliente não restringe (vê o app inteiro). A ordem das linhas não é garantida entre páginas.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_faturamentoApp",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_inicial",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da venda, AAAA-MM-DD (aceita data_inicio/data_ini). Padrão 1980-01-01."
          },
          {
            "name": "data_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "AAAA-MM-DD (aceita data_fim). Padrão 2099-12-31."
          },
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita id_estabelecimento/id_posto). Fixo no acesso de posto."
          },
          {
            "name": "id_tx_rede",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Rede. Fixa no acesso de rede."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Cliente (consumidor). Fixo no acesso de pessoa."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Vendas com esse combustível (aceita id_produto)."
          },
          {
            "name": "valor_inicial / valor_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa do total com desconto (padrão 0 a 999999999,99)."
          },
          {
            "name": "caixa_app",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = recebidas no caixa, N = pagas no app, * (padrão) = todas."
          },
          {
            "name": "id_posto_convenio",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Vendas com esse convênio."
          },
          {
            "name": "fraude",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S, N ou * (padrão)."
          },
          {
            "name": "id_pessoa_caixa / id_pessoa_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Caixa ou frentista (pessoa)."
          },
          {
            "name": "tem_caixa / tem_frentista",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S (com CPF informado), N (sem) ou * (padrão)."
          },
          {
            "name": "funcionario",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = só vendas a funcionários ativos, N = sem elas, * (padrão) = todas."
          },
          {
            "name": "somente_usuarios_novos",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = só clientes cadastrados dentro do período."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_operacao": 123456,
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "id_tx_estabelecimento": 10,
                      "estabelecimento": "POSTO EXEMPLO",
                      "placa": "ABC1D23",
                      "quilometragem": 0,
                      "id_produto": 1,
                      "produto": "GASOLINA COMUM",
                      "quantidade1": 20.0,
                      "unitario_sem_desconto": 6.0,
                      "abast_sem_desconto1": 120.0,
                      "unitario": 5.8,
                      "abast_com_desconto1": 116.0,
                      "perc_desconto_abastecimento": 3.33,
                      "id_posto_convenio": 0,
                      "posto_convenio": "",
                      "nome_pessoa_caixa": "",
                      "cpf_caixa": "",
                      "nome_pessoa_frentista": "",
                      "cpf_frentista": "",
                      "quantidade": 20.0,
                      "total_sem_desconto": 120.0,
                      "total": 116.0,
                      "desconto": 4.0,
                      "data_hora_operacao": "2026-11-12 10:15:00",
                      "caixa": "N",
                      "valor_saldo": 16.0,
                      "valor_cartao": 100.0,
                      "valor_limite": 0.0,
                      "valor_pago": 100.0,
                      "fraude": "N",
                      "cashback": 0.0,
                      "pontos": 0,
                      "cupons": 0,
                      "sorte": 0
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "quantidade": 20.0,
                    "total_sem_desconto": 120.0,
                    "total_com_desconto": 116.0,
                    "desconto": 4.0,
                    "valor_saldo": 16.0,
                    "valor_cartao": 100.0,
                    "valor_pago": 100.0,
                    "caixa_total": null,
                    "app_total": 116.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/credito": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Créditos do período (paginada)",
        "description": "Lista os créditos (entradas e saídas de saldo, por meio de pagamento) do app, com resumo. Escopo pelo acesso: app vê o app inteiro; rede, os clientes que abasteceram nos postos da rede; posto, os que abasteceram no posto; cliente, as pessoas do cliente; pessoa, só ela.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_credito",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_operacao_inicial / data_operacao_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da operação, AAAA-MM-DD (padrão 1980-01-01 a 2099-12-31)."
          },
          {
            "name": "data_situacao_inicial / data_situacao_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da última situação (padrão 1980-01-01 a 2099-12-31)."
          },
          {
            "name": "valor_inicial / valor_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa de valor (padrão 0 a 999999999,99)."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Cliente. Fixo no acesso de pessoa."
          },
          {
            "name": "tipo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "E (entrada), S (saída) ou * (padrão)."
          },
          {
            "name": "parcelado",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S (com parcelas), N (sem) ou * (padrão)."
          },
          {
            "name": "meio_pagamento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Grupo do meio de pagamento, como aparece em meio_pagamento (ex.: CARTÃO DE CRÉDITO, BOLETO, TRANSFERÊNCIA, DEPÓSITO, CAIXA)."
          },
          {
            "name": "fraude",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtra pelo campo fraude; * (padrão) = todos."
          },
          {
            "name": "faturamento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = já ligados a um faturamento, N = ainda não, * (padrão)."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_operacao": 9001,
                      "data_hora_operacao": "2026-11-10 09:00:00",
                      "data_hora_situacao": "2026-11-10 09:00:05",
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "valor": 100.0,
                      "tipo": "E",
                      "parcelas": 0,
                      "valor_parcela": 0.0,
                      "dados_pagamento": "VISA|0000",
                      "taxa_meio_pagamento": 3.5,
                      "meio_pagamento": "CARTÃO DE CRÉDITO",
                      "fraude": "N",
                      "id_operacao_faturamento": 0,
                      "meio_pagamento_id": "tr_000000"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "valor": 100.0,
                    "taxa_meio_pagamento": 3.5,
                    "entrada": 100.0,
                    "saida": 0.0,
                    "cartao_de_credito": 100.0,
                    "boleto": 0.0,
                    "transferencia": 0.0,
                    "deposito": 0.0,
                    "caixa": 0.0,
                    "outros": 0.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/movimento": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Movimento paginado",
        "description": "Extrato das operações por pessoa (compras de crédito, abastecimentos, transferências…), com o saldo acumulado. Lê a tabela de movimento que uma rotina do servidor mantém atualizada (não é em tempo real). Rede, posto e pessoa ficam fixos no acesso desses tipos.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_movimento",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_operacao_inicial / data_operacao_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da operação (padrão 1980-01-01 a 2099-12-31)."
          },
          {
            "name": "data_situacao_inicial / data_situacao_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data da situação (padrão 1980-01-01 a 2099-12-31)."
          },
          {
            "name": "id_operacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Uma operação."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Pessoa. Fixa no acesso de pessoa."
          },
          {
            "name": "id_tx_estabelecimento / id_tx_rede",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto / rede. Fixos nos acessos de posto e rede."
          },
          {
            "name": "operacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Código do tipo de operação (ex.: O = abastecimento, C = compra de crédito); * (padrão) = todos."
          },
          {
            "name": "valor_inicial / valor_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa de valor (padrão -999999999,99 a 999999999,99)."
          },
          {
            "name": "litros_inicial / litros_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa de litros (padrão 0 a 999999999,99)."
          },
          {
            "name": "id_comb",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Combustível (aceita id_produto)."
          },
          {
            "name": "id_meio_pagamento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Meio de pagamento."
          },
          {
            "name": "placa, bandeira, cashback, caixa, meio_pagamento_proprio, limite, fraude, manual, meio_pagamento_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Filtros por igualdade (S/N nos indicadores); * (padrão) = todos."
          },
          {
            "name": "id_posto_convenio / operacao_contrapartida_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Convênio / operação de contrapartida."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_operacao": 123456,
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "valor": -116.0,
                      "id_meio_pagamento": 0,
                      "meio_pagamento": "",
                      "operacao": "ABASTECIMENTO",
                      "data_hora_operacao": "2026-11-12 10:15:00",
                      "data_hora_situacao": "2026-11-12 10:15:00",
                      "placa": "ABC1D23",
                      "litros": 20.0,
                      "caixa": "N",
                      "valor_saldo": 16.0,
                      "valor_cartao": 100.0,
                      "id_tx_estabelecimento": 10,
                      "estabelecimento": "POSTO EXEMPLO",
                      "id_produto": 1,
                      "produto": "GASOLINA COMUM",
                      "valor_bomba": 6.0,
                      "valor_promocao": 5.8,
                      "manual": "N",
                      "saldo": 0.0
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/financeiroRelatorioSaldo": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Saldos (paginada) com total",
        "description": "Saldo de cada cliente (soma das operações confirmadas pagas pelo app até a data), com última compra de crédito e último abastecimento; CPF/CNPJ, celular e e-mail vêm mascarados. Escopo pelo acesso: app vê o app inteiro; rede, os clientes que abasteceram nos postos da rede; posto, os que abasteceram no posto; cliente, as pessoas do cliente; pessoa, só ela. Atenção: data_operacao_final não tem valor padrão; sem ela a lista vem vazia.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_financeiroRelatorioSaldo",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_operacao_final",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Saldo até esta data (AAAA-MM-DD). Sem ela não há resultado.",
            "example": "2026-11-12"
          },
          {
            "name": "data_operacao_inicial",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Padrão 1980-01-01."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Um cliente. Fixo no acesso de pessoa."
          },
          {
            "name": "saldo_inicial / saldo_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa de saldo (padrão 0 a 999999999,99; saldos zerados nunca aparecem)."
          },
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "B = só bloqueados; qualquer outro valor diferente de * = só não bloqueados; * (padrão) = todos."
          },
          {
            "name": "tipo_ordem",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ABASTECIMENTO (pelo último abastecimento), COMPRA_CREDITO (pela última compra) ou vazio (padrão: maior saldo primeiro)."
          },
          {
            "name": "ordem",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "ASC (padrão) ou DESC, com tipo_ordem."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_tx_pessoa": 555,
                      "cpf_cnpj": "000.***.***-00",
                      "nome_razao_social": "CLIENTE EXEMPLO",
                      "apelido_nome_fantasia": "",
                      "celular": "(00) *****-0000",
                      "email": "c***@exemplo.com.br",
                      "localidade": "CIDADE",
                      "estado": "UF",
                      "saldo": 50.0,
                      "bloqueado": false,
                      "ultima_compra_credito": "2026-11-01 10:00:00",
                      "ultimo_abastecimento": "2026-11-10 18:00:00"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "saldo_total": 50.0,
                    "saldo_bloqueado": 0.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/transferencia": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Repasses do período (paginada)",
        "description": "Lista os repasses feitos pelo meio de pagamento para a conta bancária dos postos, com resumo. Escopo pelo acesso: app vê todos os postos; rede, os postos da rede; posto, só o próprio; cliente e pessoa recebem 403.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_transferencia",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "data_transferencia_inicial / data_transferencia_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Data do repasse (padrão 1980-01-01 a 2099-12-31)."
          },
          {
            "name": "valor_inicial / valor_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa de valor (padrão 0 a 999999999,99)."
          },
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto (aceita id_estabelecimento/id_posto). Fixo no acesso de posto."
          },
          {
            "name": "situacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Situação do repasse, como vem do meio de pagamento; * (padrão) = todas."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_tx_estabelecimento": 10,
                      "estabelecimento": "POSTO EXEMPLO",
                      "meio_pagamento_id": "tf_000000",
                      "data_hora_lancamento": "2026-11-10 08:00:00",
                      "data_hora_atualizacao": "2026-11-11 08:00:00",
                      "data_transferencia": "2026-11-11",
                      "valor_original": 1000.0,
                      "valor": 965.0,
                      "situacao": "succeeded",
                      "banco_codigo": "000",
                      "banco_agencia": "0000",
                      "banco_conta": "00000-0"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "valor_original": 1000.0,
                    "valor": 965.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/transferenciaCredito": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Transações do repasse (paginada)",
        "description": "Detalha um repasse (transferencia.meio_pagamento_id): cada transação do meio de pagamento, o crédito do cliente e o faturamento do posto ligados a ela.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_transferenciaCredito",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "meio_pagamento_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Id do repasse no meio de pagamento (campo meio_pagamento_id de transferencia).",
            "example": "tf_000000"
          },
          {
            "name": "id_tx_estabelecimento",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Posto. Fixo no acesso de posto."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão e máximo 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_operacao_credito": 9001,
                      "id_tx_app": 1,
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "dados_pagamento": "VISA|0000",
                      "meio_pagamento": "CARTÃO DE CRÉDITO",
                      "fraude": "N",
                      "id_tx_estabelecimento": 10,
                      "estabelecimento": "POSTO EXEMPLO",
                      "id_operacao_faturamento": 123456,
                      "meio_pagamento_id": "tr_000000",
                      "situacao": "succeeded",
                      "valor_original": 100.0,
                      "valor": 96.5,
                      "taxa_meio_pagamento": 3.5,
                      "data_hora_lancamento": "2026-11-10 09:00:00",
                      "data_hora_atualizacao": "2026-11-11 08:00:00",
                      "data_prevista": "2026-11-11"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1,
                    "_size": 50,
                    "_page": 1
                  },
                  "resume": {
                    "valor_original": 100.0,
                    "valor": 96.5,
                    "taxa_meio_pagamento": 3.5,
                    "valor_liquido": 93.0
                  },
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/boletoSituacao": {
      "get": {
        "tags": [
          "Financeiro e relatórios"
        ],
        "summary": "Situação pelo par linha digitável + valor",
        "description": "Consulta a situação da compra de crédito paga por boleto, pela linha digitável e pelo valor. Sempre responde 200.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_boletoSituacao",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "linha_digitavel",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "47 dígitos (pontos e espaços são ignorados).",
            "example": "00000000000000000000000000000000000000000000000"
          },
          {
            "name": "valor",
            "in": "query",
            "required": true,
            "schema": {
              "type": "number"
            },
            "description": "Valor do boleto (> 0), igual ao gravado.",
            "example": 100.0
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "situacao": "CONFIRMADO",
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/ediClientes": {
      "get": {
        "tags": [
          "Clientes e fidelidade"
        ],
        "summary": "Exportação conforme a ação",
        "description": "Exporta os clientes do app para o sistema de frente de caixa do posto: identificação (código EAN-13 de cada cliente), cadastro completo ou o código de um cliente. Lista só clientes ativos, com cadastro completo e nome, criados ou alterados nas últimas data_range horas. CADPES (CPF/CNPJ, endereço, telefones e e-mail) respeita o escopo do acesso: app vê os clientes do app; rede, os que abasteceram nos postos da rede; posto, os que abasteceram no posto; cliente e pessoa recebem 403.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_ediClientes",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "acao",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "EI (identificação: código EAN-13 por cliente), CADPES (cadastro de pessoas) ou EAN13 (código de um cliente, por id_tx_pessoa).",
            "example": "EI"
          },
          {
            "name": "data_range",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "EI/CADPES: horas para trás (criados ou alterados). Padrão 24."
          },
          {
            "name": "pagina",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "EI/CADPES: 0 (padrão) = tudo de uma vez; n = página n de 50."
          },
          {
            "name": "codigo_pj / codigo_pf",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "CADPES: código da classe para PJ e PF (padrão 71 e 61)."
          },
          {
            "name": "tipo_pj / tipo_pf",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "CADPES: nome da classe para PJ e PF (padrão CLIENTE FIEL PJ e CLIENTE FIEL)."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "EAN13: cliente. Fixo no acesso de pessoa."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "identificacao": "1234567890128",
                      "tipo_entidade": "IAPP",
                      "pessoa": "CLIENTE EXEMPLO",
                      "portador": "",
                      "liberado": "S"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/fidelidadeCupom": {
      "get": {
        "tags": [
          "Clientes e fidelidade"
        ],
        "summary": "Lista de cupons do app (paginada)",
        "description": "Para o parceiro do programa de fidelidade (loja/serviço conveniado) consultar os cupons e dar baixa no cupom que o cliente apresenta. A fidelidade é recurso do GAS4US (pontos, cupons, parceiros). Permitido para todos os tipos de terceiro. O POST identifica o parceiro pela pessoa (id_tx_pessoa do escopo; num terceiro rede/estabelecimento vem do parâmetro id_tx_pessoa).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_fidelidadeCupom",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_fidelidade_parceiro",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Só cupons ativos desse parceiro (ausente = todos os cupons do app)."
          },
          {
            "name": "ativo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S, N ou * (padrão)."
          },
          {
            "name": "valor_troca_inicial / valor_troca_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa (padrão 0 a 999999999,99)."
          },
          {
            "name": "valor_custo_inicial / valor_custo_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa."
          },
          {
            "name": "valor_credito_inicial / valor_credito_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            },
            "description": "Faixa."
          },
          {
            "name": "data_troca_inicial / data_troca_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Período de troca contido no intervalo."
          },
          {
            "name": "data_consumo_inicial / data_consumo_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Período de consumo contido no intervalo."
          },
          {
            "name": "limite_<geral|pessoa|dia|semana|mes|ano>_inicial / _final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Faixas dos limites."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Tamanho da página (padrão 50)."
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Página (padrão 1)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "data": [
                    {
                      "id_fidelidade_cupom": 10,
                      "id_fidelidade_cupom_template": 3,
                      "token_imagem": "<token>",
                      "descricao": "LAVAGEM SIMPLES",
                      "codigo_interno": "LAV01",
                      "observacao": "",
                      "valor_troca": 100,
                      "data_hora_inicio_troca": "2026-11-01 00:00:00",
                      "data_hora_fim_troca": "2026-12-31 23:59:59",
                      "data_hora_inicio_consumo": "2026-11-01 00:00:00",
                      "data_hora_fim_consumo": "2027-01-31 23:59:59",
                      "valor_custo": 15.0,
                      "valor_credito": 0,
                      "limite_quantidade_pessoa": 1,
                      "limite_quantidade_dia": 0,
                      "limite_quantidade_semana": 0,
                      "limite_quantidade_mes": 0,
                      "limite_quantidade_ano": 0,
                      "limite_quantidade_geral": 100,
                      "ativo": "S",
                      "ponto_tipo": "PONTOS",
                      "parceiros": [
                        {
                          "id_fidelidade_parceiro": 4,
                          "nome": "PARCEIRO EXEMPLO",
                          "endereco1": "RUA EXEMPLO, 100",
                          "endereco2": "CIDADE/UF",
                          "latitude": -23.0,
                          "longitude": -51.0,
                          "telefone": "0000000000",
                          "celular": "00000000000",
                          "email": "parceiro@exemplo.com.br"
                        }
                      ],
                      "auto_consumivel": "N"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "post": {
        "tags": [
          "Clientes e fidelidade"
        ],
        "summary": "Consulta (e com acao=REGISTRAR, consome) o cupom pelo token de 9 dígitos",
        "description": "Para o parceiro do programa de fidelidade (loja/serviço conveniado) consultar os cupons e dar baixa no cupom que o cliente apresenta. A fidelidade é recurso do GAS4US (pontos, cupons, parceiros). Permitido para todos os tipos de terceiro. O POST identifica o parceiro pela pessoa (id_tx_pessoa do escopo; num terceiro rede/estabelecimento vem do parâmetro id_tx_pessoa).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.\n\n**Ações** (`acao` na query):\n- `(padrão)`: Só devolve os dados do cupom do token.\n- `REGISTRAR`: Marca o cupom como consumido por este parceiro (data_hora_consumo, consumido = S) e devolve os dados. Quando o cupom é de um tipo integrado à EVO, antes gera a senha na EVO e a devolve (senha, id_evo, expires_at); se a EVO recusar, nada é consumido.",
        "operationId": "post_fidelidadeCupom",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Token de 9 dígitos que o cliente mostra (válido só no dia; gerado a partir da operação de troca)."
          },
          {
            "name": "acao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "REGISTRAR = marca o cupom como consumido por este parceiro; ausente = só consulta."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Pessoa do parceiro (já fixada quando o terceiro é do tipo pessoa)."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "id_fidelidade_operacao": 7001,
                  "cpf_cnpj": "000.***.***-00",
                  "nome_razao_social": "CLIENTE EXEMPLO",
                  "codigo_interno": "LAV01",
                  "descricao": "LAVAGEM SIMPLES",
                  "valor_troca": 100,
                  "valor_custo": 15.0,
                  "valor_credito": 0,
                  "consumido": "S"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/fidelidadeExtrato": {
      "get": {
        "tags": [
          "Clientes e fidelidade"
        ],
        "summary": "Extrato paginado",
        "description": "Lista as operações de cupom (troca e consumo) do app com resumo (quantidade e soma do custo). Atenção ao filtro de pessoa: id_tx_pessoa filtra o CLIENTE da operação; num terceiro do tipo pessoa ele fica fixo na pessoa do terceiro, então para um parceiro use um terceiro rede/estabelecimento com id_fidelidade_parceiro. Permitido para todos os tipos de terceiro.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_fidelidadeExtrato",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_fidelidade_parceiro",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Parceiro que consumiu."
          },
          {
            "name": "id_fidelidade_cupom",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Cupom."
          },
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Cliente da operação (fixo no escopo para terceiro pessoa)."
          },
          {
            "name": "data_troca_inicial / data_troca_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            }
          },
          {
            "name": "data_consumo_inicial / data_consumo_final",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Só consumo informado = ordena por consumo."
          },
          {
            "name": "trocado",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S/N"
          },
          {
            "name": "consumido",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S/N"
          },
          {
            "name": "expirado",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S = não consumido e vencido; N = consumido ou ainda no prazo"
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "padrão 50"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "padrão 1"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "data": [
                    {
                      "id_fidelidade_operacao": 7001,
                      "id_fidelidade_parceiro": 4,
                      "parceiro": "PARCEIRO EXEMPLO",
                      "id_tx_pessoa": 555,
                      "pessoa": "CLIENTE EXEMPLO",
                      "id_fidelidade_cupom": 10,
                      "cupom": "LAVAGEM SIMPLES",
                      "codigo_interno": "LAV01",
                      "data_hora_troca": "2026-11-10 10:00:00",
                      "data_hora_consumo": "2026-11-11 15:30:00",
                      "valor": 15.0
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1
                  },
                  "resume": {
                    "quantidade": 1,
                    "total": 15.0
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/fidelidadeParceiro": {
      "get": {
        "tags": [
          "Clientes e fidelidade"
        ],
        "summary": "Lista paginada de parceiros",
        "description": "Lista os parceiros do programa de fidelidade do app (lojas/serviços onde o cupom é consumido). Terceiro do tipo pessoa vê só o próprio parceiro (id_tx_pessoa fixo). Permitido para todos os tipos de terceiro.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_fidelidadeParceiro",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_pessoa",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Pessoa do parceiro (fixa para terceiro pessoa)."
          },
          {
            "name": "ativo",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "S, N ou * (padrão)."
          },
          {
            "name": "size",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "padrão 50"
          },
          {
            "name": "page",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "padrão 1"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "data": [
                    {
                      "id_fidelidade_parceiro": 4,
                      "id_tx_pessoa": 777,
                      "pessoa": "PARCEIRO EXEMPLO LTDA",
                      "nome": "PARCEIRO EXEMPLO",
                      "endereco1": "RUA EXEMPLO, 100",
                      "endereco2": "CIDADE/UF",
                      "latitude": -23.0,
                      "longitude": -51.0,
                      "telefone": "0000000000",
                      "celular": "00000000000",
                      "email": "parceiro@exemplo.com.br",
                      "ativo": "S"
                    }
                  ],
                  "param": {
                    "_count": 1,
                    "_pages": 1
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/status": {
      "get": {
        "tags": [
          "Geral"
        ],
        "summary": "Responde ok se a credencial é válida",
        "description": "Não consulta nada: só confirma que a autenticação (APP/REDE/CNPJ/CPF + SENHA + A) e a permissão do terceiro estão corretas. Útil para testar a conexão da integração. Vale para todos os tipos de terceiro.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_status",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/tabelas": {
      "get": {
        "tags": [
          "Geral"
        ],
        "summary": "Conteúdo da tabela pedida",
        "description": "Tabelas de códigos para usar nos outros endpoints. Hoje só existe a tabela 1 (combustíveis: os id_comb de venda, preços e agenda).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_tabelas",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tabela",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "1 = combustíveis ativos.",
            "example": 1
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "data": [
                    {
                      "id_comb": 1,
                      "nome_comb": "GASOLINA COMUM"
                    },
                    {
                      "id_comb": 2,
                      "nome_comb": "ETANOL"
                    }
                  ],
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    },
    "/v1/terceiro/txObservacao": {
      "get": {
        "tags": [
          "Geral"
        ],
        "summary": "Consulta uma observação ou as de um registro",
        "description": "Por id_tx_observacao a resposta é um objeto plano (sem data[]): {status, id_tx_observacao, tabela, id, observacao, data_hora, ativo}.\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "get_txObservacao",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_observacao",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Id da observação (tem prioridade)."
          },
          {
            "name": "tabela",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Tabela (usar junto com id quando não houver id_tx_observacao)."
          },
          {
            "name": "id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer"
            },
            "description": "Id do registro na tabela."
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "data": [
                    {
                      "id_tx_observacao": 15,
                      "observacao": "Cliente pediu conferência",
                      "data_hora": "2026-11-10 09:30:00",
                      "ativo": true
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "post": {
        "tags": [
          "Geral"
        ],
        "summary": "Cria uma observação",
        "description": "Grava e consulta observações (texto) ligadas a qualquer registro do sistema, identificado por tabela + id. GET por id_tx_observacao devolve uma; por tabela + id devolve a lista. DELETE desativa (ativo = N). A API não verifica se a tabela e o id existem e não restringe pelo escopo do acesso (só pelo app).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "post_txObservacao",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tabela": {
                    "type": "string",
                    "description": "Nome da tabela do sistema a que a observação se refere (ex.: operacao)."
                  },
                  "id": {
                    "type": "integer",
                    "description": "Id do registro nessa tabela."
                  },
                  "observacao": {
                    "type": "string",
                    "description": "Texto"
                  },
                  "ativo": {
                    "type": "boolean",
                    "description": "true/false"
                  }
                },
                "required": [
                  "tabela",
                  "id",
                  "observacao"
                ]
              },
              "example": {
                "tabela": "operacao",
                "id": 9001,
                "observacao": "Cliente pediu conferência"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok",
                  "id_tx_observacao": 15
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "put": {
        "tags": [
          "Geral"
        ],
        "summary": "Altera uma observação (parcial)",
        "description": "Grava e consulta observações (texto) ligadas a qualquer registro do sistema, identificado por tabela + id. GET por id_tx_observacao devolve uma; por tabela + id devolve a lista. DELETE desativa (ativo = N). A API não verifica se a tabela e o id existem e não restringe pelo escopo do acesso (só pelo app).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "put_txObservacao",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_observacao",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Id da observação"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tabela": {
                    "type": "string",
                    "description": "Nome da tabela do sistema a que a observação se refere (ex.: operacao)."
                  },
                  "id": {
                    "type": "integer",
                    "description": "Id do registro nessa tabela."
                  },
                  "observacao": {
                    "type": "string",
                    "description": "Texto"
                  },
                  "ativo": {
                    "type": "boolean",
                    "description": "true/false"
                  }
                }
              },
              "example": {
                "observacao": "Texto corrigido"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      },
      "delete": {
        "tags": [
          "Geral"
        ],
        "summary": "Desativa uma observação",
        "description": "Grava e consulta observações (texto) ligadas a qualquer registro do sistema, identificado por tabela + id. GET por id_tx_observacao devolve uma; por tabela + id devolve a lista. DELETE desativa (ativo = N). A API não verifica se a tabela e o id existem e não restringe pelo escopo do acesso (só pelo app).\n\n**Perfis**: App, Rede, Posto, Cliente, Pessoa.",
        "operationId": "delete_txObservacao",
        "x-perfis": [
          "app",
          "rede",
          "estabelecimento",
          "cliente",
          "pessoa"
        ],
        "parameters": [
          {
            "name": "id_tx_observacao",
            "in": "query",
            "required": true,
            "schema": {
              "type": "integer"
            },
            "description": "Id da observação"
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "example": {
                  "status": "ok"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/Erro400"
          },
          "401": {
            "$ref": "#/components/responses/Erro401"
          },
          "403": {
            "$ref": "#/components/responses/Erro403"
          }
        }
      }
    }
  }
}
