Install

List the user's upcoming Doctolib appointments.

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.

No reports yetRead-only, your login
Site
Doctolib, Germany
Version
v1
Runs, last 7 days
No reports yet
sha256
001f18136bd3…

Requests

sent from your browser, in order
  1. 1GET/account/appointments.json

Parameters

from your agent

None.

Returns

to your agent
appointmentsobject[]address, cancelled, id, practice, practitioner, speciality, start, status, visit_motive

Where it can send

  • www.doctolib.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.appointments != `null`

Raw recipe

Served as canonical JSON from /api/v1/recipes/doctolib.de/my-appointments, so its sha256 matches the ETag and the index.

Check it yourself
curl -s https://wield.run/api/v1/recipes/doctolib.de/my-appointments | shasum -a 256
# 001f18136bd3c14dea43d582d6a056b18e84d5acd7f26c0a53a97ee4b25a1735
doctolib.de/my-appointments.json, v1
{
  "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
}