Skip to main content
Seeki.eu

API de Importação para Agências

Envie anúncios para o Seeki via API.

Importe em massa anúncios imobiliários do seu CRM ou sistema de gestão de imóveis. Um endpoint, estado por item, TTL automático.

Obter uma chave de API

O acesso à API de Importação de Agência requer uma subscrição de agência Seeki ativa. Cada subscrição inclui uma chave de API com âmbito limitado à sua conta de agência.

Subscreva na página Para Agentes para começar.

A interface de gestão de chaves (visualizar, rodar, revogar chaves) será disponibilizada numa futura atualização do painel. Por agora, a sua chave de API é enviada por e-mail quando a sua subscrição é ativada. Contacte info@seeki.eu se necessitar de uma nova chave.

Autenticação

Cada pedido deve incluir a sua chave de API como token Bearer no cabeçalho Authorization.

HTTP header
Authorization: Bearer seeki_live_your_key_here

As chaves que começam por seeki_live_ são chaves de produção. As chaves de staging começam por seeki_test_. Não são intercambiáveis entre ambientes.

A sua primeira importação

Envie um pedido POST para /v1/listings com um corpo JSON que contenha um array listings. Cada elemento representa um imóvel.

curl
curl -X POST https://ingest.seeki.eu/v1/listings \
  -H "Authorization: Bearer seeki_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "listings": [
      {
        "external_id": "crm-listing-00123",
        "listing_type": "SELL",
        "real_estate_type": "APARTMENT",
        "price": 320000,
        "currency": "EUR",
        "address": {
          "street": "Wenceslas Square 1",
          "city": "Prague",
          "country_code": "CZ",
          "postal_code": "11000"
        },
        "name": "Sunny 2-bedroom apartment, Wenceslas Square",
        "floorage": 65
      }
    ]
  }'

Um lote bem-sucedido devolve HTTP 200 com arrays accepted e rejected:

200 OK
{
  "accepted": [
    { "external_id": "crm-listing-00123", "import_item_id": "uuid-…" }
  ],
  "rejected": []
}

Estrutura do pedido

O corpo de nível superior é { listings: [...] }. Campos obrigatórios por anúncio:

CampoObrigatório?Notas
external_idObrigatórioYour CRM’s unique ID. Used for idempotent re-imports and deduplication.
listing_typeObrigatórioSELL ou RENT.
real_estate_typeObrigatórioAPARTMENT, HOUSE, LAND, COMMERCIAL ou OTHER.
priceObrigatórioNumérico. Utilize o campo currency para o código ISO 4217 (predefinição: EUR).
address OR coordinatesObrigatórioForneça um objeto address (street, city, country_code) ou coordenadas ({ lat, lng }). Pelo menos um deve estar presente.
currencyOpcionalCódigo ISO 4217, por exemplo, EUR, CZK, PLN. Predefinição: EUR.
name, descriptionOpcionalTítulo do anúncio e descrição em texto livre.
floorage, floor, roomsOpcionalTamanho do imóvel em m², número do piso e número de divisões.
imagesOpcionalArray de URLs de imagens públicas. O worker de importação obtém-nas e coloca-as em cache.
contactOpcionalNome, e-mail e telefone do agente para encaminhamento de consultas.

Consulte o esquema completo com todos os campos opcionais em referência interativa da API.

Estrutura de resposta e erros

O endpoint /v1/listings devolve sempre HTTP 200 OK desde que o próprio pedido esteja bem formado (JSON válido, cabeçalho de autenticação correto, dentro dos limites de tamanho). As falhas de anúncios individuais são reportadas dentro do array rejected — não como códigos de erro HTTP.

Cada item rejeitado inclui external_id, error_code e uma mensagem legível por humanos. Os erros ao nível do lote (autenticação inválida, payload demasiado grande) devolvem um estado HTTP não-200 com um error_code de nível superior.

Códigos de erro

Os códigos ao nível do lote devolvem erros HTTP. Os códigos por item aparecem no array rejected de uma resposta 200.

