Skip to main content
Seeki.eu

Agency Import API

Wysyłaj ogłoszenia do Seeki przez API.

Masowy import ogłoszeń nieruchomości z Twojego CRM lub systemu zarządzania nieruchomościami. Jeden endpoint, status każdej pozycji, automatyczne TTL.

Uzyskaj klucz API

Dostęp do Agency Import API wymaga aktywnej subskrypcji agencji w Seeki. Każda subskrypcja obejmuje jeden klucz API powiązany z kontem agencji.

Zasubskrybuj na stronie dla agentów, aby rozpocząć.

Interfejs zarządzania kluczami (przeglądanie, rotacja, odwoływanie) pojawi się w jednej z kolejnych aktualizacji panelu. Na razie klucz API jest wysyłany e-mailem przy aktywacji subskrypcji. Skontaktuj się z info@seeki.eu, jeśli potrzebujesz nowego klucza.

Uwierzytelnianie

Każde żądanie musi zawierać Twój klucz API jako token Bearer w nagłówku Authorization.

HTTP header
Authorization: Bearer seeki_live_your_key_here

Klucze rozpoczynające się od seeki_live_ to klucze produkcyjne. Klucze stagingowe zaczynają się od seeki_test_. Nie są wymienne pomiędzy środowiskami.

Twój pierwszy import

Wyślij żądanie POST na /v1/listings z treścią JSON zawierającą tablicę listings. Każdy element reprezentuje jedną nieruchomość.

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

Pomyślnie przetworzona partia zwraca HTTP 200 z tablicami accepted i rejected:

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

Struktura żądania

Główny obiekt żądania to { listings: [...] }. Wymagane pola dla każdego ogłoszenia:

PoleWymagane?Uwagi
external_idWymaganeYour CRM’s unique ID. Used for idempotent re-imports and deduplication.
listing_typeWymaganeSELL lub RENT.
real_estate_typeWymaganeAPARTMENT, HOUSE, LAND, COMMERCIAL lub OTHER.
priceWymaganeWartość liczbowa. Użyj pola currency dla kodu ISO 4217 (domyślnie EUR).
address OR coordinatesWymaganePodaj obiekt address (street, city, country_code) lub współrzędne ({ lat, lng }). Co najmniej jedno z tych pól musi być obecne.
currencyOpcjonalneKod ISO 4217, np. EUR, CZK, PLN. Domyślnie EUR.
name, descriptionOpcjonalneTytuł ogłoszenia oraz opis w formie tekstu swobodnego.
floorage, floor, roomsOpcjonalnePowierzchnia nieruchomości w m², numer piętra oraz liczba pokoi.
imagesOpcjonalneTablica publicznych adresów URL do zdjęć. Worker importu pobiera je i buforuje.
contactOpcjonalneImię i nazwisko agenta, e-mail i telefon do kierowania zapytań.

Pełny schemat ze wszystkimi opcjonalnymi polami znajdziesz w interaktywna dokumentacja API.

Struktura odpowiedzi i błędy

Endpoint /v1/listings zawsze zwraca HTTP 200 OK, o ile samo żądanie jest poprawnie sformułowane (poprawny JSON, prawidłowy nagłówek autoryzacji, mieszczący się w limitach rozmiaru). Błędy poszczególnych ogłoszeń są raportowane wewnątrz tablicy rejected — nie jako kody błędów HTTP.

Każdy element w rejected zawiera external_id, error_code i komunikat czytelny dla człowieka. Błędy na poziomie partii (nieprawidłowa autoryzacja, zbyt duża zawartość) zwracają status HTTP inny niż 200 z polem error_code na najwyższym poziomie.

Kody błędów

Kody na poziomie partii zwracają błędy HTTP. Kody pojedynczych pozycji pojawiają się w tablicy rejected w odpowiedzi 200.

error_codeHTTP / zakresZnaczenie
MISSING_AUTHORIZATION401Nie wysłano nagłówka Authorization.
INVALID_KEY401Klucz nie został znaleziony, został odwołany lub wygasł.
SUBSCRIPTION_INACTIVE403The agency’s subscription is not active or past_due.
PAYLOAD_TOO_LARGE413Treść żądania przekracza limit 25 MB.
TOO_MANY_ITEMS413Tablica listings zawiera ponad 5 000 elementów.
VALIDATION_FAILEDdla elementuCo najmniej jedno pole wymagane jest brakujące lub ma nieprawidłową wartość. Szczegóły znajdziesz w polu message.
GEOCODE_ADDRESS_NOT_FOUNDdla elementuPodanego adresu nie udało się przekształcić na współrzędne. Zweryfikuj street, city i country_code.
GEOCODE_COORDINATES_INVALIDdla elementuPodane lat/lng wykraczają poza prawidłowe zakresy (lat ±90, lng ±180).
INFRA_QUEUE_REJECTEDdla elementuKolejka workflow odrzuciła pozycję, zwykle z powodu chwilowego przeciążenia. Spróbuj ponownie po krótkiej chwili.
INFRA_LOSTdla elementuWorkflow został przyjęty, ale jego wynik nigdy nie został zarejestrowany. Użyj endpointu retry.
INTERNAL_ERRORdla elementuWystąpił nieoczekiwany błąd serwera. Ponowienie może się powieść; jeśli problem się utrzymuje, skontaktuj się z pomocą techniczną.

Idempotentność / ponowny import

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.

Wewnętrznie każda pozycja importu jest mapowana na Cloudflare Workflow z ID:

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

Wygaśnięcie ogłoszenia

Każde zaimportowane ogłoszenie ma TTL wynoszące 60 dni od ostatniego udanego importu. Po wygaśnięciu TTL ogłoszenie jest automatycznie wycofywane z publikacji przez codzienne zadanie cron.

Aby utrzymać ogłoszenie aktywne bezterminowo, importuj je ponownie (nawet z identycznymi danymi) przed upływem 60-dniowego okna. Zalecanym wzorcem jest wdrożenie nocnej resynchronizacji aktywnych ogłoszeń.

Status i ponawianie

Użyj GET /v1/import-items/{import_item_id}/status, aby odpytać stan przetwarzania pojedynczej pozycji. Identyfikator import_item_id jest zwracany w tablicy accepted oryginalnej odpowiedzi POST.

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

Jeśli pozycja zakończy się stanem INFRA_LOST lub INFRA_QUEUE_REJECTED, ponownie umieść ją w kolejce bez wysyłania całej partii:

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"

Limity

  • Rozmiar treści: maksymalnie 25 MB na żądanie.
  • Liczba elementów na żądanie: maksymalnie 5 000. Dziel większe partie.
  • Obecnie nie obowiązuje limit QPS. Bardzo duże skoki ruchu mogą zostać automatycznie ograniczone; rozłóż synchronizacje o dużej objętości na wiele żądań.

Wdrożenie produkcyjne

Istnieją dwa odrębne środowiska. Klucze API są przypisane do środowiska — klucz produkcyjny nie zadziała w środowisku stagingowym i odwrotnie.

ŚrodowiskoBazowy URL
Staginghttps://ingest.seeki.store/v1
Produkcjahttps://ingest.seeki.eu/v1

Wszystkie endpointy (/listings, /import-items/{id}/status, /import-items/{id}/retry) są identyczne w obu środowiskach.

Gotowi do integracji?

Otwórz interaktywną dokumentację, aby przejrzeć wszystkie pola, wypróbować żądania w przeglądarce i pobrać JSON Schema dla swojego walidatora.

Używamy plików cookie, aby poprawić Twoje doświadczenia na naszej stronie. Polityka Prywatności