{"confirm":{"summary":"UNTESTED recipe. Send this message to the seller of \"{{steps.listing.title}}\" ({{params.listing_url}}) from your Kleinanzeigen account: {{params.message}}"},"description":"UNTESTED until recorded logged in. Sends the user's message to the seller of one Kleinanzeigen listing from the user's own logged-in account, after an explicit Allow that shows the listing title and message. Uses the listing page's own contact form (CSRF token from the page). Some categories ask for extra fields (e.g. postcode); those are not supported yet.","effect":"write","id":"kleinanzeigen.de/message-seller","keywords":["kleinanzeigen","nachricht","verkäufer kontaktieren","anfrage","noch da","message seller","contact seller","ask seller"],"login_check":{"description":"Bearer-token endpoint: 200 when logged in, 401 when not (spikes/kleinanzeigen.md).","expect":{"login_required_if":{"status":[401,403]},"status":[200]},"id":"login_check","request":{"headers":{"Accept":"application/json"},"method":"GET","url":"/m-access-token.json"}},"output":{"schema":{"properties":{"listing_title":{"type":["string","null"]},"messages_url":{"description":"The user's Kleinanzeigen inbox","format":"uri","type":"string"},"sent":{"type":"boolean"},"site_status":{"description":"Status field of Kleinanzeigen's answer ('OK' on success, per the page's own handler)","type":["string","null"]}},"type":"object"},"value":"{sent: steps.send[0].status == 'OK', listing_title: steps.listing.title, site_status: steps.send[0].status, messages_url: 'https://www.kleinanzeigen.de/m-nachrichten.html'}"},"params":{"additionalProperties":false,"properties":{"contact_name":{"description":"Name shown to the seller; defaults to the name prefilled for the account","maxLength":60,"type":"string"},"listing_url":{"description":"Listing URL from kleinanzeigen.de/search-listings","pattern":"^https://www\\.kleinanzeigen\\.de/s-anzeige/","type":"string"},"message":{"description":"Message text as the user wants it sent","maxLength":2000,"minLength":2,"type":"string"}},"required":["listing_url","message"],"type":"object"},"provenance":{"method":"browser-inspect","notes":"UNTESTED; nothing was ever sent. From spikes/kleinanzeigen.md (inspected logged out): form#viewad-contact-modal-form (action /s-anbieter-kontaktieren.json; fields message, adId, adType, contactName) is in the listing page DOM even when logged out; the page's generic jQuery handler POSTs it form-urlencoded with X-CSRF-TOKEN from meta[name=_csrf] (36 chars, per page load; name from meta _csrf_header) and checks for an OK status. Unverified: the exact success JSON, extra per-category fields (.j-zip postcode), whether X-Requested-With is needed. Record once logged in with tools/har2recipe.","recorded_at":"2026-11-07T12:13:00+01:00","recorded_by":"C4"},"requires_login":true,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"DE","id":"kleinanzeigen.de","language":"de","login_url":"https://www.kleinanzeigen.de/m-einloggen.html","name":"Kleinanzeigen","origin":"https://www.kleinanzeigen.de","origins":["https://www.kleinanzeigen.de"]},"steps":[{"description":"Listing page: contact form fields and the per-page CSRF token (meta _csrf). Logged out, the page shows the login-intercept button instead of the form.","expect":{"content_type":"html","login_required_if":{"assert":"contains(body, 'viewad-contact-button-login')"},"status":[200]},"extract":{"html":{"action":{"attr":"action","selector":"form#viewad-contact-modal-form"},"ad_id":{"attr":"value","selector":"form#viewad-contact-modal-form input[name=\"adId\"]"},"ad_type":{"attr":"value","selector":"form#viewad-contact-modal-form input[name=\"adType\"]"},"contact_name":{"attr":"value","selector":"form#viewad-contact-modal-form input[name=\"contactName\"]"},"csrf":{"attr":"content","selector":"meta[name=\"_csrf\"]"},"title":{"selector":"h1"}}},"id":"listing","parse":"html","request":{"headers":{"Accept":"text/html"},"method":"GET","url":"{{params.listing_url}}"}},{"description":"Same request the page's jQuery form handler sends. The single-item foreach only picks the contact name (param or prefill).","expect":{"content_type":"json","login_required_if":{"status":[401,403]},"status":[200]},"extract":{"json":{"message":"message || `null`","status":"status || `null`"}},"foreach":{"as":"c","in":"[{name: params.contact_name || steps.listing.contact_name || ''}]","max":1},"id":"send","request":{"body":{"type":"form","value":{"adId":"{{steps.listing.ad_id}}","adType":"{{steps.listing.ad_type}}","contactName":"{{c.name}}","message":"{{params.message}}"}},"headers":{"Accept":"application/json","X-CSRF-TOKEN":"{{steps.listing.csrf}}","X-Requested-With":"XMLHttpRequest"},"method":"POST","url":"/s-anbieter-kontaktieren.json"},"write":true}],"task":"Send a message to the seller of a Kleinanzeigen listing (UNTESTED draft)","tos":{"notes":"Sends a message as the user, only after an explicit Allow per run that shows the exact text. One message per user request: no bulk or templated outreach, which Kleinanzeigen bans as spam.","reviewed":false},"verify":{"checks":["output.sent == `true`"],"example_params":{"listing_url":"https://www.kleinanzeigen.de/s-anzeige/example/1234567890-217-3331","message":"Hallo, ist der Artikel noch verfügbar?"}},"version":1}