Skip to main content
Seeki.eu

Agency Import API

Inserate per API in Seeki übertragen.

Importieren Sie Immobilien-Inserate aus Ihrem CRM oder Ihrer Immobilienverwaltung in großen Mengen. Ein Endpunkt, Status pro Eintrag, automatische TTL.

API-Schlüssel erhalten

Der Zugriff auf die Agency Import API erfordert ein aktives Seeki-Agentur-Abonnement. Jedes Abonnement enthält einen API-Schlüssel, der auf Ihr Agenturkonto beschränkt ist.

Abonnieren Sie auf der Seite Für Agenturen, um zu starten.

Eine Oberfläche zur Schlüsselverwaltung (Anzeigen, Rotieren, Widerrufen) folgt in einem zukünftigen Dashboard-Update. Vorerst wird Ihr API-Schlüssel per E-Mail zugesandt, sobald Ihr Abonnement aktiviert ist. Kontaktieren Sie info@seeki.eu, falls Sie einen neuen Schlüssel benötigen.

Authentifizierung

Jede Anfrage muss Ihren API-Schlüssel als Bearer-Token im Authorization-Header enthalten.

HTTP header
Authorization: Bearer seeki_live_your_key_here

Schlüssel, die mit seeki_live_ beginnen, sind Produktivschlüssel. Staging-Schlüssel beginnen mit seeki_test_. Sie sind zwischen den Umgebungen nicht austauschbar.

Ihr erster Import

Senden Sie eine POST-Anfrage an /v1/listings mit einem JSON-Body, der ein listings-Array enthält. Jedes Element entspricht einer Immobilie.

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
      }
    ]
  }'

Ein erfolgreicher Batch liefert HTTP 200 mit den Arrays accepted und rejected zurück:

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

Anfrage-Struktur

Der Top-Level-Body lautet { listings: [...] }. Pflichtfelder pro Inserat:

FeldErforderlich?Hinweise
external_idErforderlichYour CRM’s unique ID. Used for idempotent re-imports and deduplication.
listing_typeErforderlichSELL oder RENT.
real_estate_typeErforderlichAPARTMENT, HOUSE, LAND, COMMERCIAL oder OTHER.
priceErforderlichNumerisch. Verwenden Sie das Feld currency für den ISO-4217-Code (Standard: EUR).
address OR coordinatesErforderlichGeben Sie entweder ein address-Objekt (street, city, country_code) oder Koordinaten ({ lat, lng }) an. Mindestens eines davon muss vorhanden sein.
currencyOptionalISO-4217-Code, z. B. EUR, CZK, PLN. Standard: EUR.
name, descriptionOptionalInserattitel und Freitext-Beschreibung.
floorage, floor, roomsOptionalWohnfläche in m², Etage und Anzahl der Zimmer.
imagesOptionalArray öffentlicher Bild-URLs. Der Import-Worker lädt sie herunter und cached sie.
contactOptionalName, E-Mail und Telefonnummer des Maklers für die Anfrageweiterleitung.

Das vollständige Schema mit allen optionalen Feldern finden Sie in der interaktive API-Referenz.

Antwort-Struktur & Fehler

Der Endpunkt /v1/listings liefert immer HTTP 200 OK zurück, solange die Anfrage selbst korrekt ist (gültiges JSON, korrekter Auth-Header, innerhalb der Größenbeschränkungen). Fehler einzelner Inserate werden im Array rejected gemeldet — nicht als HTTP-Fehlercodes.

Jeder abgelehnte Eintrag enthält external_id, error_code und eine lesbare Nachricht. Batch-Level-Fehler (fehlerhafte Authentifizierung, zu großer Payload) liefern einen HTTP-Status ungleich 200 mit einem error_code auf oberster Ebene.

Fehlercodes

Batch-Level-Codes liefern HTTP-Fehler. Codes pro Eintrag erscheinen im Array rejected einer 200-Antwort.