error_codeHTTP / âmbitoSignificado
MISSING_AUTHORIZATION401Não foi enviado nenhum cabeçalho Authorization.
INVALID_KEY401A chave não foi encontrada, foi revogada ou expirou.
SUBSCRIPTION_INACTIVE403The agency’s subscription is not active or past_due.
PAYLOAD_TOO_LARGE413O corpo do pedido excede o limite de 25 MB.
TOO_MANY_ITEMS413O array listings contém mais de 5.000 itens.
VALIDATION_FAILEDpor itemUm ou mais campos obrigatórios estão em falta ou contêm um valor inválido. Verifique o campo message para mais detalhes.
GEOCODE_ADDRESS_NOT_FOUNDpor itemO endereço fornecido não pôde ser convertido em coordenadas. Verifique street, city e country_code.
GEOCODE_COORDINATES_INVALIDpor itemAs coordenadas lat/lng fornecidas estão fora dos intervalos válidos (lat ±90, lng ±180).
INFRA_QUEUE_REJECTEDpor itemA fila do workflow rejeitou o item, normalmente devido a uma sobrecarga transitória. Tente novamente após uma breve espera.
INFRA_LOSTpor itemO workflow foi aceite, mas o seu resultado nunca foi registado. Utilize o endpoint de repetição.
INTERNAL_ERRORpor itemOcorreu um erro inesperado no servidor. Repetir poderá ser bem-sucedido; contacte o suporte se persistir.

Idempotência / reimportações

Re-posting a listing with the same external_id updates the existing record — it does not create a duplicate. The listing’s TTL is refreshed on every successful import.

Internamente, cada item de importação é mapeado para um Cloudflare Workflow com o ID:

Workflow ID pattern
agency-{agency_id}-{external_id}

Expiração de anúncios

Cada anúncio importado tem um TTL de 60 dias a partir da última importação bem-sucedida. Quando o TTL expira, o anúncio é automaticamente despublicado por um cron job diário.

Para manter um anúncio ativo indefinidamente, reimporte-o (mesmo com dados idênticos) antes do fim da janela de 60 dias. Implementar uma re-sincronização noturna dos seus anúncios ativos é o padrão recomendado.

Estado + nova tentativa

Utilize GET /v1/import-items/{import_item_id}/status para consultar o estado de processamento de um único item. O import_item_id é devolvido no array accepted da resposta POST original.

GET /import-items/{id}/status
curl https://ingest.seeki.eu/v1/import-items/{import_item_id}/status \
  -H "Authorization: Bearer seeki_live_your_key_here"
Response
{
  "import_item_id": "uuid-…",
  "external_id": "crm-listing-00123",
  "status": "completed",
  "listing_id": "uuid-listing"
}

Se um item terminar num estado INFRA_LOST ou INFRA_QUEUE_REJECTED, recoloque-o em fila sem reenviar o lote completo:

POST /import-items/{id}/retry
curl -X POST https://ingest.seeki.eu/v1/import-items/{import_item_id}/retry \
  -H "Authorization: Bearer seeki_live_your_key_here"

Limites

  • Tamanho do corpo: 25 MB máximo por pedido.
  • Itens por pedido: 5000 máximo. Divida lotes maiores.
  • Atualmente não é aplicado qualquer limite de QPS. Picos muito grandes podem ser limitados automaticamente; distribua sincronizações de grande volume por vários pedidos.

Entrar em produção

Existem dois ambientes separados. As chaves de API têm âmbito por ambiente — uma chave de produção não funcionará em staging, e vice-versa.

AmbienteURL base
Staginghttps://ingest.seeki.store/v1
Produçãohttps://ingest.seeki.eu/v1

Todos os endpoints (/listings, /import-items/{id}/status, /import-items/{id}/retry) são idênticos em ambos os ambientes.

Pronto para integrar?

Abra a referência interativa para explorar todos os campos, experimentar pedidos no browser e descarregar o JSON Schema para o seu validador.

Usamos cookies para melhorar a sua experiência no nosso site. Política de Privacidade