Install

Search doctors by specialty and city.

Searches jameda (Docplanner) for doctors and practices by specialty or free text and city: name, specialty, address, star rating, number of reviews, whether online booking exists and has free slots, and the ids that jameda.de/get-slots needs. Paid 'Anzeige' placements are dropped by default.

No reports yetRead-only, no login
Site
jameda, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
1c794b954fbf…

Requests

sent from your browser, in order
  1. 1GET/suchen?loc&page&q

Parameters

from your agent
bookable_onlybooleanOnly doctors with online booking and free slots = false
citystringrequiredCity, e.g. 'Berlin', 'München'
include_adsbooleanKeep paid placements (marked promoted) = false
pageinteger = 1
specialtystringrequiredSpecialty or free text, e.g. 'Hautarzt', 'Allgemeinmediziner', 'Zahnarzt', or a doctor's name

Returns

to your agent
citystring
doctorsobject[]address_id, city, doctor_id, free_slots, kind, name, online_booking, promoted, rating, reviews, specialty, street, url, video_only
pageinteger
specialtystring

Where it can send

  • www.jameda.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
  • length(output.doctors) > `5`
  • output.doctors[0].city == 'Hamburg'
  • length(output.doctors[?promoted]) == `0`
  • length(output.doctors[?online_booking]) > `0`
  • starts_with(output.doctors[0].url, 'https://www.jameda.de/')

Raw recipe

