Este guia é destinado a desenvolvedores de CRMs parceiros ou equipes que mantêm CRMs próprios para imobiliárias e desejam integrar seus sistemas ao serviço de Catálogo da Órulo.
Importante: Este documento não se aplica às integrações dedicadas ao produto Inteligência de Mercado.
Para esse caso, consulte o material específico: Fluxo de Integração via API para o Inteligência de Mercado de Imóveis da Órulo.
1. Importância dos IDs
Os empreendimentos e todos os seus elementos associados (fotos, plantas, tipologias, contatos comerciais, etc.) possuem IDs únicos e imutáveis. Eles são essenciais para:
identificar itens novos
detectar itens removidos
atualizar dados sem duplicações
IDs nunca são reutilizados. Se um ID deixar de ser retornado pela API, ele pode ser removido com segurança do sistema local.
2. Primeira Sincronização
Quando a imobiliária configura suas credenciais (Client ID e Secret) no CRM, siga este processo inicial:
Rotas da API de catálogo usam o prefixo /api/v2/. As rotas /oauth/* (OAuth2 / Doorkeeper) não levam esse prefixo.
Na documentação oficial, o identificador do empreendimento pode aparecer como :building_id; neste guia usamos {buildingId} com o mesmo significado.
2.1 Autenticação a nível de imobiliária (oruloClientAuth)
Obtenha o token de acesso via oruloClientAuth com POST (recomendado pela RFC 6749: evita expor client_secret em query string, logs de proxy e histórico).
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
client_id={clientId}&client_secret={clientSecret}&grant_type=client_credentialsEmbora o token tenha longa validade, o CRM deve apenas tratar erros de autenticação e solicitar um novo token conforme necessário. Não é necessário verificar ou controlar validade manualmente.
2.2 Confirmar ativação da integração
GET /api/v2/configO corpo da resposta (campos como name, callback_url, active, updated_at, etc.) está descrito na documentação oficial da API.
2.3 Listar empreendimentos ativos
GET /api/v2/buildings/ids/activePaginação: a listagem é paginada. Utilize os parâmetros de query page e results_per_page. O número de itens por página não pode ultrapassar 500. A resposta inclui, entre outros campos, building_ids (lista de objetos com id e updated_at), total, page e total_pages. O CRM deve percorrer todas as páginas (por exemplo, incrementando page até alcançar total_pages); caso contrário, verá no máximo 500 empreendimentos e o catálogo ficará incompleto.
Exemplo ilustrativo de estrutura de resposta:
{
"building_ids": [{ "id": 123, "updated_at": "..." }],
"total": 1500,
"page": 1,
"total_pages": 3
}2.4 Processamento dos empreendimentos
Para cada buildingId listado:
Obter detalhes completos
GET /api/v2/buildings/{buildingId}Obter imagens
GET /api/v2/buildings/{buildingId}/images?width={w}&height={h}Obter plantas
GET /api/v2/buildings/{buildingId}/floor_plans?width={w}&height={h}Essa operação deve ser realizada apenas uma vez, na primeira sincronização.
3. Atualizações via Webhook
As atualizações de empreendimentos (novos, alterados ou removidos) são notificadas via Webhook.
Os eventos são divididos em dois tipos de payload (com e sem client_id) porque o objeto da notificação muda:
- Sem
client_id— atualização de catálogo (active,removed): a mudança refere-se ao empreendimento no catálogo (dados ou situação geral). A ação esperada do CRM é a mesma para quem consome esse catálogo (reprocessar obuilding_idou tratar remoção ampla). Não háclient_idporque o evento não é específico de uma integração — não é preciso rotear por credencial. Quando várias integrações usam a mesma URL de webhook, a Órulo envia um único POST por URL e por evento nesses casos, reduzindo volume sem perder o significado do evento. - Com
client_id— mudança de distribuição (added_to_distribution,excluded_from_distribution): a mudança é por integração (o empreendimento entra ou sai da distribuição daquela credencial). Várias integrações podem compartilhar a mesma URL sem parametrizá-la; oclient_idno corpo identifica qual integração deve incluir ou retirar o empreendimento. Por isso o envio permanece por integração (a mesma URL pode receber mais de um POST, comclient_iddistinto em cada um). Esses eventos podem refletir ações feitas na área do cliente na plataforma — por exemplo, quando a imobiliária opta por não receber mais aquele empreendimento na distribuição da integração (ou volta a incluí-lo). O webhook comunica o efeito para o CRM alinhar a base local.
Deduplicação temporal: além do envio único por URL nos casos descritos acima, a infraestrutura pode consolidar eventos muito próximos no tempo (da ordem de menos de cinco minutos) para o mesmo empreendimento e integração. Duas alterações em sequência rápida podem resultar em um único webhook. O CRM deve tratar o processamento de forma idempotente e pode complementar com a reconciliação periódica da seção 3.4.
3.1 Configuração
A configuração é realizada pelo time de integrações da Órulo. Para isso, o CRM deve fornecer uma URL pública que aceite requisições POST.
O endpoint do CRM deve responder HTTP 200 a cada evento, para confirmar o recebimento. O processamento (consultar a API, inserir, atualizar ou remover) pode continuar depois, inclusive de forma assíncrona. Respostas diferentes de 200 (timeout, 4xx ou 5xx) são tratadas como falha de recebimento.
3.2 Payload
A notificação é enviada em POST para a URL configurada, com Content-Type: application/json.
Atualização de empreendimento (status active ou removed): o payload não inclui client_id, pois o evento não discrimina integração.
{
"date": "17/09/2025 12:34:56",
"name": "BUILDING_UPDATE",
"properties": {
"building_id": 123,
"status": "active"
}
}Mudança de distribuição (status added_to_distribution ou excluded_from_distribution): o payload inclui client_id (identificador da integração, por exemplo o UID da aplicação OAuth).
{
"date": "06/03/2026 14:30:00",
"name": "BUILDING_UPDATE",
"properties": {
"status": "excluded_from_distribution",
"building_id": 12345,
"client_id": "uuid-da-aplicacao-oauth"
}
}Exemplo com added_to_distribution:
{
"date": "06/03/2026 14:30:00",
"name": "BUILDING_UPDATE",
"properties": {
"status": "added_to_distribution",
"building_id": 12345,
"client_id": "uuid-da-aplicacao-oauth"
}
}| Campo | Descrição |
|---|---|
date | Data e hora da geração do evento. Todos os status usam o mesmo formato: dd/MM/yyyy HH:mm:ss (locale pt-BR), por exemplo 06/03/2026 14:30:00. Não use formato ISO nos exemplos de parsing. |
name | Tipo de evento (ex.: BUILDING_UPDATE) |
properties.building_id | ID do empreendimento |
properties.status | Ver tabela abaixo |
properties.client_id | Presente somente em eventos de mudança de distribuição (added_to_distribution, excluded_from_distribution). Identificador da integração (ex.: UID da aplicação OAuth). |
Valores de properties.status:
| Valor | Significado |
|---|---|
active | O empreendimento foi criado ou atualizado no catálogo (atualização geral, não trata especificamente a entrada na distribuição da integração). |
removed | Empreendimento vendido ou com estoque esgotado no catálogo; deixa de estar ativo de forma ampla. Afeta todas as integrações. Payload sem client_id. |
added_to_distribution | O empreendimento passou a integrar a distribuição para aquela integração (entrada na distribuição). Pode decorrer, entre outros motivos, de decisão na área do cliente. |
excluded_from_distribution | Saída da distribuição por configuração da imobiliária ou determinação da incorporadora. Com client_id, a remoção vale somente para essa integração (em geral hard delete no escopo dessa credencial). |
Preparação futura: se em algum cenário eventos com status *_from_distribution for enviado sem client_id, o CRM deve estar preparado para interpretar como remoção/adição do empreendimento em todas as integrações (otimização administrativa possível no futuro). Trate essa regra de forma defensiva na implementação.
3.3 Como processar
Quando o CRM receber o webhook:
Se status = active
Significa que o empreendimento foi criado ou atualizado. O CRM deve reprocessar esse buildingId realizando a seguinte requisição:
GET /api/v2/buildings/{buildingId}No JSON de resposta, as imagens e as plantas vêm nos arrays images e floor_plans, cada item com um campo id (string). O CRM deve guardar localmente a lista de images[].id e floor_plans[].id da última sincronização. Ao receber o webhook e obter a resposta atual do GET /api/v2/buildings/{buildingId}, compare essas listas: se houver IDs novos ou IDs que deixaram de existir na resposta, chame os endpoints dedicados (que retornam URLs em múltiplas dimensões):
GET /api/v2/buildings/{buildingId}/imagesGET /api/v2/buildings/{buildingId}/floor_plans
Exemplo: na última sync, images tinham os IDs "456" e "789". Após o webhook, o GET retorna images com "456" e "999". O ID "789" sumiu (remova localmente o que dependia dele) e "999" é novo — nesse caso, chame GET /api/v2/buildings/{buildingId}/images para obter as URLs do novo item.
Somente quando houver alteração nesses conjuntos de IDs é obrigatório refazer o download completo por esses endpoints; caso contrário, basta atualizar os demais campos do empreendimento a partir do GET do building.
Depois disso:
- Se o empreendimento não existir no CRM → inserir.
- Se já existir → sobrescrever todos os dados atualizados.
- Remover somente elementos cujo ID não existe mais.
Se status = added_to_distribution
Indica que o empreendimento entrou na distribuição da integração identificada por client_id. O fluxo de sincronização é o mesmo do active (consultar GET /api/v2/buildings/{buildingId} e, se necessário, imagens e plantas). Integrações que não precisam distinguir entrada na distribuição de uma atualização comum podem tratar added_to_distribution como equivalente a active.
Se status = removed
O empreendimento não deve mais ser considerado ativo. O CRM deve realizar um soft delete, ou seja:
removê-lo da listagem ativa;
despublicá-lo (quando aplicável).
Se status = excluded_from_distribution
O empreendimento deve ser totalmente removido da base daquela integração (use client_id para rotear quando várias integrações compartilham a mesma URL). Em geral, trata-se de hard delete no escopo dessa integração:
excluir permanentemente do banco de dados os dados vinculados a essa distribuição;
despublicar (quando aplicável).
3.4 Reconciliação periódica (fallback)
Além dos webhooks, recomenda-se que o CRM execute periodicamente uma rotina de reconciliação combinando dois passos:
- Empreendimentos ativos: repetir o fluxo da seção 2.3 (todas as páginas de
GET /api/v2/buildings/ids/active) e, para cadabuilding_id, reprocessar o empreendimento como na primeira sincronização ou ao receberactive(detalhes em 3.3). - Empreendimentos removidos: na mesma execução da rotina, chamar
GET /api/v2/buildings/ids/removedcomupdated_after(por exemplo, data/hora da última reconciliação concluída com sucesso) e tratar cadabuilding_idretornado como no webhook com statusremoved(soft delete; ver 3.3). Restrição: o intervalo entreupdated_aftere o momento atual não pode exceder 90 dias; se a última execução foi há mais tempo, use uma data mais recente ou faça consultas em etapas. Parâmetros, paginação (se houver) e formato da resposta: documentação oficial da API.
Isso cobre casos em que um evento de atualização ou de remoção não foi processado (falha temporária no endpoint do CRM, indisponibilidade, fila interna, deduplicação temporal de webhooks, etc.).
Orientação operacional para o integrador: executar essa rotina completa (ativos e removidos) no máximo uma vez por dia e no mínimo uma vez por semana, ajustando conforme volume e criticidade, respeitando o teto diário para não sobrecarregar a API nem o próprio sistema. O webhook continua sendo o canal principal; esta rotina é reconciliação de segurança, não substituto do fluxo em tempo real.
4. Links de Publicação
O endpoint de links de publicação tem como finalidade que o CRM informe à Órulo os links dos empreendimentos publicados no site da imobiliária. Essa é uma exigência das anunciantes e o não atendimento deste requisito pode causar restrições no acesso à API e na geração dos eventos de notificação. Sempre que um imóvel é publicado ou despublicado, esses links precisam ser atualizados.
4.1 Endpoint
PUT /api/v2/buildings/{buildingId}/publication_links4.2 Regras de autenticação
Usa token da imobiliária (
oruloClientAuth).Não aceita token de corretor (
oruloEndUserAuth).
4.3 Payload
O endpoint recebe um array de links. Sempre substitui os links anteriores existentes para aquele buildingId. Exemplo:
{
"publication_links": [
{
"url": "https://exemplo.com/empreendimento-123",
"active": true
},
{
"url": "https://exemplo.com/empreendimento-123/tipo-a",
"active": false
}
]
}4.4 Validações
urldeve iniciar comhttp://ouhttps://activedeve ser booleancampos obrigatórios não podem faltar
array vazio é permitido
aceita múltiplos links para o mesmo empreendimento.
Isso ocorre quando o CRM gera páginas por tipologia. Exemplo:
- Empreendimento ID 123
- Tipologias: Studio, 1 Dorm, 2 Dorms
O CRM pode enviar:
{
"publication_links": [
{ "url": "https://crm.exemplo.com/empreendimento-123/studio", "active": true },
{ "url": "https://crm.exemplo.com/empreendimento-123/1-dorm", "active": true },
{ "url": "https://crm.exemplo.com/empreendimento-123/2-dorms", "active": true }
]
}Todos esses links são válidos e devem ser processados como páginas vinculadas ao mesmo empreendimento.
5. Autenticação a nível de corretor (oruloEndUserAuth)
O oruloEndUserAuth utiliza o OAuth2 e é destinado a acessar dados comerciais em tempo real, sem armazenamento em banco. Esses dados incluem:
- Contatos comerciais: nome, telefones, e-mails, WhatsApp e página de contato
- Percentual de comissão
- Website do empreendimento
- Arquivos de apoio à venda: tabelas de preços, memorial descritivo, etc.
- Detalhes de oportunidades: textos, valores, datas, promoções e premiações
Configuração obrigatória: informar ao time de integrações da Órulo a URL de callback (redirectURI) que será utilizada pelo corretor para autorizar a aplicação.
Requisitos da redirectURI: em produção, a URI de callback deve usar HTTPS (configuração do servidor OAuth). Em desenvolvimento ou ambientes não produtivos, HTTP em localhost costuma ser aceito para testes. Confirme sempre na documentação oficial e com o time de integrações se houver dúvida.
5.1 Processo de autorização
1. Gerar link de autorização para o corretor:
https://www.orulo.com.br/oauth/authorize?client_id={clientId}&redirect_uri={redirectURI}&response_type=code2. Após a autorização, trocar o código recebido (code) por um access token com POST e corpo application/x-www-form-urlencoded (evita expor client_secret na query):
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
client_id={clientId}&client_secret={clientSecret}&code={code}&redirect_uri={redirectURI}&grant_type=authorization_code3. Usar o token retornado (END_USER_TOKEN) para consultar os endpoints em tempo real:
GET /api/v2/buildings/1234
Authorization: Bearer END_USER_TOKENObservação
Como os dados obtidos via oruloEndUserAuth requerem rastreabilidade, eles devem ser consumidos em tempo real e não armazenados no banco de dados. A implementação do oruloEndUserAuth é opcional; caso não seja adotada, é suficiente utilizar o link da página do empreendimento na Órulo, contido no campo orulo_url.
6. Códigos HTTP comuns
Referência enxuta para implementação defensiva (detalhes por endpoint na documentação oficial da API):
| Contexto | Códigos | Significado típico |
|---|---|---|
POST /oauth/token | 200 | Token emitido com sucesso. |
| 400 | Requisição inválida (parâmetros ausentes ou incorretos). | |
| 401 | Credenciais inválidas ou cliente não autorizado. | |
GET /api/v2/config, GET /api/v2/buildings/... | 200 | Sucesso; corpo com o recurso solicitado. |
| 401 | Token ausente, expirado ou inválido. | |
| 404 | Recurso não encontrado (ex.: empreendimento inexistente ou sem permissão). | |
PUT /api/v2/buildings/.../publication_links | 200 / 204 | Atualização processada (o código exato depende da versão documentada). |
| 400 | Payload inválido (URLs, tipos, campos obrigatórios). | |
| 401 | Token da imobiliária inválido ou ausente. | |
| 404 | Empreendimento não encontrado. | |
| Endpoint do CRM (webhook recebido) | 200 | Confirma o recebimento do evento. Qualquer outro código (ou timeout) é tratado como falha de entrega. |
Considerações finais
O conteúdo deste artigo foi elaborado com base em conversas com clientes ao longo dos anos em que a Órulo atua neste segmento, em colaboração com a equipe de desenvolvimento. Esta abordagem é a mais recomendada para a construção da integração. No entanto, caso tenha chegado a alguma conclusão diferente, sinta-se à vontade para proceder da maneira que julgar mais adequada. É importante ressaltar que, ao final do desenvolvimento da integração pelo cliente, conduz-se uma etapa de homologação para validar os pontos mencionados neste documento.