{"openapi":"3.1.0","info":{"title":"Chave Direta — API pública","version":"1.0.0","summary":"Superfície pública da plataforma de gestão imobiliária Chave Direta.","description":"Endpoints abertos da Chave Direta, o software de gestão imobiliária que reúne CRM,\ncarteira de imóveis, site público, cobrança de aluguel e repasse ao proprietário.\n\nNenhum endpoint desta especificação exige chave de API. Endpoints de cobrança usam um\ntoken opaco na própria URL, entregue ao pagador. O restante da aplicação (`/api/leads`,\n`/api/properties`, `/api/finance`, ...) usa sessão autenticada por cookie e não faz parte\ndesta especificação.\n\nErros respondem sempre `application/json` no schema `ApiError`, com `code`, `message` e `hint`.\n\n## Versao\n\nA versao vive no caminho: `/api/v1/public`. O prefixo `/api/public` continua\nrespondendo como alias nao versionado e sempre aponta para a versao corrente; prefira o\ncaminho versionado. Toda resposta carrega o header `API-Version: v1`.\n\n## Retirada de operacoes\n\nUma operacao so e desligada depois de no minimo 180 dias de aviso. O aviso aparece\nem tres lugares ao mesmo tempo: `deprecated: true` nesta especificacao, o header\n`Deprecation` (RFC 9745) e o header `Sunset` (RFC 8594) com a data de desligamento na\nresposta da propria operacao. Uma versao maior nova (`/api/v2/public`) nunca reaproveita\num caminho existente: as duas convivem durante o periodo de aviso.\n\n## Limite de uso\n\nLeitura publica: 240 requisicoes por 60s por IP.\nEscrita: 60/60s.\nTelemetria: 600/60s.\nFeeds: 120/60s.\nToda resposta traz `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset` e\n`RateLimit-Policy`; um 429 traz tambem `Retry-After`.","contact":{"name":"Suporte Chave Direta","email":"suporte@chavedireta.com.br","url":"https://chavedireta.com.br/contact"},"termsOfService":"https://chavedireta.com.br/terms","license":{"name":"Proprietária","url":"https://chavedireta.com.br/terms"}},"servers":[{"url":"https://chavedireta.com.br","description":"Produção"}],"externalDocs":{"description":"Documentação para desenvolvedores","url":"https://chavedireta.com.br/developers"},"x-api-versioning":{"scheme":"url-path","current":"v1","versionedBasePath":"/api/v1/public","unversionedAlias":"/api/public","responseHeader":"API-Version"},"x-api-deprecation-policy":{"policyUrl":"https://chavedireta.com.br/developers/deprecation","linkRelation":"sunset","minimumNoticeDays":180,"signals":["Deprecation","Sunset","openapi:deprecated"],"documentation":"https://chavedireta.com.br/developers"},"x-rate-limit":[{"name":"public-read","limit":240,"windowSeconds":60,"scope":"ip"},{"name":"public-write","limit":60,"windowSeconds":60,"scope":"ip"},{"name":"public-telemetry","limit":600,"windowSeconds":60,"scope":"ip"},{"name":"public-feed","limit":120,"windowSeconds":60,"scope":"ip"}],"tags":[{"name":"Status","description":"Disponibilidade e metadados da API pública."},{"name":"Planos","description":"Planos e preços publicados da plataforma."},{"name":"Leads","description":"Captação de leads a partir dos sites públicos dos clientes."},{"name":"Analytics","description":"Eventos de navegação dos sites públicos dos clientes."},{"name":"Indicações","description":"Validação de códigos de indicação usados no cadastro."},{"name":"Cobranças","description":"Consulta de cobranças pelo token público entregue ao pagador."},{"name":"Integrações","description":"Feeds de imóveis consumidos por portais parceiros."}],"paths":{"/api/v1/public/status":{"get":{"operationId":"getPublicStatus","tags":["Status"],"summary":"Status da API pública","description":"Retorna o estado operacional da API pública, a versão da especificação e os links para a documentação legível por máquina. Use como health check antes de encadear outras chamadas.","security":[],"responses":{"200":{"description":"API pública disponível.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicStatus"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/public/plans":{"get":{"operationId":"listPublicPlans","tags":["Planos"],"summary":"Lista os planos publicados","description":"Retorna os planos de assinatura publicados na página de preços, com valor mensal, moeda, público-alvo (imobiliária ou corretor autônomo), limites e recursos de marketing. São exatamente os mesmos dados exibidos na home.","security":[],"parameters":[{"name":"audience","in":"query","required":false,"description":"Filtra os planos pelo público-alvo. Sem o parâmetro, retorna todos.","schema":{"type":"string","enum":["broker","real_estate"]}}],"responses":{"200":{"description":"Planos publicados.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPlanList"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Parâmetro audience inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"Falha ao carregar os planos.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/public/affiliate/validate":{"get":{"operationId":"validateAffiliateCode","tags":["Indicações"],"summary":"Valida um código de indicação","description":"Verifica se um código de indicação existe e quantos dias de bônus ele concede no cadastro. Códigos com menos de 4 caracteres são tratados como inválidos.","security":[],"parameters":[{"name":"code","in":"query","required":true,"description":"Código de indicação, sem diferenciar maiúsculas.","schema":{"type":"string","minLength":4,"maxLength":64}}],"responses":{"200":{"description":"Resultado da validação.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AffiliateValidation"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/public/leads":{"post":{"operationId":"createPublicLead","tags":["Leads"],"summary":"Registra um lead de site público","description":"Cria um lead no CRM da imobiliária dona do site público em que o formulário foi preenchido. O tenant é identificado pelo host da requisição ou pelo campo tenantSlug. Exige um token de captcha válido e ignora envios duplicados do mesmo contato em janela curta.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLeadInput"}}}},"responses":{"200":{"description":"Envio aceito e descartado: honeypot preenchido ou lead duplicado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLeadSkipped"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"201":{"description":"Lead criado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicLeadCreated"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Payload inválido ou captcha não confirmado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"Site público não identificado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"Falha ao registrar o lead.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/public/site-analytics":{"post":{"operationId":"trackPublicSiteAnalyticsEvent","tags":["Analytics"],"summary":"Registra um evento de analytics do site público","description":"Grava um evento de navegação (visualização de página, saída, clique em CTA ou envio de lead) do site público de uma imobiliária. Eventos de página repetidos na mesma sessão em até 5 segundos são tratados como duplicados.","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAnalyticsEventInput"}}}},"responses":{"200":{"description":"Evento repetido na mesma sessão e descartado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAnalyticsEventResult"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"201":{"description":"Evento registrado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteAnalyticsEventResult"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Payload inválido.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"Site público não identificado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"description":"Falha ao registrar o evento.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}}}}},"/api/v1/public/charges/{token}":{"get":{"operationId":"getPublicCharge","tags":["Cobranças"],"summary":"Consulta uma cobrança pelo token público","description":"Retorna os dados de uma cobrança (valor, vencimento, meios de pagamento e situação) a partir do token opaco entregue ao pagador no link de cobrança. Não requer autenticação, mas o token é secreto.","security":[],"parameters":[{"$ref":"#/components/parameters/ChargeToken"}],"responses":{"200":{"description":"Cobrança encontrada.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicChargeEnvelope"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"Cobrança não encontrada para o token informado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/public/charges/{token}/status":{"get":{"operationId":"getPublicChargeStatus","tags":["Cobranças"],"summary":"Consulta a situação de pagamento de uma cobrança","description":"Versão enxuta de getPublicCharge, feita para polling: devolve apenas a situação de pagamento da cobrança identificada pelo token público.","security":[],"parameters":[{"$ref":"#/components/parameters/ChargeToken"}],"responses":{"200":{"description":"Situação da cobrança.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicChargeStatusEnvelope"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"Cobrança não encontrada para o token informado.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}},"/api/v1/public/integrations/feeds/{providerCode}":{"get":{"operationId":"getIntegrationPropertyFeed","tags":["Integrações"],"summary":"Feed XML de imóveis para um portal parceiro","description":"Devolve o feed XML de imóveis de uma organização no formato exigido pelo portal parceiro. Consumido pelos portais do Grupo OLX / ZAP; exige o token do feed configurado na integração.","security":[],"parameters":[{"name":"providerCode","in":"path","required":true,"description":"Código do portal parceiro.","schema":{"type":"string","examples":["grupo-olx"]}},{"name":"organization","in":"query","required":true,"description":"Slug da organização dona dos imóveis.","schema":{"type":"string"}},{"name":"token","in":"query","required":true,"description":"Token do feed, gerado na configuração da integração.","schema":{"type":"string"}}],"responses":{"200":{"description":"Feed XML de imóveis.","content":{"application/xml":{"schema":{"type":"string","description":"Documento XML no formato do portal parceiro."}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"400":{"description":"Organização não informada.","content":{"text/plain":{"schema":{"type":"string"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"404":{"description":"Provedor, organização ou integração não encontrados.","content":{"text/plain":{"schema":{"type":"string"}}},"headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}}},"429":{"$ref":"#/components/responses/RateLimited"}}}}},"components":{"headers":{"ApiVersion":{"description":"Versão da API que respondeu a requisição.","schema":{"type":"string","examples":["v1"]}},"RateLimitPolicy":{"description":"Política aplicada, no formato `limite;w=janela em segundos`.","schema":{"type":"string","examples":["240;w=60"]}},"RateLimitLimit":{"description":"Requisições permitidas na janela corrente, por IP.","schema":{"type":"integer"}},"RateLimitRemaining":{"description":"Requisições ainda disponíveis na janela corrente.","schema":{"type":"integer"}},"RateLimitReset":{"description":"Segundos até a janela corrente reiniciar.","schema":{"type":"integer"}},"RetryAfter":{"description":"Segundos a aguardar antes de repetir a chamada.","schema":{"type":"integer"}},"SunsetPolicyLink":{"description":"Aponta a política de versão e descontinuação, via link relation `sunset` (RFC 8594).","schema":{"type":"string","examples":["<https://chavedireta.com.br/developers/deprecation>; rel=\"sunset\"; type=\"text/html\""]}},"Deprecation":{"description":"Presente quando a operação está descontinuada, no formato de data HTTP (RFC 9745).","schema":{"type":"string"}},"Sunset":{"description":"Data em que a operação descontinuada deixa de responder (RFC 8594).","schema":{"type":"string"}}},"responses":{"RateLimited":{"description":"Limite de requisições excedido.","headers":{"API-Version":{"$ref":"#/components/headers/ApiVersion"},"Link":{"$ref":"#/components/headers/SunsetPolicyLink"},"RateLimit-Policy":{"$ref":"#/components/headers/RateLimitPolicy"},"RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}},"parameters":{"ChargeToken":{"name":"token","in":"path","required":true,"description":"Token público e opaco da cobrança, entregue ao pagador.","schema":{"type":"string","minLength":8}}},"schemas":{"ApiError":{"type":"object","title":"ApiError","description":"Formato único de erro da API pública.","required":["error","code","message","hint","status","documentation"],"properties":{"error":{"type":"string","description":"Mensagem legível para humanos. Mantida por compatibilidade com clientes antigos."},"code":{"type":"string","description":"Código estável do erro, próprio para lógica automática.","enum":["invalid_payload","invalid_request","unauthorized","forbidden","not_found","conflict","rate_limited","internal_error"]},"message":{"type":"string","description":"Mesma mensagem de `error`."},"hint":{"type":"string","description":"O que fazer para resolver o erro."},"status":{"type":"integer","description":"Código HTTP da resposta."},"documentation":{"type":"string","format":"uri","description":"URL da documentação para desenvolvedores."}}},"PublicStatus":{"type":"object","title":"PublicStatus","required":["status","service","specVersion","documentation","openapi"],"properties":{"status":{"type":"string","enum":["ok"],"description":"Estado operacional da API pública."},"service":{"type":"string","description":"Nome do serviço."},"specVersion":{"type":"string","description":"Versão da especificação OpenAPI publicada."},"documentation":{"type":"string","format":"uri","description":"Documentação para desenvolvedores."},"openapi":{"type":"string","format":"uri","description":"URL da especificação OpenAPI."},"llmsTxt":{"type":"string","format":"uri","description":"URL do llms.txt."},"time":{"type":"string","format":"date-time","description":"Momento da resposta, em UTC."}}},"PublicPlanList":{"type":"object","title":"PublicPlanList","required":["plans"],"properties":{"plans":{"type":"array","description":"Planos publicados, na ordem exibida na página de preços.","items":{"$ref":"#/components/schemas/PublicPlan"}}}},"PublicPlan":{"type":"object","title":"PublicPlan","required":["code","name","audience","currencyCode"],"properties":{"code":{"type":"string","description":"Código estável do plano."},"name":{"type":"string","description":"Nome comercial do plano."},"description":{"type":["string","null"],"description":"Descrição curta do plano."},"monthlyAmount":{"type":["number","null"],"description":"Valor mensal na moeda do plano. Nulo quando o preço é sob consulta."},"currencyCode":{"type":"string","description":"Moeda do valor mensal, em ISO 4217.","examples":["BRL"]},"audience":{"type":"string","enum":["BROKER","REAL_ESTATE","BOTH"],"description":"Público-alvo do plano."},"highlight":{"type":"boolean","description":"Indica o plano destacado na página de preços."},"contactSalesEnabled":{"type":"boolean","description":"Indica que a contratação passa pelo time comercial."},"badgeLabel":{"type":["string","null"],"description":"Selo exibido junto ao plano."},"marketingFeatures":{"type":"array","description":"Lista de benefícios exibidos na página de preços.","items":{"type":"string"}},"limits":{"type":"object","description":"Limites do plano (usuários, imóveis publicados e afins).","additionalProperties":true},"pricing":{"type":"object","description":"Regras de preço do plano, como cobrança por excedente.","additionalProperties":true},"tiers":{"type":"object","description":"Níveis de recurso do plano (marca, integrações, distribuição de leads, financeiro e API).","additionalProperties":true},"featureFlags":{"type":"object","description":"Recursos habilitados pelo plano.","additionalProperties":true},"id":{"type":"string","description":"Identificador interno do plano."}}},"AffiliateValidation":{"type":"object","title":"AffiliateValidation","required":["valid"],"properties":{"valid":{"type":"boolean","description":"Indica se o código de indicação existe."},"bonusDays":{"type":"integer","description":"Dias de bônus concedidos pelo código, quando válido."}}},"PublicLeadInput":{"type":"object","title":"PublicLeadInput","required":["whatsApp","origin"],"properties":{"fullName":{"type":["string","null"],"description":"Nome informado pelo visitante."},"email":{"type":["string","null"],"format":"email","description":"E-mail do visitante."},"whatsApp":{"type":"string","description":"Telefone/WhatsApp do visitante, apenas dígitos."},"message":{"type":["string","null"],"description":"Mensagem livre do visitante."},"origin":{"type":"string","enum":["portfolio_home","property_detail","whatsapp_home","whatsapp_property"],"description":"Onde no site público o contato foi iniciado."},"tenantSlug":{"type":["string","null"],"description":"Slug da organização dona do site. Opcional quando o host já identifica o tenant."},"propertySlug":{"type":["string","null"],"description":"Slug público do imóvel de interesse."},"captchaToken":{"type":["string","null"],"description":"Token do captcha usado no formulário."},"website":{"type":["string","null"],"description":"Campo honeypot. Preenchido, o envio é descartado silenciosamente."}}},"PublicLeadCreated":{"type":"object","title":"PublicLeadCreated","required":["success","leadId"],"properties":{"success":{"type":"boolean","enum":[true]},"leadId":{"type":"string","description":"Identificador do lead criado."}}},"PublicLeadSkipped":{"type":"object","title":"PublicLeadSkipped","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]},"ignored":{"type":"boolean","description":"Envio descartado pelo honeypot."},"duplicate":{"type":"boolean","description":"Contato já registrado na janela de deduplicação."}}},"SiteAnalyticsEventInput":{"type":"object","title":"SiteAnalyticsEventInput","required":["sessionId","eventType","pageType","pagePath"],"properties":{"sessionId":{"type":"string","description":"Identificador da sessão de navegação."},"eventType":{"type":"string","enum":["PAGE_VIEW","PAGE_EXIT","CTA_CLICK","LEAD_SUBMIT"],"description":"Tipo do evento."},"pageType":{"type":"string","enum":["HOME","PROPERTY_LIST","PROPERTY_DETAIL"],"description":"Tipo da página onde o evento aconteceu."},"pagePath":{"type":"string","description":"Caminho da página dentro do site público."},"pageLabel":{"type":["string","null"],"description":"Rótulo legível da página."},"eventLabel":{"type":["string","null"],"description":"Rótulo legível do evento."},"eventTarget":{"type":["string","null"],"description":"Alvo do evento, como o identificador do CTA clicado."},"tenantSlug":{"type":["string","null"],"description":"Slug da organização dona do site. Opcional quando o host já identifica o tenant."},"propertySlug":{"type":["string","null"],"description":"Slug público do imóvel envolvido no evento."}}},"SiteAnalyticsEventResult":{"type":"object","title":"SiteAnalyticsEventResult","required":["success"],"properties":{"success":{"type":"boolean","enum":[true]},"duplicate":{"type":"boolean","description":"Evento repetido na mesma sessão e descartado."}}},"PublicChargeEnvelope":{"type":"object","title":"PublicChargeEnvelope","required":["charge"],"properties":{"charge":{"type":"object","description":"Dados da cobrança: valor, vencimento, meios de pagamento e situação.","additionalProperties":true}}},"PublicChargeStatusEnvelope":{"type":"object","title":"PublicChargeStatusEnvelope","required":["status"],"properties":{"status":{"type":"object","description":"Situação de pagamento da cobrança.","additionalProperties":true}}}}},"security":[]}