error_codeHTTP / GeltungsbereichBedeutung
MISSING_AUTHORIZATION401Es wurde kein Authorization-Header gesendet.
INVALID_KEY401Der Schlüssel wurde nicht gefunden, wurde widerrufen oder ist abgelaufen.
SUBSCRIPTION_INACTIVE403The agency’s subscription is not active or past_due.
PAYLOAD_TOO_LARGE413Der Request-Body überschreitet das Limit von 25 MB.
TOO_MANY_ITEMS413Das listings-Array enthält mehr als 5.000 Einträge.
VALIDATION_FAILEDpro EintragEin oder mehrere Pflichtfelder fehlen oder enthalten einen ungültigen Wert. Details finden Sie im message-Feld.
GEOCODE_ADDRESS_NOT_FOUNDpro EintragDie angegebene Adresse konnte nicht in Koordinaten aufgelöst werden. Prüfen Sie street, city und country_code.
GEOCODE_COORDINATES_INVALIDpro EintragDie angegebenen lat/lng-Werte liegen außerhalb des gültigen Bereichs (lat ±90, lng ±180).
INFRA_QUEUE_REJECTEDpro EintragDie Workflow-Queue hat den Eintrag abgelehnt, meist aufgrund einer kurzfristigen Überlastung. Versuchen Sie es nach kurzer Verzögerung erneut.
INFRA_LOSTpro EintragDer Workflow wurde angenommen, aber sein Ergebnis wurde nie erfasst. Verwenden Sie den Retry-Endpunkt.
INTERNAL_ERRORpro EintragEin unerwarteter Serverfehler ist aufgetreten. Ein erneuter Versuch kann erfolgreich sein; kontaktieren Sie den Support, falls der Fehler bestehen bleibt.

Idempotenz / erneute Importe

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.

Intern wird jeder Import-Eintrag auf einen Cloudflare-Workflow mit folgender ID abgebildet:

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

Ablauf von Inseraten

Jedes importierte Inserat hat eine TTL von 60 Tagen ab dem letzten erfolgreichen Import. Nach Ablauf der TTL wird das Inserat von einem täglichen Cron-Job automatisch depubliziert.

Um ein Inserat dauerhaft online zu halten, importieren Sie es vor Ablauf des 60-Tage-Fensters erneut (auch mit identischen Daten). Eine nächtliche Re-Synchronisation Ihrer aktiven Inserate ist das empfohlene Vorgehen.

Status + Wiederholung

Verwenden Sie GET /v1/import-items/{import_item_id}/status, um den Verarbeitungsstatus eines einzelnen Eintrags abzufragen. Die import_item_id wird im Array accepted der ursprünglichen POST-Antwort zurückgegeben.

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"
}

Falls ein Eintrag im Status INFRA_LOST oder INFRA_QUEUE_REJECTED endet, stellen Sie ihn erneut in die Queue, ohne den gesamten Batch erneut zu senden:

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"

Limits

  • Body-Größe: maximal 25 MB pro Anfrage.
  • Einträge pro Anfrage: maximal 5.000. Teilen Sie größere Batches auf.
  • Aktuell wird kein QPS-Limit erzwungen. Sehr große Bursts können automatisch gedrosselt werden; verteilen Sie hochvolumige Synchronisationen über mehrere Anfragen.

Live gehen

Es gibt zwei getrennte Umgebungen. API-Schlüssel sind umgebungsspezifisch — ein Produktivschlüssel funktioniert nicht in Staging und umgekehrt.

UmgebungBasis-URL
Staginghttps://ingest.seeki.store/v1
Produktionhttps://ingest.seeki.eu/v1

Alle Endpunkte (/listings, /import-items/{id}/status, /import-items/{id}/retry) sind in beiden Umgebungen identisch.

Bereit zu integrieren?

Öffnen Sie die interaktive Referenz, um alle Felder zu erkunden, Anfragen direkt im Browser zu testen und das JSON Schema für Ihren Validator herunterzuladen.

Wir verwenden Cookies, um Ihre Erfahrung auf unserer Website zu verbessern. Datenschutzerklärung