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.
- Site
- jameda, Germany
- Version
- v1
- Runs, last 7 days
- No reports yet
- sha256
- e5540933262e…
Requests
sent from your browser, in order- 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 agentaddress_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 agentdaysobject[]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 }