# Wohnungssuche-Werkzeuge (d-solve.de) > Persönliche Bewerbungsseite für die Wohnungs- oder WG-Suche, dazu ein Aushang zum Ausdrucken und die Mieter-Selbstauskunft mit Unterlagen. Alle teilen sich dieselben Link-Parameter; standardmäßig steckt die ganze Seite im Link, wahlweise wird sie online gespeichert und bekommt einen Kurzlink (API oder MCP-Server). Diese Datei ist die vollständige Anleitung für einen KI-Assistenten, der die Seite gemeinsam mit einem Nutzer baut. Mehr muss vorher nicht gelesen werden. (English summary: the German flat-search toolkit of d-solve.de; this file is the complete instruction for AI assistants, parameters and API are below.) Betreiber: dSolve (Felix Paul), https://d-solve.de. Rechtliches: https://d-solve.de/impressum/ (Impressum), https://d-solve.de/datenschutz/ (Datenschutz). Alles ist kostenlos. ## Adressen - Bewerbungsseite: https://d-solve.de/projects/apartment-search/? (für alle gleich, alle Inhalte im Query-String) - Aushang zum Ausdrucken: https://d-solve.de/projects/apartment-search/aushang/? - Mietunterlagen mit Selbstauskunft: https://d-solve.de/projects/apartment-search/mietunterlagen/?# - Ratgeber über alle Schritte bis zum Einzug: https://d-solve.de/projects/apartment-search/ratgeber/ - Baukasten für Menschen (Vorschau, QR-Code, „Online speichern“): https://d-solve.de/projects/apartment-search/customize/ - Vollständiges Beispiel (die Bremer Stadtmusikanten): https://d-solve.de/projects/apartment-search/demo/ - Dokumentation für Menschen: Aufbau, jeder Parameter mit Beispiel-Link, selbst hosten, Rechtliches: https://d-solve.de/projects/apartment-search/docs/ - API-Dokumentation für Menschen: Endpunkte, Grenzen, curl-Ablauf, Fehler, Konto: https://d-solve.de/projects/apartment-search/api/ - API-Basis: https://d-solve.de/apartment-search/api · OpenAPI 3: https://d-solve.de/apartment-search/api/openapi.json · aktuelle Grenzen: https://d-solve.de/apartment-search/api/limits - MCP-Server (Streamable HTTP, ohne Login): https://d-solve.de/apartment-search/mcp - Kurzlinks sehen so aus: https://d-solve.de/apartment-search/ (dazu //aushang/ und //mietunterlagen/); hochgeladene Fotos: https://d-solve.de/apartment-search/img/ ## So arbeitest du mit dem Nutzer 1. Alles, was du schon über den Nutzer weißt, arbeitest du direkt ein. Setze zunächst öffentliche Platzhalter-Fotos ein, um schnell zu einem guten Ergebnis zu kommen; suche sie selbst. 2. Frage nur nach dem, was fehlt, wenige Dinge auf einmal, kurz. Zuerst: Stadt, wer sucht (Personen, Kinder, Haustiere), welche Sprachen die Seite haben soll. 3. Dann Eckdaten: Zimmer, Fläche, Warmmiete, Einzug, Mietdauer, Berufe/Einkommen, Rauchen, Haustiere. 4. Dann Wünsche, Wunsch-Stadtteile, vorhandene Unterlagen, Kontaktdaten und ob eigene Fotos da sind. Frag aktiv nach privaten Fotos; sie erhöhen die Erfolgschancen. 5. Fülle `headline`, `subline` und den Vorstellungstext `intro`: freundlich, konkret, ehrlich, ohne Übertreibung. Bei mehreren Sprachen übersetze alle Texte und setze sie mit Suffix. 6. Gib bei jedem Zwischenschritt den aktuellen Link, damit der Nutzer ihn sofort öffnen und testen kann. Zeige die finale Version mit einem kurzen Überblick über die Entscheidungen, frag nach Änderungen und verweise auf den Baukasten für manuelle Änderungen. 7. Frag am Ende einmal: langer Link ohne Speicherung (Standard) oder Kurzlink mit Speicherung auf einem Server von d-solve.de? Lege nie ungefragt etwas online an. 8. Sprich mit dem Nutzer in der Sprache, in der er schreibt. ## Aufbau der Seite Abschnitte: hero (Kopfbereich mit Foto, Überschrift, Merkmalen, Buttons), about (Kacheln für Personen, Kinder, Haustiere), intro (Vorstellungstext), facts (Daten & Fakten), wishes (Must-haves und Nice-to-haves), location (Wunschlage), documents (Unterlagen), contact (E-Mail und Telefon). Die Fußzeile nennt d-solve.de und verlinkt Impressum und Datenschutz (über `imprint` und `privacy` änderbar). ## Regeln für Werte - Jeder Parameter ist optional. Fehlt er, steht dort ein eingebauter Beispieltext. Deshalb alles setzen, was den Nutzer betrifft, und unpassende Abschnitte über `sections` weglassen. - Ein einzelner Bindestrich `-` blendet ein Feld aus (z. B. btnshare=- oder phone=-). - Mehrsprachig: Texte bekommen ein Sprachsuffix, z. B. `headline.de` und `headline.en`. Ein Wert ohne Suffix gilt für alle Sprachen. Bei nur einer Sprache (langs=de) das Suffix weglassen. - Liste: Einträge mit Semikolon trennen: "3 Zimmer; Balkon; bis 1.200 € warm". - Paare: "Links | Rechts", mehrere mit Semikolon: "Einzug | ab 1. März; Zimmer | 3". Getrennt wird am ersten |. - Freitext (nur `intro`): \n oder Zeilenumbruch für neue Zeilen, eine Zeile mit "- " am Anfang wird Aufzählungspunkt, *Text* wird kursiv. ## Alle Parameter Referenz mit einem funktionierenden Beispiel-Link je Parameter: https://d-solve.de/projects/apartment-search/docs/#parameter Sprachunabhängig: - `langs`: Sprachen, kommagetrennt (Standard de,en). `lang`: zuerst gezeigte Sprache. - `email`, `phone`: Kontakt. `photo`: großes Foto oben (Bild-Link). `logo`: ein Emoji oben links (Standard 🏡). `accent`: Akzentfarbe als Hex, z. B. #2f7a4d. - `sections`: Reihenfolge und Auswahl der Abschnitte, z. B. hero,intro,about,facts,wishes,contact. - `people`: Anzahl der Kacheln. `pcols`: Spalten im Kachelraster (1–6). - `imprint`, `privacy`: Ziele der Impressum- und Datenschutz-Links in der Fußzeile. - `p1emoji`, `p2emoji`, …: Emoji der Kachel, wenn es kein Foto gibt. `p1photo`, …: ein oder mehrere Bild-Links, mit | getrennt (mehrere ergeben eine Galerie). Je Sprache (mit Suffix .de, .en, …): - Kopfzeile: `brand` (Text oben links), `navcontact` (Button oben rechts), `title` (Browser-Tab), `desc` (Kurzbeschreibung), `skip` (Sprunglink). - Kopfbereich: `loc` (Stadt), `names` (Namen im Streifen über dem Foto), `headline`, `subline`, `badges` (Liste), `btncontact`, `btnshare`, `btnshared` (Text nach dem Kopieren), `btns` (Paare "Beschriftung | Link", z. B. zur eigenen Anzeige). - Kacheln: `abouthead`, `p1name`, `p1role`, `p1facts` (Paare "Emoji | Text"), ebenso p2…, p3… - Vorstellung: `introhead` (Standard "Hallo,"), `intro` (Freitext). - Fakten: `factshead`, `facts` (Paare "Bezeichnung | Wert"). - Wünsche: `wisheshead`, `musthead`, `must` (Liste), `nicehead`, `nice` (Liste). - Lage: `lochead`, `locintro`, `districts` (Liste), `locnote`. - Unterlagen: `dochead`, `docintro`, `docs` (Liste). - Kontakt: `contacthead`, `contactintro`, `maillabel`, `phonelabel`. - Fußzeile: `foot`, `imprintlabel`, `privacylabel`, `producedby`. Wichtig: Sobald irgendein p-Parameter gesetzt ist, verschwindet die eingebaute Beispielfamilie komplett. Setze dann `people` auf die Zahl der Kacheln. ## Aushang Derselbe Link ergibt einen Aushang zum Ausdrucken (A4, Foto, zwei kurze Listen, QR-Code zur Seite, Abreißzettel mit Telefon und E-Mail): am Anfang https://d-solve.de/projects/apartment-search/ durch https://d-solve.de/projects/apartment-search/aushang/ ersetzen, Parameter gleich lassen. Dort gibt es „Drucken / als PDF speichern“ und einen Word-Download. Ohne eigene Werte leitet der Aushang die Listen aus `names`, den Kachel-Rollen, `facts` und `districts` ab. Für einen guten Aushang knapp selbst setzen (je 3–6 kurze Punkte, Sprachsuffix wie oben): - `posterhead` (Standard "Wir suchen eine Wohnung"), `posterabouthead` ("Über uns:"), `posterabout` (Liste), `posterwishhead` ("Unsere Wunschwohnung:"), `posterwish` (Liste), `postermore` ("Mehr Infos"). - `posterlink`: wohin der QR-Code führt; Standard ist die Bewerbungsseite. Lange Links (über rund 2 900 Zeichen) passen in keinen QR-Code; dann einen Kurzlink nehmen (dessen Aushang /aushang/ trägt den Kurzlink im QR-Code) oder den Code mit posterqr=- ausblenden. - `posterstrips`: Zahl der Abreißzettel (0–10, Standard 8). `posterphoto`: eigenes Foto, - blendet es aus. ## Mietunterlagen (Selbstauskunft) Unter https://d-solve.de/projects/apartment-search/mietunterlagen/? entsteht die Mieter-Selbstauskunft mit allen Unterlagen als ein PDF, dazu Word-Vorlagen (Mietunterlagen, Selbstauskunft, Vorvermieterbescheinigung, Übergabeprotokoll). Die Angaben dazu stehen hinter einem # und werden nie an einen Server geschickt (auch nicht beim Kurzlink): …/mietunterlagen/?#. - `mieter`: Zahl der Personen, die den Mietvertrag unterschreiben (nur Erwachsene; Kinder und Haustiere gehören in haushalt und tiere). - `m1name` ("Nachname, Vorname"), `m1birth`, `m1address`, `m1phone`, `m1email`, `m1job` (Beruf, Arbeitgeber), `m1income` (netto pro Monat), `m1landlord` (derzeitige:r Vermieter:in); ebenso m2…, m3… - `m1q`: Antworten auf Pfändung, Vermögensauskunft, Insolvenz, Räumungsklage, z. B. nein,nein,nein,nein (Standard). - `m1docs`: Unterlagen, z. B. ausweis,gehalt,schufa,vorvermieter (Standard) oder weitere. - `haushalt`: "Name | Geburtsdatum | Verhältnis; …", `tiere`: "Art | Rasse, Alter; …", jeweils - für keine. `ort`, `datum` (JJJJ-MM-TT), `gehalt` (Bezeichnung der Gehaltsnachweise). Frag nach diesen Angaben nur, wenn der Nutzer Mietunterlagen möchte, und sag, dass Geburtsdatum und Einkommen auch erst auf der Seite selbst eingetragen werden können. Ausweis, Gehaltsnachweise, SCHUFA und Vorvermieterbescheinigung lädt der Nutzer selbst auf der Seite hoch; bitte nie darum, sie dir zu schicken. Den Mietunterlagen-Link nicht teilen lassen: Er enthält persönliche Daten. ## Fotos Ein Bild-Link muss mit https:// beginnen, direkt auf die Bilddatei zeigen und ohne Anmeldung funktionieren (Test: im privaten Fenster öffnen, nur das nackte Bild darf erscheinen). Gute Quellen: Google Drive mit Freigabe „Jeder, der über den Link verfügt“, dann aus drive.google.com/file/d/DATEI_ID/view den Link https://drive.google.com/thumbnail?id=DATEI_ID&sz=w1000 machen; Imgur (i.imgur.com/…); die eigene Website; Wikimedia Commons für Platzhalter. Google Fotos und iCloud-Freigaben funktionieren nie. Nutze nur Bild-Links, die du tatsächlich gefunden und geprüft hast; erfinde nie einen. Ohne Fotos zeigen die Kacheln Emojis. Nur bei einer online gespeicherten Seite lassen sich Fotos auch hochladen; im Link-Modus gibt es ausschließlich Bild-Links. ## Der lange Link (Standard) - Beginne mit genau https://d-solve.de/projects/apartment-search/ und hänge die Parameter als Query-String an. - Kodiere jeden Wert wie encodeURIComponent: Leerzeichen %20, & %26, = %3D, ? %3F, # %23, ; %3B, | %7C, + %2B, Zeilenumbruch %0A, Umlaute und Emoji als UTF-8-Escapes. Auch Bild-Links sind Werte und werden komplett kodiert. Wenn du Code ausführen kannst, bau den Link mit Code. - Lass Parameter weg, die beim Standard bleiben, damit der Link kurz bleibt. Nie Bilder als data:-Adresse einbetten. - Es gibt keinen Server, keine Datenbank, kein Konto; nichts wird gespeichert, nichts läuft ab. Dafür ist alles im Link lesbar: Wer den Link hat, sieht auch E-Mail und Telefonnummer. Suchmaschinen erfassen persönliche Links nicht. ## Der Kurzlink (optional, erst nach dem Ja des Nutzers) Dieselben Parameter liegen als JSON auf einem Server von d-solve.de (Cloudflare, D1 und R2), die Seite bekommt einen Kurzlink, Fotos lassen sich hochladen, der QR-Code passt, die Seite ist später änderbar und wird nach einer Speicherfrist automatisch samt Fotos gelöscht (ohne Konto 7, 30 oder 90 Tage; Standard 30; aktuelle Optionen in `retention.options` von GET /limits). Wer den Link hat, sieht die Seite. Nenne dem Nutzer die Frist und das Löschdatum. Zwei Wege, eine Implementierung. Mit MCP-Client den MCP-Server nutzen; mit HTTP-Zugriff die API; ohne beides dem Nutzer den fertigen `curl`-Befehl oder den langen Link geben. ### MCP https://d-solve.de/apartment-search/mcp als Remote-MCP-Server hinzufügen (Streamable HTTP, JSON-RPC 2.0, ohne Anmeldung, zustandslos). Werkzeuge, je eines pro API-Aufruf: `apartment_limits`, `apartment_create` {data, retentionDays}, `apartment_get` {id}, `apartment_update` {id, editKey, data?, retentionDays?}, `apartment_delete` {id, editKey}, `apartment_add_image` {id, editKey, url}, `apartment_delete_image` {id, editKey, imageId}, `apartment_rotate_key` {id, editKey}. `data` ist das flache Parameter-Objekt von oben, unkodiert. Ergebnisse sind JSON (auch als structuredContent); Fehler tragen `status`, `error` und manchmal `code`. ### API Basis https://d-solve.de/apartment-search/api, JSON rein und raus, `Authorization: Bearer ` zum Schreiben, CORS offen, kein Botschutz. Vollständige Referenz: https://d-solve.de/projects/apartment-search/api/ und https://d-solve.de/apartment-search/api/openapi.json 1. Optional GET /limits: `features.cloud` muss wahr sein; dort stehen Grenzen, `retention.options` und der heutige Verbrauch. 2. POST /sites mit {"data": {...}, "retentionDays": 30}. `data` sind dieselben Parameter wie im Link als flaches JSON-Objekt Name → Text, unkodiert (kein %20; das Sprachsuffix gehört in den Namen, z. B. "headline.de"). Keine data:-Adressen. Die Aushang-Parameter (poster…) gehören mit hinein; die persönlichen Angaben der Mietunterlagen (mieter, m1…, haushalt, tiere, ort, datum, gehalt) nicht, sie bleiben hinter dem # des Mietunterlagen-Links. Antwort 201: `url` (Kurzlink), `subpages` (aushang, mietunterlagen), `id`, `editKey`, `expiresAt`. 3. Fotos: je Foto POST /sites//images mit Bearer und {"url": "https://…"}; der Server lädt das Bild selbst (JPEG, PNG, WebP, GIF, AVIF; Anzahl und Größe in `limits.maxImagesPerSite` und `limits.maxImageBytes`). Die zurückgegebene `url` als Wert für `photo`, `p1photo` usw. setzen (mehrere je Kachel mit | trennen), danach PUT /sites/ mit dem vollständigen `data`. 4. Spätere Änderungen mit dem Schlüssel, den der Nutzer nennt: GET /sites/, ändern, PUT /sites/ mit dem vollständigen `data` (PUT ersetzt alles). Frist: PUT mit {"retentionDays": 90} (läuft dann ab diesem Moment). Löschen: DELETE /sites/. Neuer Schlüssel: POST /sites//rotate-key. 5. Ohne HTTP: `curl -sS -X POST https://d-solve.de/apartment-search/api/sites -H "content-type: application/json" -d '{"data": {...}, "retentionDays": 30}'` mit dem echten JSON ausgeben, oder der Nutzer lädt den langen Link im Baukasten unter „Vorhandenen Link bearbeiten“, wählt „Online speichern (kurzer Link)“ und klickt „Online speichern“. ### Regeln fürs Speichern - Kurzlink (dazu …/aushang/ und …/mietunterlagen/ auf Wunsch) und Bearbeitungsschlüssel einmal klar abgesetzt in einem Codeblock zeigen und den Nutzer auffordern, den Schlüssel jetzt zu speichern (Passwortmanager): Nur damit lässt sich die Seite später ändern oder löschen, er wird nie wieder angezeigt, und du merkst ihn dir nicht. Den Schlüssel nie in einen Link, nie in `data`, nie in eine Aufruf-Adresse schreiben. - Das Löschdatum nennen (aus `expiresAt`). - Immer vollständig schreiben: erst GET, ändern, dann PUT oder `apartment_update` mit dem ganzen Objekt. - Bei 429 (`rate`) oder 503 (`capacity`, `daily-cap`) auf den langen Link ausweichen und kurz sagen, warum. Bei 409 `image-limit` weniger Fotos. Bei 400 steht in `error`, was nicht stimmt; korrigieren und einmal erneut versuchen. - Konten (Google-Login) und Premium gibt es für Menschen, die mehrere Seiten im Baukasten verwalten; Agenten brauchen sie nicht. Details: https://d-solve.de/projects/apartment-search/api/#konto ## Ergebnis Gib den fertigen Link einmal als Text in einem Codeblock und einmal als anklickbaren Link, dazu den Aushang-Link (derselbe Link mit /aushang/) und, wenn gewünscht, den Mietunterlagen-Link. Wurde die Seite gespeichert, ist der Kurzlink der Link (mit /aushang/ und /mietunterlagen/ dahinter), und der Bearbeitungsschlüssel kommt einmal dazu. Erinnere den Nutzer: Link testen; für einen QR-Code den Link im Baukasten unter „Vorhandenen Link bearbeiten“ einfügen (https://d-solve.de/projects/apartment-search/customize/); dort lässt sich alles weiter direkt in der Vorschau ändern. Frag, ob etwas geändert werden soll, und gib nach jeder Änderung wieder den vollständigen Link.