Install

Get free online appointment slots for a doctor on jameda.

Free appointment slots for one jameda doctor and address over 7 days, grouped by day, with the booking link for each slot and the next free slot if the week is full. Takes doctor_id and address_id from jameda.de/search-doctors (online_booking must be true). Uses jameda's anonymous page token; no login.

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

Requests

sent from your browser, in order
  1. 1GET/api/v3/doctors/{{params.doctor_id}}/addresses/{{params.address_id}}/slots?end&filters[address_service_id]&filters[insurance_provider_id]&includingSaasOnlyCalendar&start&with[]

Parameters

from your agent
address_idstringrequired
address_service_idstringVisit type id from the doctor's services, optional
doctor_idstringrequired
insuranceenum1 = gesetzlich (statutory), 2 = privat (private); inferred from the site "1" | "2"
start_datestringrequiredFirst day YYYY-MM-DD; the window is 7 days

Returns

to your agent
daysobject[]date, first_booking_url, times
next_availablestringNext free slot after the window (ISO), when the window has none
slotsobject[]First 30 slots with booking links
totalintegerFree slots in the 7-day window

Where it can send

  • www.jameda.de

Anything else is blocked by the extension.

Reads from your session

  • access_token from dom

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

Checks

a run passes when
  • output.total > `0` || output.next_available != `null`
  • length(output.days) <= `7`
  • output.total == `0` || starts_with(output.slots[0].booking_url, 'https://www.jameda.de/booking/')

Raw recipe

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

Check it yourself
curl -s https://wield.run/api/v1/recipes/jameda.de/get-slots | shasum -a 256
# e5540933262e0b0ff2ed57c4b9bc95e046edcaf9f176848dc6a658f0f18116b5
jameda.de/get-slots.json, v1
{
  "auth": {
    "derive": [
      {
        "from": "dom",
        "name": "access_token",
        "regex": "'ACCESS_TOKEN'\\s*:\\s*'([^']+)'",
        "selector": "script:not([src])"
      }
    ]
  },
  "description": "Free appointment slots for one jameda doctor and address over 7 days, grouped by day, with the booking link for each slot and the next free slot if the week is full. Takes doctor_id and address_id from jameda.de/search-doctors (online_booking must be true). Uses jameda's anonymous page token; no login.",
  "effect": "read",
  "id": "jameda.de/get-slots",
  "keywords": [
    "jameda",
    "arzt",
    "ärztin",
    "arztsuche",
    "facharzt",
    "hausarzt",
    "hautarzt",
    "zahnarzt",
    "termin",
    "arzttermin",
    "bewertung",
    "doctor",
    "find a doctor",
    "appointment",
    "medical",
    "freie termine",
    "slots",
    "verfügbarkeit"
  ],
  "output": {
    "schema": {
      "properties": {
        "days": {
          "items": {
            "properties": {
              "date": {
                "format": "date",
                "type": "string"
              },
              "first_booking_url": {
                "format": "uri",
                "type": "string"
              },
              "times": {
                "description": "HH:mm, Europe/Berlin",
                "items": {
                  "type": "string"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "next_available": {
          "description": "Next free slot after the window (ISO), when the window has none",
          "type": [
            "string",
            "null"
          ]
        },
        "slots": {
          "description": "First 30 slots with booking links",
          "items": {
            "properties": {
              "booking_url": {
                "format": "uri",
                "type": "string"
              },
              "start": {
                "type": "string"
              }
            },
            "type": "object"
          },
          "type": "array"
        },
        "total": {
          "description": "Free slots in the 7-day window",
          "type": "integer"
        }
      },
      "required": [
        "total",
        "days"
      ],
      "type": "object"
    },
    "value": "{total: length(steps.slots.slots), days: items(group_by(steps.slots.slots, &split(start, 'T')[0]))[*].{date: [0], times: [1][*].join(':', split(split(start, 'T')[1], ':')[:2]), first_booking_url: [1][0].booking_url}, next_available: steps.slots.next_after, slots: steps.slots.slots[:30]}"
  },
  "params": {
    "additionalProperties": false,
    "properties": {
      "address_id": {
        "pattern": "^[0-9]+$",
        "type": "string"
      },
      "address_service_id": {
        "description": "Visit type id from the doctor's services, optional",
        "type": "string"
      },
      "doctor_id": {
        "pattern": "^[0-9]+$",
        "type": "string"
      },
      "insurance": {
        "description": "1 = gesetzlich (statutory), 2 = privat (private); inferred from the site",
        "enum": [
          "1",
          "2"
        ],
        "type": "string"
      },
      "start_date": {
        "description": "First day YYYY-MM-DD; the window is 7 days",
        "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
        "type": "string"
      }
    },
    "required": [
      "doctor_id",
      "address_id",
      "start_date"
    ],
    "type": "object"
  },
  "provenance": {
    "method": "browser-inspect",
    "notes": "spikes/jameda.md. The slots API needs the anonymous bearer that every jameda page embeds in an inline script (ZLApp.APICredentials.ACCESS_TOKEN, ~13 h); derived with regex from the tab, never output. 404 = this address has no online calendar; 401 = token missing or expired (reload the tab). The +01:00 offset is hard-coded (CET): it must change to +02:00 for dates in summer time (late March to late October).",
    "recorded_at": "2026-11-07T13:00: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": "json",
        "status": [
          200
        ]
      },
      "extract": {
        "json": {
          "next_after": "_embedded.nearest_slot_after_date.start || `null`",
          "slots": "_items[?booked != `true`].{start: start, booking_url: booking_url}"
        }
      },
      "id": "slots",
      "request": {
        "headers": {
          "Accept": "application/json",
          "Authorization": "Bearer {{vars.access_token}}"
        },
        "method": "GET",
        "query": {
          "end": "{{params.start_date | add_days:6}}T23:59:59+01:00",
          "filters[address_service_id]": "{{params.address_service_id}}",
          "filters[insurance_provider_id]": "{{params.insurance}}",
          "includingSaasOnlyCalendar": "false",
          "start": "{{params.start_date}}T00:00:00+01:00",
          "with[]": [
            "address.nearest_slot_after_end",
            "links.book.patient"
          ]
        },
        "url": "/api/v3/doctors/{{params.doctor_id}}/addresses/{{params.address_id}}/slots"
      }
    }
  ],
  "task": "Get free online appointment slots for a doctor on jameda",
  "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": [
      "output.total > `0` || output.next_available != `null`",
      "length(output.days) <= `7`",
      "output.total == `0` || starts_with(output.slots[0].booking_url, 'https://www.jameda.de/booking/')"
    ],
    "example_params": {
      "address_id": "314278",
      "doctor_id": "288098",
      "start_date": "2026-11-09"
    },
    "max_ms": 4000
  },
  "version": 1
}