Served as canonical JSON from /api/v1/recipes/jameda.de/search-doctors, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/jameda.de/search-doctors | shasum -a 256
# 1c794b954fbf6c5183ce8040bb3d8239132336fd457e79c6496ec2f75709630a
jameda.de/search-doctors.json, v1
{
  "description": "Searches jameda (Docplanner) for doctors and practices by specialty or free text and city: name, specialty, address, star rating, number of reviews, whether online booking exists and has free slots, and the ids that jameda.de/get-slots needs. Paid 'Anzeige' placements are dropped by default.",
  "effect": "read",
  "id": "jameda.de/search-doctors",
  "keywords": [
    "jameda",
    "arzt",
    "ärztin",
    "arztsuche",
    "facharzt",
    "hausarzt",
    "hautarzt",
    "zahnarzt",
    "termin",
    "arzttermin",
    "bewertung",
    "doctor",
    "find a doctor",
    "appointment",
    "medical"
  ],
  "output": {
    "schema": {
      "properties": {
        "city": {
          "type": "string"
        },
        "doctors": {
          "items": {
            "properties": {
              "address_id": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "city": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "doctor_id": {
                "type": "string"
              },
              "free_slots": {
                "description": "The calendar currently has free slots",
                "type": "boolean"
              },
              "kind": {
                "enum": [
                  "doctor",
                  "facility",
                  null
                ]
              },
              "name": {
                "type": "string"
              },
              "online_booking": {
                "description": "Has a jameda calendar (get-slots works)",
                "type": "boolean"
              },
              "promoted": {
                "type": "boolean"
              },
              "rating": {
                "description": "0-5 stars",
                "type": [
                  "number",
                  "null"
                ]
              },
              "reviews": {
                "type": [
                  "integer",
                  "null"
                ]
              },
              "specialty": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "street": {
                "type": [
                  "string",
                  "null"
                ]
              },
              "url": {
                "format": "uri",
                "type": "string"
              },
              "video_only": {
                "type": "boolean"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "page": {
          "type": "integer"
        },
        "specialty": {
          "type": "string"
        }
      },
      "required": [
        "doctors"
      ],
      "type": "object"
    },
    "value": "let $ads = params.include_ads, $book = params.bookable_only in {specialty: params.specialty, city: params.city, page: params.page, doctors: steps.search.doctors[?doctor_id != `null` && ($ads || first_class != '1') && (!$book || has_slots != `null`)].{doctor_id: doctor_id, address_id: address_id, name: trim(name), kind: entity_type, specialty: specialty, street: street, city: locality || city, rating: rating && to_number(rating) || `null`, reviews: reviews && to_number(reviews) || `null`, video_only: online_only == 'true', online_booking: has_calendar != `null`, free_slots: has_slots != `null`, promoted: first_class == '1', url: url}}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "bookable_only": {
        "default": false,
        "description": "Only doctors with online booking and free slots",
        "type": "boolean"
      },
      "city": {
        "description": "City, e.g. 'Berlin', 'München'",
        "maxLength": 80,
        "minLength": 2,
        "type": "string"
      },
      "include_ads": {
        "default": false,
        "description": "Keep paid placements (marked promoted)",
        "type": "boolean"
      },
      "page": {
        "default": 1,
        "maximum": 20,
        "minimum": 1,
        "type": "integer"
      },
      "specialty": {
        "description": "Specialty or free text, e.g. 'Hautarzt', 'Allgemeinmediziner', 'Zahnarzt', or a doctor's name",
        "maxLength": 80,
        "minLength": 2,
        "type": "string"
      }
    },
    "required": [
      "specialty",
      "city"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "spikes/jameda.md. Server-rendered search; every result card carries data-* attributes and schema.org microdata. data-is-first-class=1 marks the paid placement (labelled 'Anzeige'). data-eec-has-calendar / -with-slots are present-but-empty attributes, so presence is tested with != null. No bot protection seen (CloudFront → Varnish → nginx).",
    "recorded_at": "2026-11-07T12:55:00+01:00",
    "recorded_by": "C4"
  },
  "requires_login": false,
  "schema": "https://wield.run/schema/recipe/v1.json",
  "site": {
    "country": "DE",
    "id": "jameda.de",
    "language": "de",
    "login_url": "https://www.jameda.de/anmelden",
    "name": "jameda",
    "origin": "https://www.jameda.de",
    "origins": [
      "https://www.jameda.de"
    ]
  },
  "steps": [
    {
      "expect": {
        "content_type": "html",
        "status": [
          200
        ]
      },
      "extract": {
        "html_items": {
          "doctors": {
            "fields": {
              "address_id": {
                "attr": "data-address-id",
                "selector": ":scope"
              },
              "city": {
                "attr": "data-eec-address-cities",
                "selector": ":scope"
              },
              "doctor_id": {
                "attr": "data-result-id",
                "selector": ":scope"
              },
              "entity_type": {
                "attr": "data-test-entity-type",
                "selector": ":scope"
              },
              "first_class": {
                "attr": "data-is-first-class",
                "selector": ":scope"
              },
              "has_calendar": {
                "attr": "data-eec-has-calendar",
                "selector": ":scope"
              },
              "has_slots": {
                "attr": "data-eec-has-calendar-with-slots",
                "selector": ":scope"
              },
              "locality": {
                "attr": "content",
                "selector": "meta[itemprop=\"addressLocality\"]"
              },
              "name": {
                "attr": "data-doctor-name",
                "selector": ":scope"
              },
              "online_only": {
                "attr": "data-is-online-only",
                "selector": ":scope"
              },
              "rating": {
                "attr": "data-eec-stars-rating",
                "selector": ":scope"
              },
              "reviews": {
                "attr": "data-eec-opinions-count",
                "selector": ":scope"
              },
              "specialty": {
                "attr": "data-eec-specialization-name",
                "selector": ":scope"
              },
              "street": {
                "attr": "content",
                "selector": "meta[itemprop=\"streetAddress\"]"
              },
              "url": {
                "attr": "data-doctor-url",
                "selector": ":scope"
              }
            },
            "max": 50,
            "selector": "[data-id=\"result-item\"]"
          }
        }
      },
      "id": "search",
      "parse": "html",
      "request": {
        "headers": {
          "Accept": "text/html"
        },
        "method": "GET",
        "query": {
          "loc": "{{params.city}}",
          "page": "{{params.page}}",
          "q": "{{params.specialty}}"
        },
        "url": "/suchen"
      }
    }
  ],
  "task": "Search doctors by specialty and city",
  "tos": {
    "notes": "jameda's terms forbid automated retrieval of profile data. One user-initiated search page at a time from the user's own browser. Health-related searches are sensitive: results stay on the user's device.",
    "reviewed": false
  },
  "verify": {
    "checks": [
      "length(output.doctors) > `5`",
      "output.doctors[0].city == 'Hamburg'",
      "length(output.doctors[?promoted]) == `0`",
      "length(output.doctors[?online_booking]) > `0`",
      "starts_with(output.doctors[0].url, 'https://www.jameda.de/')"
    ],
    "example_params": {
      "city": "Hamburg",
      "specialty": "Allgemeinmediziner"
    },
    "max_ms": 4000
  },
  "version": 1
}