{"description":"UNTESTED, needs login: lists the logged-in user's Doctolib appointments (date and time, practitioner, practice, address, visit type, status) from their own account. The endpoint answers 401 with reason 'User not logged in' when logged out (verified); the logged-in field names are unverified until recorded.","effect":"read","id":"doctolib.de/my-appointments","keywords":["doctolib","meine termine","arzttermin","termin wann","my appointments","upcoming appointments","doctor appointment"],"login_check":{"description":"Same endpoint; logged out it answers 401 {meta:{reason:'User not logged in'}, redirection:'/auth/patient_de…'} (verified 2026-11-07).","expect":{"content_type":"json","login_required_if":{"assert":"body.meta.reason == 'User not logged in' || contains(body.redirection || '', '/auth/')","status":[401,403]},"status":[200]},"id":"login_check","request":{"headers":{"Accept":"application/json"},"method":"GET","url":"/account/appointments.json"}},"output":{"schema":{"properties":{"appointments":{"items":{"properties":{"address":{"type":["string","null"]},"cancelled":{"type":"boolean"},"id":{"type":"string"},"practice":{"type":["string","null"]},"practitioner":{"type":["string","null"]},"speciality":{"type":["string","null"]},"start":{"description":"ISO 8601","type":["string","null"]},"status":{"type":["string","null"]},"visit_motive":{"type":["string","null"]}},"type":"object"},"type":"array"}},"required":["appointments"],"type":"object"},"value":"{appointments: sort_by(steps.appointments.items[?!cancelled], &start || '')}"},"params":{"additionalProperties":false,"properties":{},"type":"object"},"provenance":{"method":"manual","notes":"UNTESTED. Verified logged out only: GET /account/appointments.json → 401 JSON {data:[], meta:{reason:'User not logged in'}, is_staff, redirection}. Cookie session, same origin. Logged-in item field names are guesses with fallbacks; confirm with tools/har2recipe (open 'Meine Termine' while recording).","recorded_at":"2026-11-07T12:41:00+01:00","recorded_by":"C4"},"requires_login":true,"schema":"https://wield.run/schema/recipe/v1.json","site":{"country":"DE","id":"doctolib.de","language":"de","login_url":"https://www.doctolib.de/auth/patient_de","name":"Doctolib","origin":"https://www.doctolib.de","origins":["https://www.doctolib.de"]},"steps":[{"expect":{"assert":"body.data != null","content_type":"json","login_required_if":{"assert":"body.meta.reason == 'User not logged in'","status":[401,403]},"status":[200]},"extract":{"json":{"items":"data[].{id: to_string(id), start: start_date || start_at || startDate || `null`, practitioner: profile.name_with_title || profile_name || practitioner_name || `null`, speciality: profile.speciality || speciality_name || `null`, practice: practice.name || place.name || `null`, address: practice.address || place.full_address || place.address || `null`, visit_motive: visit_motive.name || visit_motive_name || `null`, status: status || state || `null`, cancelled: status == 'canceled' || canceled == `true` || cancelled == `true`}"}},"id":"appointments","request":{"headers":{"Accept":"application/json"},"method":"GET","url":"/account/appointments.json"}}],"task":"List the user's upcoming Doctolib appointments","tos":{"notes":"Reads the user's own appointments from their own session, on request. Health data: stays on the device, never in telemetry.","reviewed":false},"verify":{"checks":["output.appointments != `null`"],"example_params":{}},"version":1}