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ąć.
Uwierzytelnianie
Każde żądanie musi zawierać Twój klucz API jako token Bearer w nagłówku Authorization.
Authorization: Bearer seeki_live_your_key_hereKlucze 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 -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:
{
"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:
| Pole | Wymagane? | Uwagi |
|---|---|---|
| external_id | Wymagane | Your CRM’s unique ID. Used for idempotent re-imports and deduplication. |
| listing_type | Wymagane | SELL lub RENT. |
| real_estate_type | Wymagane | APARTMENT, HOUSE, LAND, COMMERCIAL lub OTHER. |
| price | Wymagane | Wartość liczbowa. Użyj pola currency dla kodu ISO 4217 (domyślnie EUR). |
| address OR coordinates | Wymagane | Podaj obiekt address (street, city, country_code) lub współrzędne ({ lat, lng }). Co najmniej jedno z tych pól musi być obecne. |
| currency | Opcjonalne | Kod ISO 4217, np. EUR, CZK, PLN. Domyślnie EUR. |
| name, description | Opcjonalne | Tytuł ogłoszenia oraz opis w formie tekstu swobodnego. |
| floorage, floor, rooms | Opcjonalne | Powierzchnia nieruchomości w m², numer piętra oraz liczba pokoi. |
| images | Opcjonalne | Tablica publicznych adresów URL do zdjęć. Worker importu pobiera je i buforuje. |
| contact | Opcjonalne | Imię 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_code | HTTP / zakres | Znaczenie |
|---|---|---|
| MISSING_AUTHORIZATION | 401 | Nie wysłano nagłówka Authorization. |
| INVALID_KEY | 401 | Klucz nie został znaleziony, został odwołany lub wygasł. |
| SUBSCRIPTION_INACTIVE | 403 | The agency’s subscription is not active or past_due. |
| PAYLOAD_TOO_LARGE | 413 | Treść żądania przekracza limit 25 MB. |
| TOO_MANY_ITEMS | 413 | Tablica listings zawiera ponad 5 000 elementów. |
| VALIDATION_FAILED | dla elementu | Co najmniej jedno pole wymagane jest brakujące lub ma nieprawidłową wartość. Szczegóły znajdziesz w polu message. |
| GEOCODE_ADDRESS_NOT_FOUND | dla elementu | Podanego adresu nie udało się przekształcić na współrzędne. Zweryfikuj street, city i country_code. |
| GEOCODE_COORDINATES_INVALID | dla elementu | Podane lat/lng wykraczają poza prawidłowe zakresy (lat ±90, lng ±180). |
| INFRA_QUEUE_REJECTED | dla elementu | Kolejka workflow odrzuciła pozycję, zwykle z powodu chwilowego przeciążenia. Spróbuj ponownie po krótkiej chwili. |
| INFRA_LOST | dla elementu | Workflow został przyjęty, ale jego wynik nigdy nie został zarejestrowany. Użyj endpointu retry. |
| INTERNAL_ERROR | dla elementu | Wystą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:
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.
curl https://ingest.seeki.eu/v1/import-items/{import_item_id}/status \
-H "Authorization: Bearer seeki_live_your_key_here"{
"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:
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.
| Środowisko | Bazowy URL |
|---|---|
| Staging | https://ingest.seeki.store/v1 |
| Produkcja | https://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.