Kwadrat PL Telegram
Telegram bot for renting in Poland

Let your home in Poland find you

Kwadrat PL gathers fresh listings from OLX, Otodom and Morizon into one Telegram bot. Subscribe to a search and new flats and rooms land right in your chat, before everyone else.

Open the bot in Telegram No sign-up · 5 languages · inside Telegram
FreeListings direct, no agenciesRefreshed ~5 minAI breakdown + anti-scam

Why Kwadrat PL

Search 3 portals at once

Flats, rooms and short stays from OLX, Otodom and Morizon. The same listing across sites is merged — no duplicates in your feed.

Instant alerts

Subscribe to your search and matching homes reach your chat within minutes. Quiet hours at night and pause with /off.

Fair price & anti-scam

A below/above district-market badge from our own data, plus a warning on suspiciously cheap listings — a classic scam bait.

AI listing breakdown

One button: translate the listing into your language, summarise the essentials and score the scam risk from the text.

Move-in calculator

How much cash you need upfront: rent, czynsz, utilities, deposit and agent fee — all counted at once, no surprises.

Renter guides

How to get your deposit back (with a ready demand letter), contract red flags, a viewing checklist and ready Polish messages to the owner.

How it works

  1. 1

    Open the bot

    Tap the button and launch Kwadrat PL in Telegram — the app opens right inside your chat.

  2. 2

    Set up a search

    Pick a city, rental type, price and filters. Results update instantly.

  3. 3

    Get new ones first

    Subscribe and fresh listings arrive in your chat before others snap them up.

How it looks

Search, fair-price check and the full move-in cost — all inside Telegram.

Kwadrat PL home screen: searching rentals across 8 cities in Poland
List of flats for rent with photo, price and a below-market badge
Listing card: move-in cost — rent and deposit — and the source

iPhone home-screen widget

How many matching flats and the latest prices — right on your screen, without opening Telegram. Via the free Scriptable app, no App Store payments and no developer account.

Kwadrat PL widget on an iPhone home screen: number of matching flats and rental prices

How to install

  1. Install the free Scriptable app from the App Store.
  2. Message our bot the /widget command — it sends your personal token.
  3. In Scriptable tap “+”, clear the contents and paste the widget code (button below).
  4. Put your token on the TOKEN line, replacing PASTE_TOKEN_HERE.
  5. Tap ▶ at the bottom — a widget preview appears.
  6. On the home screen: long-press → “+” → Scriptable → pick a size → add. Then long-press the widget → “Edit Widget” → in the Script field choose this script.
Show widget code
// ===========================================================================
// Kwadrat PL — виджет для Scriptable (iOS). Настоящий виджет на домашнем экране
// без App Store и Apple Developer. Данные берёт с нашего сервера по личному
// виджет-токену (команда /widget в @KwadratPLBot).
//
// Установка:
//   1. Поставьте бесплатное приложение Scriptable из App Store.
//   2. Новый скрипт → вставьте весь этот файл.
//   3. Впишите свой токен в TOKEN ниже (получить: /widget в боте).
//   4. Домашний экран → виджет Scriptable (small или medium) → этот скрипт.
// Поддерживает small, medium и экран блокировки. Тап открывает Mini App.
// Примечание: код намеренно без логического "или" — некоторые iOS-вставки в
// Scriptable теряют этот символ и ломают строку с config.widgetFamily.
// ===========================================================================

const TOKEN = "PASTE_TOKEN_HERE";
const STATE_URL = "https://kwadratpl-46-224-220-94.sslip.io/api/widget/state";

// ── брендовые цвета ──
const BG = new Color("#17212b");
const ACCENT = new Color("#3aaee0");
const WHITE = new Color("#e7edf3");
const MUTED = new Color("#93a4b4");

function zl(n) {
  if (!n && n !== 0) return "";
  return String(n).replace(/\B(?=(\d{3})+(?!\d))/g, " ") + " zł";
}

async function fetchState() {
  const req = new Request(STATE_URL);
  req.headers = { Authorization: "Bearer " + TOKEN };
  req.timeoutInterval = 12;
  return await req.loadJSON();
}

