{
    "openapi": "3.1.0",
    "info": {
        "title": "Viniun — API do site da imobiliária",
        "version": "1.0.0",
        "description": "API para montar o site de uma imobiliária em QUALQUER plataforma (Lovable, v0, Next.js, Astro,\nWordPress, app próprio): estoque de imóveis com os filtros do site da plataforma, dados da\nimobiliária, catálogo (bairros, edifícios, construtoras) e envio de contatos para o funil.\n\n## Chave\nCrie em **Painel › Integrações › API & Webhooks › Chaves de API**. A conta vem da chave.\nEnvie como `Authorization: Bearer vk_…`, `X-Api-Key: vk_…` ou `?chave=vk_…`.\n\n- `site:publico` — Site no navegador (chave pública: só o que o site já mostra + formulários)\n- `site:ler` — Ler dados do site (imobiliária, bairros, edifícios, construtoras)\n- `imoveis:ler` — Ler imóveis\n- `leads:escrever` — Criar leads\n\nA **chave pública** (`site:publico`) foi feita para ficar no código do navegador: lê só o que\no site já mostra e envia os mesmos formulários que o site aceita. Restrinja os sites que podem\nusá-la (domínios permitidos, com curinga: `*.lovable.app`). Chave **secreta** nunca vai para o\nnavegador — chamada com cabeçalho `Origin` de um domínio não cadastrado é recusada (403).\n\n## Limites\nPor chave, por minuto: pública 1.200; só leitura 600; com escrita 120. Contatos: 5 por minuto\npor telefone. Responda ao 429 esperando o `Retry-After`. Guarde em cache (ISR/SSG): o estoque\nmuda poucas vezes por hora — ou use os webhooks `imovel.publicado`/`imovel.despublicado`.\n\n## Privacidade\nNunca sai proprietário, telefone de corretor, complemento/unidade. Rua, número, CEP e coordenada\nexata só quando o dono autorizou (\"mostrar endereço completo\"); senão `coordenadas.aproximado`\n= true e o mapa deve mostrar um círculo da região."
    },
    "servers": [
        {
            "url": "https://novo.viniun.com.br/api/v1/site-api"
        }
    ],
    "tags": [
        {
            "name": "Imobiliária"
        },
        {
            "name": "Imóveis"
        },
        {
            "name": "Catálogo"
        },
        {
            "name": "Contatos"
        },
        {
            "name": "Trabalhe conosco"
        },
        {
            "name": "Documentação"
        }
    ],
    "paths": {
        "/": {
            "get": {
                "operationId": "inicio",
                "summary": "Testar a chave",
                "description": "Diz de qual imobiliária é a chave, o que ela pode fazer e onde está a documentação.\n\n**Permissão da chave:** qualquer chave ativa.",
                "tags": [
                    "Imobiliária"
                ],
                "x-escopos": [],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Chave válida.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imobiliaria": {
            "get": {
                "operationId": "imobiliaria",
                "summary": "Dados da imobiliária",
                "description": "Nome, logo, cores, contatos, redes sociais, CRECI, textos do site, SEO, parâmetros do simulador de financiamento e o script de rastreio de visitas.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Imobiliária"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Dados da imobiliária.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Imobiliaria"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imoveis": {
            "get": {
                "operationId": "listarImoveis",
                "summary": "Buscar imóveis",
                "description": "Imóveis com anúncio publicado (disponíveis ou reservados), com os MESMOS filtros do site da plataforma e paginação.\n\n**Permissão da chave:** `imoveis:ler` ou `site:publico`.",
                "tags": [
                    "Imóveis"
                ],
                "x-escopos": [
                    "imoveis:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "finalidade",
                        "in": "query",
                        "required": false,
                        "description": "Slug da finalidade (`venda`, `locacao`…) ou `lancamento`. Opções em /imoveis/filtros.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tipo",
                        "in": "query",
                        "required": false,
                        "description": "Slug do tipo (`apartamento`, `casa`…).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "tipos",
                        "in": "query",
                        "required": false,
                        "description": "Vários tipos separados por vírgula: `apartamento,casa`.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Nome da cidade, como em /imoveis/filtros.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "bairro",
                        "in": "query",
                        "required": false,
                        "description": "Nome do bairro (todas as grafias do mesmo bairro casam).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "description": "Texto livre: título, código de referência ou bairro.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "codigo",
                        "in": "query",
                        "required": false,
                        "description": "Código de referência exato (ex.: `AP2978`).",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "preco_min",
                        "in": "query",
                        "required": false,
                        "description": "Valor mínimo (venda ou aluguel). Sinônimo: `valor_min`.",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "preco_max",
                        "in": "query",
                        "required": false,
                        "description": "Valor máximo (venda ou aluguel). Sinônimo: `valor_max`.",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "dormitorios_min",
                        "in": "query",
                        "required": false,
                        "description": "Mínimo de quartos. Sinônimo: `quartos_min`.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "suites_min",
                        "in": "query",
                        "required": false,
                        "description": "Mínimo de suítes.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "banheiros_min",
                        "in": "query",
                        "required": false,
                        "description": "Mínimo de banheiros.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "vagas_min",
                        "in": "query",
                        "required": false,
                        "description": "Mínimo de vagas de garagem.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "area_min",
                        "in": "query",
                        "required": false,
                        "description": "Área mínima em m² (útil; sem útil, a total).",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "area_max",
                        "in": "query",
                        "required": false,
                        "description": "Área máxima em m².",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "condominio_max",
                        "in": "query",
                        "required": false,
                        "description": "Condomínio máximo (quem não informou condomínio entra).",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "entrada_max",
                        "in": "query",
                        "required": false,
                        "description": "\"Quanto cabe no bolso\": entrada disponível. A API calcula o valor máximo de imóvel com as taxas da imobiliária; cada card traz `parcela_estimada`.",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "parcela_max",
                        "in": "query",
                        "required": false,
                        "description": "\"Quanto cabe no bolso\": parcela máxima por mês.",
                        "schema": {
                            "type": "number"
                        }
                    },
                    {
                        "name": "mcmv",
                        "in": "query",
                        "required": false,
                        "description": "Só imóveis que se encaixam no Minha Casa Minha Vida.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "direto_construtora",
                        "in": "query",
                        "required": false,
                        "description": "Só imóveis com parcelamento direto com a construtora.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "financiamento",
                        "in": "query",
                        "required": false,
                        "description": "Só imóveis que aceitam financiamento.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "destaque",
                        "in": "query",
                        "required": false,
                        "description": "Só os destaques da imobiliária.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "lancamento",
                        "in": "query",
                        "required": false,
                        "description": "Só lançamentos / na planta.",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "airbnb",
                        "in": "query",
                        "required": false,
                        "description": "Só imóveis que permitem aluguel por temporada (Airbnb).",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "name": "edificio",
                        "in": "query",
                        "required": false,
                        "description": "Slug do edifício/condomínio.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "construtora",
                        "in": "query",
                        "required": false,
                        "description": "Slug da construtora.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "ordem",
                        "in": "query",
                        "required": false,
                        "description": "Ordenação. Padrão: destaques primeiro, depois os mais novos.",
                        "schema": {
                            "type": "string",
                            "enum": [
                                "recentes",
                                "menor-valor",
                                "maior-valor",
                                "maior-area"
                            ]
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Página (começa em 1). Sinônimo: `pagina`.",
                        "schema": {
                            "type": "integer",
                            "minimum": 1
                        }
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "required": false,
                        "description": "Itens por página (padrão 12, máximo 50).",
                        "schema": {
                            "type": "integer",
                            "minimum": 1,
                            "maximum": 50
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Página de imóveis.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/PaginaImoveis"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imoveis/filtros": {
            "get": {
                "operationId": "filtrosImoveis",
                "summary": "Opções dos filtros",
                "description": "Tipos, finalidades, cidades e bairros que existem no estoque — use para montar os seletores da busca. Com `cidade`, os bairros são só dela.\n\n**Permissão da chave:** `imoveis:ler` ou `site:publico`.",
                "tags": [
                    "Imóveis"
                ],
                "x-escopos": [
                    "imoveis:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Limita os bairros a esta cidade.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Opções.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Filtros"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imoveis/slugs": {
            "get": {
                "operationId": "slugsImoveis",
                "summary": "Todos os endereços (sitemap)",
                "description": "Lista leve (slug, código, data de atualização) de todos os imóveis publicados, até 5.000 por página — para gerar o sitemap.xml e as páginas estáticas.\n\n**Permissão da chave:** `imoveis:ler` ou `site:publico`.",
                "tags": [
                    "Imóveis"
                ],
                "x-escopos": [
                    "imoveis:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Página (5.000 por página).",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Slugs.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imoveis/codigo/{codigo}": {
            "get": {
                "operationId": "imovelPorCodigo",
                "summary": "Imóvel pelo código",
                "description": "Ficha completa pelo código de referência (o \"Cód.\" das placas e anúncios).\n\n**Permissão da chave:** `imoveis:ler` ou `site:publico`.",
                "tags": [
                    "Imóveis"
                ],
                "x-escopos": [
                    "imoveis:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "codigo",
                        "in": "path",
                        "required": true,
                        "description": "Código de referência, ex.: AP2978.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Ficha do imóvel.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Imovel"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Não existe ou saiu do ar.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/imoveis/{slug}": {
            "get": {
                "operationId": "imovelPorSlug",
                "summary": "Imóvel pelo slug",
                "description": "Ficha completa: fotos em 3 tamanhos, características, valores, condições de financiamento, mapa (aproximado quando o dono não autorizou o endereço) e `seo.json_ld` pronto (schema.org RealEstateListing).\n\n**Permissão da chave:** `imoveis:ler` ou `site:publico`.",
                "tags": [
                    "Imóveis"
                ],
                "x-escopos": [
                    "imoveis:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug do anúncio (campo `slug` da lista).",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Ficha do imóvel.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Imovel"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Não existe ou saiu do ar.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/bairros": {
            "get": {
                "operationId": "listarBairros",
                "summary": "Bairros",
                "description": "Bairros com imóvel publicado, uma grafia por bairro, com a contagem.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Só os bairros desta cidade.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Bairros.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "properties": {
                                        "data": {
                                            "type": "array",
                                            "items": {
                                                "$ref": "#/components/schemas/Bairro"
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/bairros/{slug}": {
            "get": {
                "operationId": "bairro",
                "summary": "Um bairro",
                "description": "Total publicado e o texto que a imobiliária escreveu sobre o bairro (guia do bairro).\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug do bairro (campo `slug` de /bairros).",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Bairro.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Bairro sem imóvel publicado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/edificios": {
            "get": {
                "operationId": "listarEdificios",
                "summary": "Edifícios e condomínios",
                "description": "Edifícios com imóvel publicado da imobiliária.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "bairro",
                        "in": "query",
                        "required": false,
                        "description": "Filtra pelo bairro.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "cidade",
                        "in": "query",
                        "required": false,
                        "description": "Filtra pela cidade.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "description": "Parte do nome.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "page",
                        "in": "query",
                        "required": false,
                        "description": "Página.",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "name": "por_pagina",
                        "in": "query",
                        "required": false,
                        "description": "Itens por página (máx. 50).",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Edifícios.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/edificios/{slug}": {
            "get": {
                "operationId": "edificio",
                "summary": "Um edifício",
                "description": "Dados do edifício e os imóveis publicados nele.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug do edifício.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Edifício.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Não encontrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/construtoras": {
            "get": {
                "operationId": "listarConstrutoras",
                "summary": "Construtoras",
                "description": "Construtoras com imóvel publicado da imobiliária.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Construtoras.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/construtoras/{slug}": {
            "get": {
                "operationId": "construtora",
                "summary": "Uma construtora",
                "description": "Dados da construtora e os imóveis publicados dela.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Catálogo"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da construtora.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Construtora.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Não encontrada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/leads": {
            "post": {
                "operationId": "enviarLead",
                "summary": "Enviar contato (lead)",
                "description": "Todo formulário do site vira lead no funil da imobiliária: corretor do rodízio, aviso no WhatsApp, lead único por telefone (o mesmo telefone vira atividade no lead aberto). Mande UTM e a página para a origem aparecer nos relatórios, e `cookie_id` (window.viniunRastreio.id) para ligar a navegação ao lead. Limite: 5 envios por minuto por telefone.\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Contatos"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/LeadEntrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Lead registrado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/LeadResposta"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Campo faltando ou inválido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/buscas-salvas": {
            "post": {
                "operationId": "salvarBusca",
                "summary": "Avise-me (busca salva)",
                "description": "A pessoa recebe no WhatsApp os imóveis novos que combinarem com a busca.\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Contatos"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/BuscaSalvaEntrada"
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Busca salva.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Campo faltando ou inválido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas": {
            "get": {
                "operationId": "listarVagas",
                "summary": "Vagas abertas (trabalhe conosco)",
                "description": "Vagas publicadas pela imobiliária no RH: título, vínculo, cidade, faixa salarial (se ela quiser mostrar) e o que a candidatura pede — `curriculo` e `video` valem `nao`, `opcional` ou `obrigatorio`.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "q",
                        "in": "query",
                        "required": false,
                        "description": "Parte do título.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Vagas.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas/{slug}": {
            "get": {
                "operationId": "vaga",
                "summary": "Uma vaga, com o questionário",
                "description": "Descrição, requisitos, benefícios e `perguntas`: o questionário que a imobiliária montou no construtor de formulários (mesmo formato do formulário público — nome, label, tipo, obrigatorio, opcoes, condicao). Monte o formulário a partir daqui; ele muda quando a imobiliária edita as perguntas.\n\n**Permissão da chave:** `site:ler` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "site:ler",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da vaga (campo `slug` de /vagas).",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Vaga.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Vaga encerrada ou inexistente.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas/{slug}/candidaturas": {
            "post": {
                "operationId": "candidatarVaga",
                "summary": "Enviar candidatura",
                "description": "multipart/form-data: nome, telefone, email, cidade, uf, creci (se `pede_creci`), portfolio (se `pede_portfolio`), `curriculo` (arquivo PDF/Word/foto até 10 MB), `respostas` (JSON `{nome_da_pergunta: valor}`) e `video_token` (do envio do vídeo). Vira candidato no RH da imobiliária, nunca lead. Erros das perguntas voltam como `respostas.{nome}`. Limite: 6 por minuto.\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da vaga.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "nome",
                                    "telefone"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Candidatura registrada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Campo faltando ou inválido.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas/{slug}/video": {
            "post": {
                "operationId": "iniciarVideoVaga",
                "summary": "Vídeo de apresentação: iniciar",
                "description": "O vídeo sobe EM PARTES (uma requisição passa de 100 MB fácil com 1 minuto gravado no celular). Mande {tamanho (bytes), tipo (MIME), segundos (duração lida no navegador)} → {upload_id, parte_bytes, partes}. Depois: POST /vagas/{slug}/video/{upload_id}/parte (multipart: indice 0..partes-1 + parte = file.slice(i*parte_bytes, (i+1)*parte_bytes)) e POST /vagas/{slug}/video/{upload_id}/concluir → {video_token}. Parte que falhar pode ser reenviada. MP4, MOV (iPhone), 3GP ou WEBM, até 400 MB.\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da vaga.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "tamanho"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "201": {
                        "description": "Envio iniciado.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "A vaga não pede vídeo.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Vídeo grande ou longo demais.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas/{slug}/video/{upload}/parte": {
            "post": {
                "operationId": "parteVideoVaga",
                "summary": "Vídeo de apresentação: enviar uma parte",
                "description": "multipart/form-data com `indice` e `parte` (no máximo `parte_bytes` do iniciar — até 8 MB, conforme o servidor).\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da vaga.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "upload",
                        "in": "path",
                        "required": true,
                        "description": "upload_id do iniciar.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "multipart/form-data": {
                            "schema": {
                                "type": "object",
                                "required": [
                                    "indice",
                                    "parte"
                                ]
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Parte recebida.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/vagas/{slug}/video/{upload}/concluir": {
            "post": {
                "operationId": "concluirVideoVaga",
                "summary": "Vídeo de apresentação: concluir",
                "description": "Junta as partes e confere o formato. Devolve `video_token` (vale 24 h) para mandar na candidatura.\n\n**Permissão da chave:** `leads:escrever` ou `site:publico`.",
                "tags": [
                    "Trabalhe conosco"
                ],
                "x-escopos": [
                    "leads:escrever",
                    "site:publico"
                ],
                "security": [
                    {
                        "bearer": []
                    },
                    {
                        "cabecalho": []
                    },
                    {
                        "url": []
                    }
                ],
                "parameters": [
                    {
                        "name": "slug",
                        "in": "path",
                        "required": true,
                        "description": "Slug da vaga.",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "name": "upload",
                        "in": "path",
                        "required": true,
                        "description": "upload_id do iniciar.",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Vídeo pronto.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Faltou parte ou o arquivo não é vídeo.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Chave ausente, inválida ou revogada.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "A chave não tem a permissão desta rota, ou o site (Origin) não está entre os domínios permitidos.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Muitas chamadas com esta chave. Respeite o cabeçalho Retry-After.",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/Erro"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/openapi.json": {
            "get": {
                "operationId": "openapi",
                "summary": "Este documento",
                "tags": [
                    "Documentação"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "OpenAPI 3.1."
                    }
                }
            }
        },
        "/llms.txt": {
            "get": {
                "operationId": "llmsTxt",
                "summary": "Resumo para IA (llms.txt)",
                "tags": [
                    "Documentação"
                ],
                "security": [],
                "responses": {
                    "200": {
                        "description": "Texto simples.",
                        "content": {
                            "text/plain": {
                                "schema": {
                                    "type": "string"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "webhooks": {
        "lead.criado": {
            "post": {
                "summary": "Um lead novo entrou",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: lead.criado` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "lead.convertido": {
            "post": {
                "summary": "O lead virou cliente",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: lead.convertido` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "lead.etapa": {
            "post": {
                "summary": "O lead mudou de etapa no funil",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: lead.etapa` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "imovel.publicado": {
            "post": {
                "summary": "Um imóvel foi publicado",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: imovel.publicado` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "imovel.despublicado": {
            "post": {
                "summary": "Um imóvel saiu do ar",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: imovel.despublicado` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "proposta.enviada": {
            "post": {
                "summary": "Uma proposta foi enviada",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: proposta.enviada` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "proposta.aceita": {
            "post": {
                "summary": "Uma proposta foi aceita",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: proposta.aceita` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "contrato.assinado": {
            "post": {
                "summary": "O contrato foi assinado por todos",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: contrato.assinado` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "transacao.etapa": {
            "post": {
                "summary": "A transação mudou de etapa",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: transacao.etapa` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "transacao.concluida": {
            "post": {
                "summary": "O negócio foi concluído",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: transacao.concluida` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "visita.agendada": {
            "post": {
                "summary": "Uma visita foi agendada",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: visita.agendada` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        },
        "automacao.disparada": {
            "post": {
                "summary": "Uma automação disparou a ação \"webhook\"",
                "description": "POST JSON no endereço cadastrado, com o cabeçalho `X-Viniun-Evento: automacao.disparada` e `X-Viniun-Assinatura` = HMAC-SHA256 do corpo com o segredo do webhook.",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/EventoWebhook"
                            }
                        }
                    }
                },
                "responses": {
                    "200": {
                        "description": "Recebido. Qualquer 2xx confirma; outro status faz a plataforma tentar de novo (1, 5, 30, 120 e 720 min)."
                    }
                }
            }
        }
    },
    "components": {
        "securitySchemes": {
            "bearer": {
                "type": "http",
                "scheme": "bearer",
                "description": "`Authorization: Bearer vk_…`"
            },
            "cabecalho": {
                "type": "apiKey",
                "in": "header",
                "name": "X-Api-Key"
            },
            "url": {
                "type": "apiKey",
                "in": "query",
                "name": "chave",
                "description": "Para ferramentas que só aceitam URL. Evita o preflight do CORS no navegador."
            }
        },
        "schemas": {
            "Erro": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "erro": {
                        "type": "string",
                        "description": "Mensagem em português."
                    },
                    "message": {
                        "type": "string"
                    },
                    "errors": {
                        "type": "object",
                        "description": "Erros por campo (422)."
                    }
                }
            },
            "Imobiliaria": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "creci": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "logo_url": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cores": {
                        "type": "object",
                        "properties": {
                            "primaria": {
                                "type": "string"
                            },
                            "secundaria": {
                                "type": "string"
                            },
                            "destaque": {
                                "type": "string"
                            },
                            "raio": {
                                "type": "string"
                            }
                        }
                    },
                    "contato": {
                        "type": "object",
                        "properties": {
                            "telefone": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "whatsapp": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "email": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "endereco": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "horario": {
                                "description": "Texto ou objeto livre."
                            }
                        }
                    },
                    "redes": {
                        "type": "object",
                        "description": "instagram, facebook, youtube, linkedin, tiktok… (URLs)."
                    },
                    "textos": {
                        "type": "object",
                        "description": "hero_titulo, hero_subtitulo, hero_imagem, sobre_titulo, sobre_texto, rodape."
                    },
                    "seo": {
                        "type": "object",
                        "description": "titulo, descricao, palavras_chave, og_image."
                    },
                    "site_oficial": {
                        "type": "string",
                        "description": "Site oficial da imobiliária na plataforma."
                    },
                    "financiamento": {
                        "type": "object",
                        "description": "Parâmetros do simulador (taxa_aa, entrada_minima_pct, comprometimento_renda_pct, custos_pct)."
                    },
                    "rastreio": {
                        "type": "object",
                        "description": "`script`: a tag pronta para colar; `tenant`: identificador da conta no rastreio."
                    }
                }
            },
            "ImovelCard": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "slug": {
                        "type": "string",
                        "description": "Use na URL da página do imóvel e em GET /imoveis/{slug}."
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "tipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo_slug": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "finalidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "finalidade_slug": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "cidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "uf": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "bairro": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "dormitorios": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "suites": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "banheiros": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "vagas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "area": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "m² (útil; sem útil, a total)."
                    },
                    "valor": {
                        "type": [
                            "number",
                            "null"
                        ],
                        "description": "Venda, ou aluguel quando a finalidade é locação."
                    },
                    "valor_label": {
                        "type": "string",
                        "description": "\"R$ 450.000\" ou \"Consulte\"."
                    },
                    "preco_promocao": {
                        "type": [
                            "number",
                            "null"
                        ]
                    },
                    "foto": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Capa, tamanho grande."
                    },
                    "foto_tamanhos": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "thumb": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Miniatura (~300 px)."
                            },
                            "media": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Média (~800 px) — cards."
                            },
                            "grande": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Grande (~1600 px) — galeria."
                            }
                        }
                    },
                    "destaque": {
                        "type": "boolean"
                    },
                    "lancamento": {
                        "type": "boolean"
                    },
                    "reservado": {
                        "type": "boolean"
                    },
                    "financiado_caixa": {
                        "type": "boolean"
                    },
                    "direto_construtora": {
                        "type": "boolean"
                    },
                    "permite_airbnb": {
                        "type": "boolean"
                    },
                    "distancia_praia": {
                        "description": "Metros ou texto, quando informado."
                    },
                    "parcela_estimada": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Só com entrada_max/parcela_max: price, sac, entrada, taxa_aa, prazo_meses, aviso."
                    }
                }
            },
            "PaginaImoveis": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ImovelCard"
                        }
                    },
                    "meta": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": "integer"
                            },
                            "pagina": {
                                "type": "integer"
                            },
                            "por_pagina": {
                                "type": "integer"
                            },
                            "ultima_pagina": {
                                "type": "integer"
                            }
                        }
                    },
                    "links": {
                        "type": "object",
                        "properties": {
                            "proxima": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "anterior": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "bolso": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "Resultado do \"quanto cabe no bolso\" quando pedido."
                    }
                }
            },
            "Filtros": {
                "type": "object",
                "properties": {
                    "tipos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "slug": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "finalidades": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "slug": {
                                    "type": "string"
                                },
                                "nome": {
                                    "type": "string"
                                }
                            }
                        }
                    },
                    "cidades": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "bairros": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "bairros_populares": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "praca": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Cidade onde a imobiliária mais atua."
                    },
                    "centro": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "{lat, lng} para centralizar o mapa."
                    }
                }
            },
            "Imovel": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "integer"
                    },
                    "codigo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "slug": {
                        "type": "string"
                    },
                    "titulo": {
                        "type": "string"
                    },
                    "descricao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "tipo": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "slug": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "subtipo": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "finalidade": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "slug": {
                                "type": "string"
                            },
                            "nome": {
                                "type": "string"
                            }
                        }
                    },
                    "situacao": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "status": {
                        "type": "string",
                        "description": "disponivel | reservado | vendido | alugado…"
                    },
                    "reservado": {
                        "type": "boolean"
                    },
                    "destaque": {
                        "type": "boolean"
                    },
                    "lancamento": {
                        "type": "boolean"
                    },
                    "data_entrega": {
                        "type": [
                            "string",
                            "null"
                        ],
                        "description": "Previsão de entrega do imóvel na planta, AAAA-MM-DD (dia 1º do mês)."
                    },
                    "localizacao": {
                        "type": "object",
                        "properties": {
                            "cidade": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "uf": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "bairro": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "logradouro": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Só com endereço completo autorizado."
                            },
                            "numero": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "cep": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "endereco_completo": {
                                "type": "boolean",
                                "description": "false = mostre só bairro e cidade."
                            },
                            "ponto_referencia": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "distancia_praia": {
                                "description": "Quando informado."
                            },
                            "coordenadas": {
                                "type": [
                                    "object",
                                    "null"
                                ],
                                "properties": {
                                    "lat": {
                                        "type": "number"
                                    },
                                    "lng": {
                                        "type": "number"
                                    },
                                    "aproximado": {
                                        "type": "boolean",
                                        "description": "true = ponto da REGIÃO (desenhe um círculo de raio_metros, nunca um alfinete)."
                                    },
                                    "raio_metros": {
                                        "type": [
                                            "integer",
                                            "null"
                                        ]
                                    }
                                }
                            }
                        }
                    },
                    "dormitorios": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "suites": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "banheiros": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "vagas": {
                        "type": [
                            "integer",
                            "null"
                        ]
                    },
                    "areas": {
                        "type": "object",
                        "properties": {
                            "total": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "privativa": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "util": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            }
                        }
                    },
                    "valores": {
                        "type": "object",
                        "properties": {
                            "venda": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "locacao": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "condominio": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "iptu": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            },
                            "promocao": {
                                "type": [
                                    "number",
                                    "null"
                                ]
                            }
                        }
                    },
                    "financiamento": {
                        "type": "object",
                        "description": "aceita_financiamento, financiamento_caixa, direto_construtora, direto_proprietario, repasse, condicoes[]: tipo (caixa|construtora|proprietario|repasse), titulo, resumo, valor_entrada, valor_parcela, qtd_parcelas, inicio_parcelas, valor_intermediarias, qtd_intermediarias, tipo_intermediarias, inicio_intermediarias, valor_chaves, data_chaves, valor_financiado (no plano da construtora = saldo bancário), valor_subsidio, renda_necessaria, total, saldo_devedor, banco, correcao, observacoes. Datas em AAAA-MM-DD (dia 1º do mês)."
                    },
                    "permite_airbnb": {
                        "type": "boolean"
                    },
                    "caracteristicas": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "proximidades": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "fotos": {
                        "type": "array",
                        "items": {
                            "type": "object",
                            "properties": {
                                "thumb": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Miniatura (~300 px)."
                                },
                                "media": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Média (~800 px) — cards."
                                },
                                "grande": {
                                    "type": [
                                        "string",
                                        "null"
                                    ],
                                    "description": "Grande (~1600 px) — galeria."
                                },
                                "original": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "largura": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "altura": {
                                    "type": [
                                        "integer",
                                        "null"
                                    ]
                                },
                                "tipo": {
                                    "type": "string",
                                    "description": "foto | planta | fachada"
                                },
                                "legenda": {
                                    "type": [
                                        "string",
                                        "null"
                                    ]
                                },
                                "capa": {
                                    "type": "boolean"
                                }
                            }
                        }
                    },
                    "midia": {
                        "type": "object",
                        "properties": {
                            "video_url": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "youtube": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "tour_url": {
                                "type": [
                                    "string",
                                    "null"
                                ],
                                "description": "Tour 360º (Matterport, Kuula…) para iframe."
                            }
                        }
                    },
                    "edificio": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "slug": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "construtora": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "properties": {
                            "nome": {
                                "type": "string"
                            },
                            "slug": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            }
                        }
                    },
                    "corretor": {
                        "type": [
                            "object",
                            "null"
                        ],
                        "description": "nome, foto, creci — nunca telefone pessoal (o contato é o da imobiliária)."
                    },
                    "publicado_em": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "atualizado_em": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "seo": {
                        "type": "object",
                        "properties": {
                            "titulo": {
                                "type": "string",
                                "description": "Até 65 caracteres."
                            },
                            "descricao": {
                                "type": "string",
                                "description": "Até 158 caracteres."
                            },
                            "imagem": {
                                "type": [
                                    "string",
                                    "null"
                                ]
                            },
                            "json_ld": {
                                "type": "object",
                                "description": "schema.org RealEstateListing pronto. Acrescente \"url\" com o endereço da página no seu site."
                            }
                        }
                    }
                }
            },
            "Bairro": {
                "type": "object",
                "properties": {
                    "nome": {
                        "type": "string"
                    },
                    "slug": {
                        "type": "string"
                    },
                    "cidade": {
                        "type": [
                            "string",
                            "null"
                        ]
                    },
                    "total": {
                        "type": "integer"
                    }
                }
            },
            "LeadEntrada": {
                "type": "object",
                "required": [
                    "nome",
                    "telefone"
                ],
                "properties": {
                    "origem": {
                        "type": "string",
                        "description": "Qual formulário. Padrão `site`. `agendamento` + data_preferida cria a visita na agenda do corretor.",
                        "enum": [
                            "site",
                            "faleconosco",
                            "maisinfo",
                            "ligacoes",
                            "encomenda",
                            "agendamento",
                            "avaliacao",
                            "financiamento",
                            "permuta",
                            "sob_medida",
                            "desbloqueio",
                            "cadastro_imovel",
                            "whatsapp_site",
                            "trabalhe_conosco",
                            "satisfacao",
                            "corretor_parceiro",
                            "placa"
                        ]
                    },
                    "nome": {
                        "type": "string",
                        "description": "Mínimo 3 letras.",
                        "minLength": 3,
                        "maxLength": 120
                    },
                    "telefone": {
                        "type": "string",
                        "description": "Com DDD (10–20 caracteres; máscara aceita).",
                        "minLength": 10,
                        "maxLength": 20
                    },
                    "email": {
                        "type": "string",
                        "format": "email"
                    },
                    "mensagem": {
                        "type": "string",
                        "maxLength": 3000
                    },
                    "imovel_slug": {
                        "type": "string",
                        "description": "Slug do imóvel da página (ou use imovel_codigo)."
                    },
                    "imovel_codigo": {
                        "type": "string",
                        "description": "Código de referência do imóvel."
                    },
                    "cidade": {
                        "type": "string",
                        "description": "Cidade de interesse (rodízio por cidade)."
                    },
                    "data_preferida": {
                        "type": "string",
                        "description": "Agendamento: AAAA-MM-DD.",
                        "format": "date"
                    },
                    "periodo": {
                        "type": "string",
                        "description": "Agendamento.",
                        "enum": [
                            "manha",
                            "tarde",
                            "noite"
                        ]
                    },
                    "cookie_id": {
                        "type": "string",
                        "description": "window.viniunRastreio.id do script de rastreio: liga a navegação ao lead."
                    },
                    "consentimento_whatsapp": {
                        "type": "boolean",
                        "description": "true quando a pessoa marcou \"quero receber imóveis pelo WhatsApp\" (LGPD). Nunca venha marcada por padrão."
                    },
                    "utm": {
                        "type": "object",
                        "description": "utm_source, utm_medium, utm_campaign, utm_term, utm_content, gclid, fbclid (também aceitos soltos no corpo)."
                    },
                    "pagina": {
                        "type": "string",
                        "description": "URL da página onde o formulário foi enviado."
                    },
                    "referrer": {
                        "type": "string",
                        "description": "document.referrer da primeira visita."
                    },
                    "extras": {
                        "type": "object",
                        "description": "Campos livres do formulário (vão para a ficha do lead). `extras.horario` = HH:MM no agendamento."
                    },
                    "website": {
                        "type": "string",
                        "description": "Anti-robô: deixe um campo \"website\" ESCONDIDO e vazio. Preenchido, o envio é descartado."
                    }
                }
            },
            "LeadResposta": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    },
                    "lead_id": {
                        "type": "integer"
                    },
                    "reaproveitado": {
                        "type": "boolean",
                        "description": "O telefone já tinha lead em andamento: o contato virou atividade nele."
                    },
                    "mensagem": {
                        "type": "string",
                        "description": "Texto pronto para mostrar ao visitante."
                    }
                }
            },
            "BuscaSalvaEntrada": {
                "type": "object",
                "required": [
                    "nome",
                    "telefone",
                    "filtros"
                ],
                "properties": {
                    "nome": {
                        "type": "string"
                    },
                    "telefone": {
                        "type": "string"
                    },
                    "filtros": {
                        "type": "object",
                        "properties": {
                            "tipo": {
                                "type": "string"
                            },
                            "bairro": {
                                "type": "string"
                            },
                            "finalidade": {
                                "type": "string"
                            },
                            "dormitorios_min": {
                                "type": "integer"
                            },
                            "preco_max": {
                                "type": "number"
                            }
                        }
                    },
                    "website": {
                        "type": "string",
                        "description": "Anti-robô (deixe vazio)."
                    }
                }
            },
            "EventoWebhook": {
                "type": "object",
                "properties": {
                    "evento": {
                        "type": "string",
                        "enum": [
                            "lead.criado",
                            "lead.convertido",
                            "lead.etapa",
                            "imovel.publicado",
                            "imovel.despublicado",
                            "proposta.enviada",
                            "proposta.aceita",
                            "contrato.assinado",
                            "transacao.etapa",
                            "transacao.concluida",
                            "visita.agendada",
                            "automacao.disparada"
                        ]
                    },
                    "ocorrido_em": {
                        "type": "string",
                        "format": "date-time"
                    },
                    "tenant": {
                        "type": "integer"
                    },
                    "dados": {
                        "type": "object",
                        "description": "imovel.publicado / imovel.despublicado: imovel_id, codigo, slug, titulo, url_api."
                    }
                }
            }
        }
    }
}