Conceitos e regras
O que vale para toda chamada, e as regras da plataforma que a integração precisa conhecer.
A chave e as permissões
- A chave é da conta (a empresa), nunca de uma pessoa. Ela tem nome, permissões, validade opcional e, se quiser, uma lista de IPs.
- Cada rota exige uma permissão (
properties:read,leads:write…). Sem ela, scope_missing.GET /v1/memostra as permissões da chave. - Duas chaves ativas ao mesmo tempo deixam trocar a chave sem parar a integração: crie a nova, troque no seu sistema, revogue a velha.
- O dono da conta recebe um e-mail 15 dias antes de a chave vencer e na véspera.
Limites
- Faixa padrão: 10 chamadas por segundo (pico de 20) e 300 mil por mês. Faixa ampliada: 20 por segundo (pico de 40) e 1 milhão por mês. A ImobyFlow ajusta sob medida.
- Passou do segundo: rate_limited — espere e tente de novo, com intervalo crescente. Passou do mês: monthly_quota_exceeded — a cota volta no dia 1º (UTC). O dono é avisado em 80% e em 100%.
- Quem relê a carteira inteira toda hora gasta a cota à toa: use os eventos para saber o que mudou.
Listas e paginação
- As listas vêm em páginas:
limitdiz quantos itens, e cada resposta traznextCursor. Mande-o de volta emcursoraté ele vir nulo. - O cursor vale só para a rota e a conta que o devolveram — e não se mexe nele. Mexido ou trocado: invalid_cursor.
- Para sincronizar,
updatedSincetraz só o que mudou desde uma data. Os eventos fazem melhor: em ordem, com 30 dias de memória.
Erros
Todo erro vem em application/problem+json (RFC 9457), com um code estável — é por ele que o seu sistema decide o que fazer, nunca pelo texto. O type é o endereço da página do erro, com a causa e o conserto. invalidParams traz todos os problemas do pedido de uma vez.
Mande o requestId quando falar com o suporte. Ver todos os códigos.
Como a escrita funciona
- Campo ausente não apaga: o pedido só muda o que trouxe. Para limpar um campo, mande
null. - Campo desconhecido é erro (invalid_param com
unknown_field). Umbedroomno lugar debedroomsnão pode passar calado. - Nada mudou? A resposta diz
UNCHANGEDe nada é gravado. Reenviar a carteira inteira não custa escrita. - A edição feita na tela vence: o campo que a equipe mudou no painel não é sobrescrito e volta em
result.conflicts. ?dryRun=true(modo ensaio): valida e diz o que aconteceria — criaria, atualizaria, nada mudou, estouraria a cota — sem gravar nada.- Mande uma
Idempotency-Key(um UUID) em cada escrita. Se a rede cair e você repetir o MESMO pedido com a MESMA chave em 24 horas, recebe a mesma resposta, sem gravar de novo (Idempotent-Replayed: true). - Dois pedidos para o mesmo código ao mesmo tempo: o segundo recebe concurrent_write. Não mande o mesmo código em paralelo.
As regras da plataforma que valem para quem integra
São as mesmas da tela. Elas protegem as recomendações e os parceiros — e é por elas que um dado "aceito" às vezes não aparece onde você esperava.
- Bairro é fechado no catálogo. Mande
neighborhoodSlugda lista de cidades e bairros. Bairro em texto passa por um dicionário de apelidos; o que ele não reconhece fica para a análise da ImobyFlow e o imóvel sai das recomendações até lá. - Sem capa, sem recomendação. A primeira foto é a capa. As fotos mandadas por endereço são baixadas depois da resposta — acompanhe em
photoSync. - A régua dos 60 dias. Imóvel que ninguém confirma sai do ar. Gravar o imóvel pela API confirma; para confirmar sem mudar nada, use a confirmação em lote.
- Uma origem por conta. Com a sincronização automática do feed do CRM ligada, a API não grava imóvel (feed_sync_active): o feed arquivaria o que não estivesse no arquivo dele.
- Imóvel novo passa pela análise da ImobyFlow antes de aparecer para parceiros, como pela tela.
- Cota do plano. Só imóvel disponível ocupa cota. Criar acima do teto: plan_limit_reached. Atualizar quem já existe nunca é barrado.
- Lixeira com trava. Excluir manda para a lixeira por 30 dias. No máximo 20% da carteira (e pelo menos 10 itens) em 24 horas — um laço no seu sistema não esvazia a carteira (shrink_guard).
- Clientes: consentimento. Na criação,
consentGiven: true. A imobiliária é a controladora do dado e declara a base legal. - Clientes: movimentação. Cliente sem movimentação por 60 dias é arquivado. A sincronização sozinha não conta: mande
lastActivityAtcom a data do seu sistema, ou registre os atendimentos. - Clientes: um só por pessoa. O PUT pelo código acha a pessoa que já está aqui pelo telefone ou e-mail e liga o seu código a ela (
LINKED), sem duplicar. - Parceria: dono único do funil. Só o lado que captou o cliente move a etapa (
canMoveFunnel). - Captação: aceitar gasta crédito. Só com a permissão
captacao:accepte o termo específico aceito pelo dono no painel. Contato e endereço só aparecem depois do aceite.
Sincronizar a carteira, passo a passo
- Carga inicial: mande a carteira em lotes de até 500, com o código do seu sistema em
externalRef. Primeiro com?dryRun=true, para ver o que seria recusado. - Depois, a cada mudança no seu sistema:
PUT /v1/properties/by-ref/{código}. Ele cria ou atualiza, e não grava nada quando nada mudou. - Vendeu ou alugou:
POST /v1/properties/{id}/status. Saiu da carteira:DELETE. - No caminho de volta, leia os eventos ou receba os webhooks: o que a equipe mudou na tela e as oportunidades novas do Radar.
Segurança e LGPD
- Guarde a chave no servidor, num cofre ou variável de ambiente. Nunca no JavaScript do seu site, nunca no aplicativo do cliente final.
- A lista de IPs da chave fecha a porta para quem copiar a chave: só os servidores da lista conseguem usá-la.
- A imobiliária é a controladora dos dados dos clientes; a ImobyFlow é a operadora. Os Termos da API trazem o acordo de tratamento de dados.
- Eventos e webhooks não levam dado pessoal: só ids e os nomes dos campos que mudaram.
Leia os Termos da API antes de colocar a integração em produção.