function header(w, s) {
  const row = w.addStack();
  row.centerAlignContent();
  const t = row.addText("KWADRAT");
  t.textColor = ACCENT;
  t.font = Font.heavySystemFont(13);
  row.addSpacer();
  const c = row.addText(String(s.matchingListings));
  c.textColor = WHITE;
  c.font = Font.heavySystemFont(17);
}

function build(s) {
  const w = new ListWidget();
  w.backgroundColor = BG;
  w.setPadding(14, 14, 14, 14);
  const fam = config.widgetFamily ? config.widgetFamily : "medium";

  if (!s) {
    const t = w.addText("KWADRAT");
    t.textColor = ACCENT; t.font = Font.heavySystemFont(14);
    w.addSpacer(6);
    const e = w.addText("Нет связи или токен неверный. Обновите /widget в боте.");
    e.textColor = MUTED; e.font = Font.systemFont(11);
    e.lineLimit = 3;
    return w;
  }

  header(w, s);
  w.addSpacer(2);
  const sub = w.addText("подходящих · " + s.newMatching + " новых за сутки");
  sub.textColor = MUTED; sub.font = Font.systemFont(10);

  if (fam !== "small") {
    w.addSpacer(9);
    const all = s.topListings ? s.topListings : [];
    const list = all.slice(0, fam === "large" ? 6 : 3);
    if (list.length === 0) {
      const e = w.addText("Нет подходящих объявлений. Настройте подписку в боте.");
      e.textColor = MUTED; e.font = Font.systemFont(11); e.lineLimit = 2;
    }
    list.forEach(function (l) {
      const row = w.addStack();
      row.centerAlignContent();
      const p = row.addText(zl(l.price));
      p.textColor = WHITE; p.font = Font.mediumSystemFont(12);
      row.addSpacer();
      const place = l.district ? l.district : (l.city ? l.city : "");
      const d = row.addText(place);
      d.textColor = MUTED; d.font = Font.systemFont(12);
      w.addSpacer(4);
    });
  }

  w.addSpacer();
  const ts = s.lastUpdatedAt ? s.lastUpdatedAt : "";
  const upd = ts.replace("T", " ").slice(11, 16);
  const foot = w.addText(upd ? "обновлено " + upd : "Kwadrat PL");
  foot.textColor = MUTED; foot.font = Font.systemFont(9);

  let tapUrl = "https://t.me/KwadratPLBot";
  if (s.botUrl) tapUrl = s.botUrl;
  if (s.openUrl) tapUrl = s.openUrl;
  w.url = tapUrl;
  w.refreshAfterDate = new Date(Date.now() + 15 * 60 * 1000);
  return w;
}

let state = null;
try { state = await fetchState(); } catch (e) { state = null; }
const widget = build(state);

if (config.runsInWidget) {
  Script.setWidget(widget);
} else {
  await widget.presentMedium();
}
Script.complete();

How to use it

  • Tapping the widget opens the app.
  • The widget refreshes on iOS's schedule (roughly every 15–30 minutes) — a limit of all widgets, not just ours.
  • Fresh flats still arrive instantly as a normal bot notification.

Cities in Poland

Flats and rooms for rent in 8 cities across Poland:

WarsawKrakówWrocławGdańskPoznańŁódźZakopaneBiałystok

FAQ

Is it free?
Yes, fully. Search, alerts, guides and the calculator — no fees and no sign-up.
Where do listings come from?
We gather public listings from OLX, Otodom and Morizon and refresh them every few minutes. The same offer across sites is merged.
What is the AI breakdown?
A button on each listing: it translates the text into your language, writes a short summary and scores the scam risk from the description.
Which languages are supported?
English, Polish, Ukrainian, Belarusian and Russian. You switch the language right inside the app.
How do I know the price is fair?
The bot computes the median price per m² by district and home type from its own data and shows how far a listing sits below or above the market.
Do I need to install an app?
No. Kwadrat PL runs inside Telegram as a Mini App — nothing to install.
Is there an iPhone widget?
Yes. Via the free Scriptable app you can add a home-screen widget showing the number of matching flats and the latest prices — no App Store payments. Step-by-step guide above.

May your home find you!

Open Kwadrat PL and subscribe to your search — the right place will come to you.

Open the bot in Telegram