API do FotoImob
Esta API permite que um CRM leia os imóveis de uma imobiliária no FotoImob — incluindo as fotos já tratadas, na ordem, com a capa primeiro. É a forma recomendada de levar as fotos do FotoImob para o seu sistema.
Autenticação
Envie a chave da organização no cabeçalho Authorization. Toda chamada exige a chave.
Authorization: Bearer fi_sua_chave_aqui
A chave identifica a organização e dá acesso somente aos imóveis dela. Trate-a como senha: guarde no servidor, nunca no navegador nem em app publicado. O cliente pode gerar uma nova a qualquer momento (o que invalida a anterior).
Endereço base
https://app.fotoimob.com.br/api/v1
Todas as respostas são JSON com Content-Type: application/json.
Listar imóveis
GET /imoveis
| Parâmetro | Tipo | Descrição |
|---|---|---|
status | texto | editing, ready ou archived. Padrão: todos. Normalmente você quer ready — imóvel com as fotos finalizadas. |
atualizado_apos | ISO 8601 | Devolve só o que mudou depois dessa data. Use para sincronizar de forma incremental. |
limite | número | 1 a 100. Padrão: 50. |
pagina | número | A partir de 1. Padrão: 1. |
Exemplo
curl -H "Authorization: Bearer fi_sua_chave_aqui" \ "https://app.fotoimob.com.br/api/v1/imoveis?status=ready&limite=50"
Resposta
{
"imoveis": [ { /* objeto imóvel — ver abaixo */ } ],
"paginacao": {
"pagina": 1,
"limite": 50,
"total": 213,
"paginas": 5,
"tem_proxima": true
}
}Buscar um imóvel
GET /imoveis/{id}
Aceita o id do FotoImob ou o codigo do anunciante (o código interno da imobiliária).
curl -H "Authorization: Bearer fi_sua_chave_aqui" \ "https://app.fotoimob.com.br/api/v1/imoveis/PB106"
A resposta é { "imovel": { … } } com o mesmo objeto da listagem.
O objeto imóvel
{
"id": "iv_1784752668236",
"codigo": "12456",
"nome": "Apartamento de Luiz",
"status": "ready", // editing | ready | archived
"situacao": "disponivel", // disponivel | reservado | vendido | locado
"tipo": "Apartamento",
"categoria": "residencial", // residencial | comercial | rural
"finalidade": "venda", // venda | locacao | venda_locacao | temporada
"anuncio": {
"titulo": "Apartamento 3 quartos com suíte e varanda",
"descricao": "Texto completo do anúncio…",
"pagina_publica": "https://app.fotoimob.com.br/imovel/iv_1784752668236"
},
"endereco": {
"cep": "88056300", "logradouro": "Rua Leonel Pereira", "numero": "715",
"complemento": "210 A", "bairro": "Cachoeira do Bom Jesus",
"cidade": "Florianópolis", "uf": "SC",
"exibicao": "bairro" // completo | rua | bairro
},
"valores": {
"venda": 950000, "locacao": 4900,
"condominio": 490, "iptu": 190,
"sob_consulta": false
},
"medidas": {
"area_total": 79, "area_util": 62, "area_terreno": null,
"dormitorios": 2, "suites": 1, "banheiros": 2, "vagas": 1,
"andar": 1, "ano_construcao": 2021,
"mobiliado": "parcial" // nao | parcial | sim
},
"caracteristicas": ["piscina", "churrasqueira", "elevador"],
"fotos": [
{
"url": "https://res.cloudinary.com/…/foto.jpg",
"ordem": 1,
"capa": true,
"comodo": "sala", // classificado por IA; null se não identificado
"area_comum": false // true = área comum do condomínio
}
],
"total_fotos": 12,
"criado_em": "2026-07-22T20:37:49.526Z",
"atualizado_em": "2026-07-30T17:19:09.165Z"
}capa: true) é a foto de capa. Campos sem valor vêm como null; nunca são omitidos.Sincronização incremental
Na primeira carga, busque tudo. Depois, guarde o maior atualizado_em que você recebeu e use-o ematualizado_apos na próxima chamada — assim você traz só o que mudou.
# 1ª vez GET /imoveis?status=ready&limite=100&pagina=1 # nas próximas GET /imoveis?status=ready&atualizado_apos=2026-07-30T17:19:09.165Z
Uma consulta a cada 15 minutos costuma ser suficiente. Se quiser reagir na hora, use o webhook abaixo.
Webhook (opcional)
O cliente pode cadastrar uma URL em Integrações. Quando um imóvel é marcado como Pronto, enviamos um POST para ela — assim o seu sistema reage na hora, sem ficar consultando.
| Cabeçalho | Conteúdo |
|---|---|
X-FotoImob-Event | imovel.pronto |
X-FotoImob-Signature | sha256=… — HMAC do corpo |
User-Agent | FotoImob-Webhook/1 |
Corpo
{
"evento": "imovel.pronto",
"enviado_em": "2026-07-30T18:02:57.244Z",
"imovel": { /* mesmo objeto da API */ }
}Conferindo a assinatura
Assinamos o corpo cru (antes de qualquer parse) com HMAC-SHA256, usando o segredo que aparece na tela de Integrações do cliente. Confira sempre antes de confiar no conteúdo:
import crypto from 'crypto'
function assinaturaValida(corpoCru, cabecalho, segredo) {
const esperado = 'sha256=' + crypto
.createHmac('sha256', segredo)
.update(corpoCru)
.digest('hex')
// comparação em tempo constante evita vazar informação por timing
return crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(cabecalho))
}Responda 2xx rápido. Se o seu endpoint falhar ou demorar mais de 8 segundos, o envio é descartado — então trate o webhook como um aviso, e mantenha a sincronização por atualizado_apos como rede de segurança.
Erros
{ "error": { "code": "invalid_api_key", "message": "Chave de API inválida." } }| HTTP | code | O que houve |
|---|---|---|
| 401 | missing_api_key | Faltou o cabeçalho Authorization. |
| 401 | invalid_api_key | Chave inexistente ou revogada. |
| 400 | invalid_status | status fora dos valores aceitos. |
| 400 | invalid_date | atualizado_apos não é uma data ISO 8601. |
| 404 | not_found | Imóvel não existe nessa organização. |
| 500 | query_failed | Falha do nosso lado. Tente de novo. |
Sobre publicação em portais
Dúvidas
Escreva para contato@fotoimob.com.br com o nome do CRM e o que você precisa. Se o seu sistema não puder consumir esta API, converse com a gente sobre outras formas de integração.