{
  "openapi": "3.1.0",
  "info": {
    "title": "ASAP Telecom · Serviços abertos",
    "version": "1.0.0",
    "summary": "Consulta pública de viabilidade (cobertura) da ASAP Telecom, para integradores e agentes de IA.",
    "description": "Serviços abertos e somente leitura da ASAP Telecom, operadora de telecomunicações B2B de São Paulo (AS264144).\n\n**Consulta de viabilidade:** informa se a ASAP atende um endereço no Brasil, se por fibra óptica própria (até 2,5 km da rede própria na Grande São Paulo) ou por rádio (sob análise técnica), e o POP de referência (nome e zona). Mesma regra da página https://www.asaptelecom.com.br/rede-asap.\n\nA resposta nunca traz preço, prazo de instalação, custo, dado de infraestrutura interna (caixa de emenda, distância, coordenada da rede) nem dado pessoal.\n\nA ASAP atende somente empresas (internet dedicada) e provedores de internet (atacado). Não vende internet residencial nem banda larga.\n\n**Limites:** 60 consultas por minuto por origem sem chave. Com chave de parceiro (cabeçalho `x-api-key`, opcional, nunca na URL), 600 por minuto. CORS liberado para leitura.\n\n**English summary:** Open, read-only coverage check for ASAP Telecom (São Paulo, Brazil). Send a Brazilian ZIP code (CEP) with the street number, or a full address, and get whether ASAP serves it over its own fiber (up to 2.5 km from its network in Greater São Paulo) or by radio (subject to technical review), plus the reference POP. No prices, installation times, internal network data or personal data. 60 requests per minute per client; optional partner key in the `x-api-key` header.\n\nPara agentes de IA também há um servidor MCP: https://ollzbnkfxfsusjtjssec.supabase.co/functions/v1/mcp (ferramenta `check_coverage`). Documentação humana: https://www.asaptelecom.com.br/desenvolvedores",
    "contact": {
      "name": "ASAP Telecom",
      "url": "https://www.asaptelecom.com.br/contato"
    },
    "termsOfService": "https://www.asaptelecom.com.br/politica-de-privacidade-e-termos"
  },
  "externalDocs": {
    "description": "Documentação em PT-BR com exemplos (resumo em inglês)",
    "url": "https://www.asaptelecom.com.br/desenvolvedores"
  },
  "servers": [
    { "url": "https://www.asaptelecom.com.br", "description": "Produção" }
  ],
  "tags": [
    { "name": "viabilidade", "description": "Cobertura da rede da ASAP Telecom por endereço" }
  ],
  "paths": {
    "/servicos/v1/viabilidade": {
      "get": {
        "tags": ["viabilidade"],
        "operationId": "consultarViabilidade",
        "summary": "A ASAP atende este endereço? (GET)",
        "description": "Informe `cep` (com `numero`, opcional) ou `endereco`. Se vierem os dois, vale o CEP.",
        "parameters": [
          { "$ref": "#/components/parameters/cep" },
          { "$ref": "#/components/parameters/numero" },
          { "$ref": "#/components/parameters/endereco" },
          { "$ref": "#/components/parameters/origem" }
        ],
        "security": [{}, { "chaveParceiro": [] }],
        "responses": {
          "200": { "$ref": "#/components/responses/Resultado" },
          "400": { "$ref": "#/components/responses/Erro" },
          "401": { "$ref": "#/components/responses/Erro" },
          "429": { "$ref": "#/components/responses/Limite" },
          "503": { "$ref": "#/components/responses/Erro" }
        }
      },
      "post": {
        "tags": ["viabilidade"],
        "operationId": "consultarViabilidadePost",
        "summary": "A ASAP atende este endereço? (POST com JSON)",
        "description": "Mesma consulta do GET, com os dados no corpo. Recomendado para integradores: o endereço não fica no registro de acesso do servidor.",
        "parameters": [{ "$ref": "#/components/parameters/origem" }],
        "security": [{}, { "chaveParceiro": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/Consulta" },
              "examples": {
                "cep": { "summary": "CEP com número", "value": { "cep": "04578-000", "numero": "1500" } },
                "endereco": { "summary": "Endereço completo", "value": { "endereco": "Avenida Paulista, 1000, São Paulo" } }
              }
            }
          }
        },
        "responses": {
          "200": { "$ref": "#/components/responses/Resultado" },
          "400": { "$ref": "#/components/responses/Erro" },
          "401": { "$ref": "#/components/responses/Erro" },
          "413": { "$ref": "#/components/responses/Erro" },
          "429": { "$ref": "#/components/responses/Limite" },
          "503": { "$ref": "#/components/responses/Erro" }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "chaveParceiro": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "Opcional. Chave de parceiro, concedida sob solicitação em https://www.asaptelecom.com.br/contato. Sobe o limite para 600 consultas por minuto. Nunca envie a chave na URL: a consulta é recusada."
      }
    },
    "parameters": {
      "cep": {
        "name": "cep",
        "in": "query",
        "required": false,
        "description": "CEP com 8 dígitos, com ou sem hífen.",
        "schema": { "type": "string", "pattern": "^[0-9]{5}-?[0-9]{3}$" },
        "example": "04578-000"
      },
      "numero": {
        "name": "numero",
        "in": "query",
        "required": false,
        "description": "Número do imóvel. Opcional, mas melhora a precisão.",
        "schema": { "type": "string", "maxLength": 12 },
        "example": "1500"
      },
      "endereco": {
        "name": "endereco",
        "in": "query",
        "required": false,
        "description": "Endereço completo (rua, número e cidade), quando não houver CEP.",
        "schema": { "type": "string", "minLength": 5, "maxLength": 200 },
        "example": "Avenida Paulista, 1000, São Paulo"
      },
      "origem": {
        "name": "x-asap-origem",
        "in": "header",
        "required": false,
        "description": "Opcional. Agentes de IA podem enviar `ia` para a consulta ser contada como vinda de IA.",
        "schema": { "type": "string", "enum": ["ia", "api"] }
      }
    },
    "schemas": {
      "Consulta": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "cep": { "type": "string", "pattern": "^[0-9]{5}-?[0-9]{3}$", "description": "CEP com 8 dígitos." },
          "numero": { "type": "string", "maxLength": 12, "description": "Número do imóvel (opcional)." },
          "endereco": { "type": "string", "minLength": 5, "maxLength": 200, "description": "Endereço completo, quando não houver CEP." }
        },
        "anyOf": [{ "required": ["cep"] }, { "required": ["endereco"] }]
      },
      "Resultado": {
        "type": "object",
        "required": ["servico", "versao", "consulta", "resultado", "atende", "meio", "mensagem", "endereco_localizado", "pop_referencia", "regra_de_cobertura", "publico_atendido", "proximo_passo", "documentacao", "consultado_em"],
        "properties": {
          "servico": { "type": "string", "const": "viabilidade" },
          "versao": { "type": "string", "const": "1" },
          "consulta": {
            "type": "object",
            "description": "O que foi consultado, como recebido (já validado).",
            "properties": {
              "cep": { "type": ["string", "null"] },
              "numero": { "type": ["string", "null"] },
              "endereco": { "type": ["string", "null"] }
            }
          },
          "resultado": {
            "type": "string",
            "enum": ["fibra_propria", "radio_sob_analise", "sob_projeto", "endereco_nao_localizado"],
            "description": "fibra_propria: a ASAP atende com fibra óptica própria. radio_sob_analise: a fibra própria fica a mais de 2,5 km; o atendimento pode sair por rádio, depois de análise técnica. sob_projeto: fora da área de fibra própria; a equipe comercial avalia sob projeto. endereco_nao_localizado: o endereço não foi encontrado."
          },
          "atende": {
            "type": "string",
            "enum": ["sim", "sob_analise", "indeterminado"],
            "description": "Resumo para quem só precisa de uma palavra: sim (fibra própria), sob_analise (rádio ou projeto) ou indeterminado (endereço não localizado)."
          },
          "meio": {
            "type": ["string", "null"],
            "enum": ["fibra", "radio", "projeto", null]
          },
          "mensagem": { "type": "string", "description": "Frase pronta, em português, para repassar ao usuário." },
          "endereco_localizado": {
            "type": ["object", "null"],
            "description": "Endereço que a consulta encontrou, para conferir se bate com o pedido.",
            "properties": {
              "logradouro": { "type": ["string", "null"] },
              "numero": { "type": ["string", "null"] },
              "bairro": { "type": ["string", "null"] },
              "cidade": { "type": ["string", "null"] },
              "uf": { "type": ["string", "null"] },
              "cep": { "type": ["string", "null"] }
            }
          },
          "pop_referencia": {
            "type": ["object", "null"],
            "description": "Ponto de presença da ASAP mais próximo, com nome e zona públicos (os mesmos da página Rede ASAP). Nulo quando o resultado é sob projeto ou o endereço não foi localizado.",
            "properties": {
              "nome": { "type": "string" },
              "zona": { "type": ["string", "null"] },
              "cidade": { "type": ["string", "null"] },
              "uf": { "type": ["string", "null"] }
            }
          },
          "regra_de_cobertura": { "type": "string" },
          "publico_atendido": { "type": "string" },
          "proximo_passo": {
            "type": "object",
            "properties": {
              "mensagem": { "type": "string" },
              "pagina": { "type": "string", "format": "uri" },
              "whatsapp": { "type": "string" },
              "consulta_no_site": { "type": "string", "format": "uri" }
            }
          },
          "documentacao": { "type": "string", "format": "uri" },
          "consultado_em": { "type": "string", "format": "date-time" }
        }
      },
      "Erro": {
        "type": "object",
        "required": ["erro", "documentacao"],
        "properties": {
          "erro": {
            "type": "object",
            "required": ["codigo", "mensagem"],
            "properties": {
              "codigo": {
                "type": "string",
                "enum": ["entrada_invalida", "json_invalido", "entrada_grande", "chave_invalida", "chave_na_url", "metodo", "limite", "indisponivel"]
              },
              "mensagem": { "type": "string" }
            }
          },
          "documentacao": { "type": "string", "format": "uri" }
        }
      }
    },
    "responses": {
      "Resultado": {
        "description": "Consulta feita. Veja o campo `resultado`.",
        "headers": {
          "X-RateLimit-Limit": { "schema": { "type": "integer" }, "description": "Consultas permitidas por minuto." },
          "X-RateLimit-Remaining": { "schema": { "type": "integer" }, "description": "Consultas restantes no minuto." }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Resultado" },
            "examples": {
              "fibra": {
                "summary": "Atende com fibra própria",
                "value": {
                  "servico": "viabilidade",
                  "versao": "1",
                  "consulta": { "cep": "04578-000", "numero": "1500", "endereco": null },
                  "resultado": "fibra_propria",
                  "atende": "sim",
                  "meio": "fibra",
                  "mensagem": "A ASAP Telecom atende este endereço com fibra óptica própria.",
                  "endereco_localizado": { "logradouro": "Avenida Exemplo", "numero": "1500", "bairro": "Bairro Exemplo", "cidade": "São Paulo", "uf": "SP", "cep": "04578-000" },
                  "pop_referencia": { "nome": "Berrini 550", "zona": "Zona Sul", "cidade": "São Paulo", "uf": "SP" },
                  "regra_de_cobertura": "Fibra óptica própria até 2,5 km da rede da ASAP na Grande São Paulo. Acima disso, o atendimento pode sair por rádio ou sob projeto, depois de análise técnica.",
                  "publico_atendido": "A ASAP Telecom atende somente empresas, com internet dedicada (Link Dedicado), e provedores de internet, com conectividade de atacado. Não vende internet residencial nem banda larga.",
                  "proximo_passo": {
                    "mensagem": "Para contratar ou pedir proposta, fale com a ASAP Telecom.",
                    "pagina": "https://www.asaptelecom.com.br/contato",
                    "whatsapp": "+55 11 97680-0303",
                    "consulta_no_site": "https://www.asaptelecom.com.br/rede-asap"
                  },
                  "documentacao": "https://www.asaptelecom.com.br/desenvolvedores",
                  "consultado_em": "2026-11-06T15:00:00.000Z"
                }
              },
              "nao_localizado": {
                "summary": "Endereço não localizado",
                "value": {
                  "servico": "viabilidade",
                  "versao": "1",
                  "consulta": { "cep": null, "numero": null, "endereco": "Rua que não existe, 1, Cidade" },
                  "resultado": "endereco_nao_localizado",
                  "atende": "indeterminado",
                  "meio": null,
                  "mensagem": "Não foi possível localizar este endereço. Informe CEP e número, ou rua, número e cidade.",
                  "endereco_localizado": null,
                  "pop_referencia": null,
                  "regra_de_cobertura": "Fibra óptica própria até 2,5 km da rede da ASAP na Grande São Paulo. Acima disso, o atendimento pode sair por rádio ou sob projeto, depois de análise técnica.",
                  "publico_atendido": "A ASAP Telecom atende somente empresas, com internet dedicada (Link Dedicado), e provedores de internet, com conectividade de atacado. Não vende internet residencial nem banda larga.",
                  "proximo_passo": {
                    "mensagem": "Para contratar ou pedir proposta, fale com a ASAP Telecom.",
                    "pagina": "https://www.asaptelecom.com.br/contato",
                    "whatsapp": "+55 11 97680-0303",
                    "consulta_no_site": "https://www.asaptelecom.com.br/rede-asap"
                  },
                  "documentacao": "https://www.asaptelecom.com.br/desenvolvedores",
                  "consultado_em": "2026-11-06T15:00:00.000Z"
                }
              }
            }
          }
        }
      },
      "Erro": {
        "description": "Pedido recusado ou consulta indisponível.",
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Erro" },
            "example": {
              "erro": { "codigo": "entrada_invalida", "mensagem": "CEP inválido. Informe os 8 dígitos (ex.: 04578-000)." },
              "documentacao": "https://www.asaptelecom.com.br/desenvolvedores"
            }
          }
        }
      },
      "Limite": {
        "description": "Limite de consultas por minuto atingido. Aguarde o tempo de `Retry-After`.",
        "headers": {
          "Retry-After": { "schema": { "type": "integer" }, "description": "Segundos até poder consultar de novo." }
        },
        "content": {
          "application/json": {
            "schema": { "$ref": "#/components/schemas/Erro" },
            "example": {
              "erro": { "codigo": "limite", "mensagem": "Limite de 60 consultas por minuto atingido. Tente de novo em 1 minuto." },
              "documentacao": "https://www.asaptelecom.com.br/desenvolvedores"
            }
          }
        }
      }
    }
  }
}
