{
  "openapi": "3.1.0",
  "info": {
    "title": "Notifique API v1",
    "version": "1.1.0",
    "description": "API do Gestor Notifique e da ativação de apps. Uma chave pn_ por integração: idfire e authkey nunca saem do servidor. Clientes e servidores de outro vendedor não são alcançados (404). Todo erro vem com \"sucesso\": false e a mensagem em \"erro\". Exemplos de resposta capturados do ambiente real, com dados mascarados."
  },
  "servers": [
    {
      "url": "https://apiv1.notifique.net/v1"
    }
  ],
  "security": [
    {
      "bearer": []
    },
    {
      "apiKeyHeader": []
    }
  ],
  "tags": [
    {
      "name": "Servidores",
      "description": "Servidores (painéis IPTV) do vendedor."
    },
    {
      "name": "Clientes",
      "description": "Clientes do gestor: busca, teste, edição, renovação, sincronização, subclientes e exclusão."
    },
    {
      "name": "Pacotes por tela",
      "description": "Valores por quantidade de telas (1 a 4). Disponível nos servidores The Best e PlayFast."
    },
    {
      "name": "Ativação de apps",
      "description": "Ativação de apps por MAC (já existente)."
    }
  ],
  "paths": {
    "/servidores": {
      "get": {
        "tags": [
          "Servidores"
        ],
        "summary": "Listar servidores",
        "description": "Lista os servidores do vendedor da chave, com o id usado nas outras rotas. Login e senha do painel IPTV nunca são devolvidos.",
        "operationId": "listar_servidores",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "sucesso": true,
                      "servidores": [
                        {
                          "id": 204,
                          "nome": "S*** M***",
                          "tipo": "outros",
                          "dns": "https://XXXXXX",
                          "dns2": "https://XXXXXX",
                          "renovacao_automatica": false,
                          "valores": {
                            "mensal": 35,
                            "bimestral": 70,
                            "trimestral": 90,
                            "semestral": 150,
                            "anual": 300
                          }
                        },
                        {
                          "id": 568,
                          "nome": "F***",
                          "tipo": "painel Foda",
                          "dns": "https://XXXXXX",
                          "dns2": "https://XXXXXX",
                          "renovacao_automatica": true,
                          "valores": {
                            "mensal": 35,
                            "bimestral": 70,
                            "trimestral": 90,
                            "semestral": 140,
                            "anual": 200
                          }
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "description": "Chave ausente, inválida ou revogada.",
            "content": {
              "application/json": {
                "examples": {
                  "sem_chave": {
                    "summary": "sem chave",
                    "value": {
                      "sucesso": false,
                      "erro": "Chave da API ausente ou inválida. Envie no cabeçalho Authorization: Bearer pn_..."
                    }
                  },
                  "chave_invalida": {
                    "summary": "chave inválida",
                    "value": {
                      "sucesso": false,
                      "erro": "Chave da API inválida ou revogada."
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/clientes": {
      "get": {
        "tags": [
          "Clientes"
        ],
        "summary": "Buscar cliente",
        "description": "Busca pelo WhatsApp ou pelo idBanco. Só encontra clientes do vendedor da chave. Sem cadastro: 200 com \"cliente\": false.",
        "operationId": "buscar_cliente",
        "parameters": [
          {
            "in": "query",
            "name": "whats",
            "description": "DDI+DDD+número. Obrigatório se não enviar id.",
            "schema": {
              "type": "string",
              "example": "5511999990000"
            }
          },
          {
            "in": "query",
            "name": "id",
            "description": "idBanco do cliente. Obrigatório se não enviar whats.",
            "schema": {
              "type": "integer",
              "example": 12345
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso_por_whats": {
                    "summary": "sucesso por whats",
                    "value": {
                      "sucesso": true,
                      "mensagem": "edit",
                      "cliente": true,
                      "link_pagamento": "https://pagzap.online/XXXXXX",
                      "idBanco": 584106,
                      "data": "05/11/2026",
                      "enviou": false,
                      "whats": "(11************",
                      "idFire": "f0i*************************",
                      "userid": "135****",
                      "nome": "T*** D***",
                      "instancia": "HJV*****",
                      "vencimento": "07/11/2026",
                      "login": "712*******",
                      "vendedor": "ftv***",
                      "arquivado": false,
                      "userTeste": true,
                      "linkPagamento": "https://pagzap.online/XXXXXX",
                      "valorPadrao": false,
                      "mensal": "0",
                      "bimestral": "0",
                      "trimestral": "0",
                      "semestral": "0",
                      "anual": "0",
                      "dataEnvio": null,
                      "whatsBR": true,
                      "cron1": false,
                      "cron2": false,
                      "cron3": true,
                      "cron5": true,
                      "alert1": false,
                      "alert2": true,
                      "alert15": false,
                      "alert30": false,
                      "senha": "304*******",
                      "idSigma": null,
                      "idServidor": 114,
                      "nota": "Teste Auto - Gestor",
                      "cronVencimento": false,
                      "ativo": true,
                      "email": null,
                      "cobrarEmail": false
                    }
                  },
                  "sucesso_por_id": {
                    "summary": "sucesso por id",
                    "value": {
                      "sucesso": true,
                      "mensagem": "edit",
                      "cliente": true,
                      "link_pagamento": "https://pagzap.online/XXXXXX",
                      "idBanco": 584106,
                      "data": "05/11/2026",
                      "enviou": false,
                      "whats": "(11************",
                      "idFire": "f0i*************************",
                      "userid": "135****",
                      "nome": "T*** D***",
                      "instancia": "HJV*****",
                      "vencimento": "07/11/2026",
                      "login": "712*******",
                      "vendedor": "ftv***",
                      "arquivado": false,
                      "userTeste": true,
                      "linkPagamento": "https://pagzap.online/XXXXXX",
                      "valorPadrao": false,
                      "mensal": "0",
                      "bimestral": "0",
                      "trimestral": "0",
                      "semestral": "0",
                      "anual": "0",
                      "dataEnvio": null,
                      "whatsBR": true,
                      "cron1": false,
                      "cron2": false,
                      "cron3": true,
                      "cron5": true,
                      "alert1": false,
                      "alert2": true,
                      "alert15": false,
                      "alert30": false,
                      "senha": "304*******",
                      "idSigma": null,
                      "idServidor": 114,
                      "nota": "Teste Auto - Gestor",
                      "cronVencimento": false,
                      "ativo": true,
                      "email": null,
                      "cobrarEmail": false,
                      "subClients": []
                    }
                  },
                  "whats_sem_cadastro": {
                    "summary": "whats sem cadastro",
                    "value": {
                      "sucesso": true,
                      "cliente": false,
                      "mensagem": "Whatsapp sem cadastro."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "sem_parametro": {
                    "summary": "sem parâmetro",
                    "value": {
                      "sucesso": false,
                      "erro": "Informe whats (DDI+DDD+número) ou id (idBanco)."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/clientes/teste": {
      "post": {
        "tags": [
          "Clientes"
        ],
        "summary": "Criar teste automático",
        "description": "Cria o cliente de teste no painel IPTV e no gestor. Com valorPadrao=false, informe os valores avulsos; com datasPadrao=false, as datas de aviso.",
        "operationId": "criar_teste_automatico",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "id_banco": 584106,
                      "data": "05/11/2026",
                      "enviou": false,
                      "whats": "(11************",
                      "idfire": "f0i*************************",
                      "userid": "135****",
                      "nome": "T*** D***",
                      "instancia": "HJV*****",
                      "vencimento": "07/11/2026",
                      "mensagem": "Sucesso ao gerar teste.",
                      "login": "712*******",
                      "vendedor": "ftv***",
                      "arquivado": false,
                      "user_teste": true,
                      "link_pagamento": "https://pagzap.online/XXXXXX",
                      "valor_padrao": false,
                      "mensal": "0",
                      "bimestral": "0",
                      "trimestral": "0",
                      "semestral": "0",
                      "anual": "0",
                      "data_envio": null,
                      "whats_br": true,
                      "cron1": false,
                      "cron2": false,
                      "cron3": true,
                      "cron5": true,
                      "alert1": false,
                      "alert2": true,
                      "alert15": false,
                      "alert30": false,
                      "senha": "304*******",
                      "id_sigma": null,
                      "idServidor": 114,
                      "nota": "Teste Auto - Gestor",
                      "cronVencimento": false,
                      "ativo": true,
                      "horaenvio": "08:00",
                      "email": null,
                      "cobrarEmail": false,
                      "sucesso": true
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "sem_whatscliente": {
                    "summary": "sem whatsCliente",
                    "value": {
                      "sucesso": false,
                      "erro": "whatsCliente é obrigatório."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "servidor_de_outro_vendedor": {
                    "summary": "servidor de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Servidor não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "whatsCliente",
                  "idServidor"
                ],
                "properties": {
                  "whatsCliente": {
                    "type": "string",
                    "description": "DDI+DDD+número",
                    "example": "5511999998888"
                  },
                  "nomeCliente": {
                    "type": "string",
                    "example": "João Silva"
                  },
                  "idServidor": {
                    "type": "integer",
                    "description": "id de GET /servidores",
                    "example": 114
                  },
                  "valorPadrao": {
                    "type": "boolean",
                    "description": "true = valores do servidor",
                    "example": true
                  },
                  "valor_mensal": {
                    "type": "number"
                  },
                  "valor_bimestral": {
                    "type": "number"
                  },
                  "valor_trimestral": {
                    "type": "number"
                  },
                  "valor_semestral": {
                    "type": "number"
                  },
                  "valor_anual": {
                    "type": "number"
                  },
                  "datasPadrao": {
                    "type": "boolean",
                    "description": "true = dias de aviso padrão do vendedor",
                    "example": true
                  },
                  "5antes": {
                    "type": "boolean"
                  },
                  "3antes": {
                    "type": "boolean"
                  },
                  "2antes": {
                    "type": "boolean"
                  },
                  "1antes": {
                    "type": "boolean"
                  },
                  "noDia": {
                    "type": "boolean"
                  },
                  "1depois": {
                    "type": "boolean"
                  },
                  "5depois": {
                    "type": "boolean"
                  },
                  "15depois": {
                    "type": "boolean"
                  },
                  "30depois": {
                    "type": "boolean"
                  }
                }
              },
              "example": {
                "whatsCliente": "5511977149078",
                "nomeCliente": "Teste Documentacao",
                "idServidor": 114,
                "valorPadrao": true,
                "datasPadrao": true
              }
            }
          }
        }
      }
    },
    "/clientes/{id}": {
      "patch": {
        "tags": [
          "Clientes"
        ],
        "summary": "Atualizar cliente",
        "description": "Ligue as flags editar_* do que quiser mudar e mande os valores em informacoes. sincronizar=true sincroniza com o painel depois.",
        "operationId": "atualizar_cliente",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "idBanco": 584106,
                      "data": "05/11/2026",
                      "enviou": false,
                      "whats": "(11************",
                      "idFire": "f0i*************************",
                      "userid": "135****",
                      "nome": "T*** D***",
                      "instancia": "HJV*****",
                      "vencimento": "07/11/2026",
                      "mensagem": "edit",
                      "login": "712*******",
                      "vendedor": "ftv***",
                      "arquivado": false,
                      "userTeste": true,
                      "linkPagamento": "https://pagzap.online/XXXXXX",
                      "valorPadrao": false,
                      "mensal": "0",
                      "bimestral": "0",
                      "trimestral": "0",
                      "semestral": "0",
                      "anual": "0",
                      "dataEnvio": null,
                      "whatsBR": true,
                      "cron1": false,
                      "cron2": false,
                      "cron3": true,
                      "cron5": true,
                      "alert1": false,
                      "alert2": true,
                      "alert15": false,
                      "alert30": false,
                      "senha": "304*******",
                      "idSigma": null,
                      "idServidor": 114,
                      "nota": "editado pela API",
                      "cronVencimento": false,
                      "ativo": true,
                      "email": null,
                      "cobrarEmail": false,
                      "sucesso": true,
                      "resposta": "cliente atualizado com sucesso."
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "nada_para_atualizar": {
                    "summary": "nada para atualizar",
                    "value": {
                      "sucesso": false,
                      "erro": "Nada para atualizar. Veja os campos editar_* e informacoes."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "cliente_de_outro_vendedor": {
                    "summary": "cliente de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Cliente não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "editar_valor": {
                    "type": "boolean"
                  },
                  "editar_nome": {
                    "type": "boolean"
                  },
                  "editar_whatsapp": {
                    "type": "boolean"
                  },
                  "editar_vencimento": {
                    "type": "boolean"
                  },
                  "editar_nota": {
                    "type": "boolean",
                    "example": true
                  },
                  "editar_email": {
                    "type": "boolean"
                  },
                  "editar_login": {
                    "type": "boolean"
                  },
                  "editar_senha": {
                    "type": "boolean"
                  },
                  "sincronizar": {
                    "type": "boolean"
                  },
                  "informacoes": {
                    "type": "object",
                    "properties": {
                      "nome": {
                        "type": "string"
                      },
                      "whatsapp": {
                        "type": "string"
                      },
                      "whatsappBR": {
                        "type": "boolean"
                      },
                      "vencimento": {
                        "type": "string",
                        "description": "dd/mm/aaaa"
                      },
                      "nota": {
                        "type": "string",
                        "example": "editado pela API"
                      },
                      "email": {
                        "type": "string"
                      },
                      "cobrarPorEmail": {
                        "type": "boolean"
                      },
                      "login": {
                        "type": "string"
                      },
                      "senha": {
                        "type": "string"
                      },
                      "valorPadrao": {
                        "type": "boolean"
                      },
                      "valorMensal": {
                        "type": "number"
                      },
                      "valorBimestral": {
                        "type": "number"
                      },
                      "valorTrimestral": {
                        "type": "number"
                      },
                      "valorSemestral": {
                        "type": "number"
                      },
                      "valorAnual": {
                        "type": "number"
                      }
                    }
                  }
                }
              },
              "example": {
                "editar_nota": true,
                "informacoes": {
                  "nota": "editado pela API"
                }
              }
            }
          }
        }
      },
      "delete": {
        "tags": [
          "Clientes"
        ],
        "summary": "Deletar cliente",
        "description": "Remove o cliente do gestor. Não pode ser desfeito: exige ?confirmar=true.",
        "operationId": "deletar_cliente",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          },
          {
            "in": "query",
            "name": "confirmar",
            "required": true,
            "description": "precisa ser true",
            "schema": {
              "type": "boolean",
              "example": true
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "message": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "sem_confirmar": {
                    "summary": "sem confirmar",
                    "value": {
                      "sucesso": false,
                      "erro": "Para deletar, envie ?confirmar=true. A exclusão não pode ser desfeita."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "cliente_de_outro_vendedor": {
                    "summary": "cliente de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Cliente não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/clientes/{id}/renovar": {
      "post": {
        "tags": [
          "Clientes"
        ],
        "summary": "Renovar no painel",
        "description": "Renova no painel IPTV do servidor do cliente, como o botão Renovar do gestor. CONSOME CRÉDITO DO PAINEL. O tipo do painel e o servidor são descobertos pela API.",
        "operationId": "renovar_no_painel",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "meses_invalido": {
                    "summary": "meses inválido",
                    "value": {
                      "sucesso": false,
                      "erro": "meses deve ser um destes: 1, 2, 3, 6, 12."
                    }
                  },
                  "valor_pago_invalido": {
                    "summary": "valor_pago inválido",
                    "value": {
                      "sucesso": false,
                      "erro": "valor_pago inválido."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "cliente_de_outro_vendedor": {
                    "summary": "cliente de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Cliente não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "meses",
                  "valor_pago"
                ],
                "properties": {
                  "meses": {
                    "type": "integer",
                    "enum": [
                      1,
                      2,
                      3,
                      6,
                      12
                    ],
                    "example": 1
                  },
                  "valor_pago": {
                    "type": "number",
                    "example": 30
                  },
                  "telas": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 4,
                    "description": "0 = manter a quantidade atual",
                    "example": 0
                  }
                }
              },
              "example": {
                "meses": 1,
                "valor_pago": 30,
                "telas": 0
              }
            }
          }
        }
      }
    },
    "/clientes/{id}/sincronizar": {
      "post": {
        "tags": [
          "Clientes"
        ],
        "summary": "Sincronizar com o painel",
        "description": "Puxa do painel IPTV os dados atuais do cliente (vencimento, login, telas) e atualiza o gestor. Sem corpo.",
        "operationId": "sincronizar_com_o_painel",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "resposta": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "cliente_de_outro_vendedor": {
                    "summary": "cliente de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Cliente não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/clientes/{id}/subclientes": {
      "post": {
        "tags": [
          "Clientes"
        ],
        "summary": "Adicionar subcliente",
        "description": "Importa a conta do painel pelo login e liga ao cliente {id}. Sem servidor_id usa o servidor do cliente pai.",
        "operationId": "adicionar_subcliente",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso",
            "content": {
              "application/json": {
                "examples": {
                  "sucesso": {
                    "summary": "sucesso",
                    "value": {
                      "resposta": "ok"
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
            "content": {
              "application/json": {
                "examples": {
                  "sem_login": {
                    "summary": "sem login",
                    "value": {
                      "sucesso": false,
                      "erro": "login é obrigatório (o usuário da conta no painel IPTV)."
                    }
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "login_nao_existe_no_painel": {
                    "summary": "login não existe no painel",
                    "value": {
                      "sucesso": false,
                      "erro": "Conta não encontrada no painel com esse login."
                    }
                  },
                  "servidor_de_outro_vendedor": {
                    "summary": "servidor de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Servidor não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "login"
                ],
                "properties": {
                  "login": {
                    "type": "string",
                    "description": "usuário da conta no painel IPTV",
                    "example": "usuario_tela2"
                  },
                  "servidor_id": {
                    "type": "integer",
                    "description": "outro servidor do vendedor (opcional)"
                  },
                  "nota": {
                    "type": "string",
                    "example": "TV do quarto"
                  }
                }
              },
              "example": {
                "login": "712*******",
                "nota": "TV do quarto"
              }
            }
          }
        }
      }
    },
    "/servidores/{id}/pacotes": {
      "put": {
        "tags": [
          "Pacotes por tela"
        ],
        "summary": "Pacotes do servidor",
        "description": "Valores por quantidade de telas do servidor (The Best ou PlayFast).",
        "operationId": "pacotes_do_servidor",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "id do servidor (vem em GET /servidores).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "servidor_de_outro_vendedor": {
                    "summary": "servidor de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Servidor não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "valorPadrao": {
                    "type": "boolean"
                  },
                  "mensal1": {
                    "type": "number",
                    "description": "mensal, 1 tela(s); 0 desativa"
                  },
                  "mensal2": {
                    "type": "number",
                    "description": "mensal, 2 tela(s); 0 desativa"
                  },
                  "mensal3": {
                    "type": "number",
                    "description": "mensal, 3 tela(s); 0 desativa"
                  },
                  "mensal4": {
                    "type": "number",
                    "description": "mensal, 4 tela(s); 0 desativa"
                  },
                  "bimestral1": {
                    "type": "number",
                    "description": "bimestral, 1 tela(s); 0 desativa"
                  },
                  "bimestral2": {
                    "type": "number",
                    "description": "bimestral, 2 tela(s); 0 desativa"
                  },
                  "bimestral3": {
                    "type": "number",
                    "description": "bimestral, 3 tela(s); 0 desativa"
                  },
                  "bimestral4": {
                    "type": "number",
                    "description": "bimestral, 4 tela(s); 0 desativa"
                  },
                  "trimestral1": {
                    "type": "number",
                    "description": "trimestral, 1 tela(s); 0 desativa"
                  },
                  "trimestral2": {
                    "type": "number",
                    "description": "trimestral, 2 tela(s); 0 desativa"
                  },
                  "trimestral3": {
                    "type": "number",
                    "description": "trimestral, 3 tela(s); 0 desativa"
                  },
                  "trimestral4": {
                    "type": "number",
                    "description": "trimestral, 4 tela(s); 0 desativa"
                  },
                  "semestral1": {
                    "type": "number",
                    "description": "semestral, 1 tela(s); 0 desativa"
                  },
                  "semestral2": {
                    "type": "number",
                    "description": "semestral, 2 tela(s); 0 desativa"
                  },
                  "semestral3": {
                    "type": "number",
                    "description": "semestral, 3 tela(s); 0 desativa"
                  },
                  "semestral4": {
                    "type": "number",
                    "description": "semestral, 4 tela(s); 0 desativa"
                  },
                  "anual1": {
                    "type": "number",
                    "description": "anual, 1 tela(s); 0 desativa"
                  },
                  "anual2": {
                    "type": "number",
                    "description": "anual, 2 tela(s); 0 desativa"
                  },
                  "anual3": {
                    "type": "number",
                    "description": "anual, 3 tela(s); 0 desativa"
                  },
                  "anual4": {
                    "type": "number",
                    "description": "anual, 4 tela(s); 0 desativa"
                  }
                }
              },
              "example": {}
            }
          }
        }
      }
    },
    "/clientes/{id}/pacotes": {
      "put": {
        "tags": [
          "Pacotes por tela"
        ],
        "summary": "Pacotes do cliente",
        "description": "Valores por quantidade de telas só para este cliente (servidor The Best ou PlayFast).",
        "operationId": "pacotes_do_cliente",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "idBanco do cliente (vem em GET /clientes).",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
            "content": {
              "application/json": {
                "examples": {
                  "cliente_de_outro_vendedor": {
                    "summary": "cliente de outro vendedor",
                    "value": {
                      "sucesso": false,
                      "erro": "Cliente não encontrado para esta chave."
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "valorPadrao": {
                    "type": "boolean"
                  },
                  "mensal1": {
                    "type": "number",
                    "description": "mensal, 1 tela(s); 0 desativa"
                  },
                  "mensal2": {
                    "type": "number",
                    "description": "mensal, 2 tela(s); 0 desativa"
                  },
                  "mensal3": {
                    "type": "number",
                    "description": "mensal, 3 tela(s); 0 desativa"
                  },
                  "mensal4": {
                    "type": "number",
                    "description": "mensal, 4 tela(s); 0 desativa"
                  },
                  "bimestral1": {
                    "type": "number",
                    "description": "bimestral, 1 tela(s); 0 desativa"
                  },
                  "bimestral2": {
                    "type": "number",
                    "description": "bimestral, 2 tela(s); 0 desativa"
                  },
                  "bimestral3": {
                    "type": "number",
                    "description": "bimestral, 3 tela(s); 0 desativa"
                  },
                  "bimestral4": {
                    "type": "number",
                    "description": "bimestral, 4 tela(s); 0 desativa"
                  },
                  "trimestral1": {
                    "type": "number",
                    "description": "trimestral, 1 tela(s); 0 desativa"
                  },
                  "trimestral2": {
                    "type": "number",
                    "description": "trimestral, 2 tela(s); 0 desativa"
                  },
                  "trimestral3": {
                    "type": "number",
                    "description": "trimestral, 3 tela(s); 0 desativa"
                  },
                  "trimestral4": {
                    "type": "number",
                    "description": "trimestral, 4 tela(s); 0 desativa"
                  },
                  "semestral1": {
                    "type": "number",
                    "description": "semestral, 1 tela(s); 0 desativa"
                  },
                  "semestral2": {
                    "type": "number",
                    "description": "semestral, 2 tela(s); 0 desativa"
                  },
                  "semestral3": {
                    "type": "number",
                    "description": "semestral, 3 tela(s); 0 desativa"
                  },
                  "semestral4": {
                    "type": "number",
                    "description": "semestral, 4 tela(s); 0 desativa"
                  },
                  "anual1": {
                    "type": "number",
                    "description": "anual, 1 tela(s); 0 desativa"
                  },
                  "anual2": {
                    "type": "number",
                    "description": "anual, 2 tela(s); 0 desativa"
                  },
                  "anual3": {
                    "type": "number",
                    "description": "anual, 3 tela(s); 0 desativa"
                  },
                  "anual4": {
                    "type": "number",
                    "description": "anual, 4 tela(s); 0 desativa"
                  }
                }
              },
              "example": {}
            }
          }
        }
      }
    },
    "/apps": {
      "get": {
        "tags": [
          "Ativação de apps"
        ],
        "summary": "Apps disponíveis",
        "description": "Apps disponíveis para o vendedor, com o idapp usado na ativação.",
        "operationId": "apps_disponiveis",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/carteira": {
      "get": {
        "tags": [
          "Ativação de apps"
        ],
        "summary": "Carteira",
        "description": "Créditos, ativados e com erro.",
        "operationId": "carteira",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/macs": {
      "get": {
        "tags": [
          "Ativação de apps"
        ],
        "summary": "Listar MACs",
        "description": "Lista de MACs ativados; busca filtra por fragmento do MAC (até 50 por página).",
        "operationId": "listar_macs",
        "parameters": [
          {
            "in": "query",
            "name": "pg",
            "schema": {
              "type": "integer",
              "example": 1
            }
          },
          {
            "in": "query",
            "name": "erro",
            "description": "true = só os com erro",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "in": "query",
            "name": "busca",
            "description": "fragmento do MAC",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        }
      }
    },
    "/ativacoes": {
      "post": {
        "tags": [
          "Ativação de apps"
        ],
        "summary": "Ativar app",
        "description": "Solicita a ativação de um app para um MAC. mac aceita com ou sem separador; appkey é a chave de ativação do app.",
        "operationId": "ativar_app",
        "parameters": [],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "idapp",
                  "mac",
                  "appkey"
                ],
                "properties": {
                  "idapp": {
                    "type": "string",
                    "description": "de GET /apps",
                    "example": "ID_DO_APP"
                  },
                  "mac": {
                    "type": "string",
                    "example": "AA:BB:CC:DD:EE:FF"
                  },
                  "appkey": {
                    "type": "string",
                    "description": "chave de ativação do app",
                    "example": "123456"
                  },
                  "whatsapp": {
                    "type": "string",
                    "example": "5511999990000"
                  },
                  "notificar": {
                    "type": "boolean",
                    "example": false
                  }
                }
              },
              "example": {
                "idapp": "ID_DO_APP",
                "mac": "AA:BB:CC:DD:EE:FF",
                "appkey": "123456",
                "whatsapp": "5511999990000",
                "notificar": false
              }
            }
          }
        }
      }
    },
    "/ativacoes/{idpag}/reenviar": {
      "post": {
        "tags": [
          "Ativação de apps"
        ],
        "summary": "Reenviar ativação",
        "description": "Reenvia uma ativação que ficou com erro (idpag vem de GET /macs?erro=true).",
        "operationId": "reenviar_ativacao",
        "parameters": [
          {
            "name": "idpag",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Sucesso"
          },
          "400": {
            "$ref": "#/components/responses/E400"
          },
          "401": {
            "$ref": "#/components/responses/E401"
          },
          "404": {
            "$ref": "#/components/responses/E404"
          },
          "429": {
            "$ref": "#/components/responses/E429"
          },
          "502": {
            "$ref": "#/components/responses/E502"
          },
          "504": {
            "$ref": "#/components/responses/E504"
          }
        },
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "mac",
                  "appkey"
                ],
                "properties": {
                  "mac": {
                    "type": "string",
                    "example": "AA:BB:CC:DD:EE:FF"
                  },
                  "appkey": {
                    "type": "string",
                    "example": "123456"
                  }
                }
              },
              "example": {
                "mac": "AA:BB:CC:DD:EE:FF",
                "appkey": "123456"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer",
        "description": "Authorization: Bearer pn_... (crie no Painel Notifique, tela de chaves da API)"
      },
      "apiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-API-Key"
      }
    },
    "schemas": {
      "Erro": {
        "type": "object",
        "properties": {
          "sucesso": {
            "type": "boolean",
            "const": false
          },
          "erro": {
            "type": "string"
          }
        }
      }
    },
    "responses": {
      "E400": {
        "description": "Campo obrigatório ausente ou inválido (a mensagem diz qual).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "Campo obrigatório ausente ou inválido (a mensagem diz qual)."
            }
          }
        }
      },
      "E401": {
        "description": "Chave ausente, inválida ou revogada.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "Chave da API ausente ou inválida. Envie no cabeçalho Authorization: Bearer pn_..."
            }
          }
        }
      },
      "E404": {
        "description": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "Cliente ou servidor não encontrado para esta chave (ou de outro vendedor)."
            }
          }
        }
      },
      "E429": {
        "description": "Limite de requisições por minuto excedido.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "Limite de requisições por minuto excedido."
            }
          }
        }
      },
      "E502": {
        "description": "O sistema recusou a solicitação.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "O sistema recusou a solicitação."
            }
          }
        }
      },
      "E504": {
        "description": "O sistema demorou a responder. Tente de novo.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Erro"
            },
            "example": {
              "sucesso": false,
              "erro": "O sistema demorou a responder. Tente de novo."
            }
          }
        }
      }
    }
  }
}