Install

Send a message to the seller of a Kleinanzeigen listing (UNTESTED draft).

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.

No reports yetAsks before it sends, your login
Site
Kleinanzeigen, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
849cbb21c3d3…

Requests

sent from your browser, in order
  1. 1GET{{params.listing_url}}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.
  2. 2POST/s-anbieter-kontaktieren.jsonSame request the page's jQuery form handler sends. The single-item foreach only picks the contact name (param or prefill).writes, asks firstform bodyrepeats, max 1

Before it writes, the extension shows you UNTESTED recipe. Send this message to the seller of "{{steps.listing.title}}" ({{params.listing_url}}) from your Kleinanzeigen account: {{params.message}} and waits for Allow.

Parameters

from your agent
contact_namestringName shown to the seller; defaults to the name prefilled for the account
listing_urlstringrequiredListing URL from kleinanzeigen.de/search-listings
messagestringrequiredMessage text as the user wants it sent

Returns

to your agent
listing_titlestring
messages_urlstringThe user's Kleinanzeigen inbox
sentboolean
site_statusstringStatus field of Kleinanzeigen's answer ('OK' on success, per the page's own handler)

Where it can send

  • www.kleinanzeigen.de

Anything else is blocked by the extension.

Reads from your session

Nothing. Your browser attaches the site's cookies by itself.

Used only in requests to the addresses on the left. Never sent to wield.run or your agent.

Checks

a run passes when
  • output.sent == `true`

Raw recipe

Served as canonical JSON from /api/v1/recipes/kleinanzeigen.de/message-seller, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/kleinanzeigen.de/message-seller | shasum -a 256
# 849cbb21c3d39020b4c66fc9b687a55205d4bc64f22a29859e2daf5184d02d6d
kleinanzeigen.de/message-seller.json, v1
{
  "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
}