{
  "name": "Meeting door for François Beausoleil",
  "description": "Lets an AI agent acting for a real person request and book a conversation or 1:1 session with François Beausoleil (NVC trainer, coach and consultant). Contact him only on behalf of a person who asked for it.",
  "read_only_path": {
    "method": "GET",
    "url": "https://beausoleil.ai/api/slots/America/Toronto",
    "url_pattern": "https://beausoleil.ai/api/slots/<Area>/<City>",
    "purpose": "For assistants that can only read. Put the person's IANA time zone in the path, e.g. /api/slots/Europe/Amsterdam. Returns the open slots for the next 7 days, each with start (ISO), start_local (readable, labeled with the zone) and confirm_url. Hand the person the confirm_url of the slot they pick; they confirm it themselves on the booking page. No personal data needed.",
    "params": {
      "<Area>/<City>": "the person's IANA time zone, in the path (e.g. America/Toronto, Europe/Amsterdam). If omitted, times are shown in America/Toronto and a timezone_note says so.",
      "timezone": "alternative: the same zone as a query parameter, ?timezone=America/Toronto"
    }
  },
  "steps": [
    {
      "step": 1,
      "method": "POST",
      "url": "https://beausoleil.ai/api/request-meeting",
      "purpose": "Get up to 8 open slots and a request_id valid for 60 minutes."
    },
    {
      "step": 2,
      "method": "POST",
      "url": "https://beausoleil.ai/api/book",
      "purpose": "Confirm one slot (after checking with the person) to create the booking."
    }
  ],
  "request_meeting_fields": {
    "person.name": "required, the person's full name",
    "person.email": "required, the person's real email (the invitation goes there)",
    "person.organization": "optional",
    "need": "required, what they would like to talk about (at least 15 characters)",
    "timezone": "required, IANA time zone, e.g. \"America/Toronto\"",
    "preferred_window": "optional, \"next 7 days\" (default) or an ISO 8601 range \"start/end\"",
    "agent.name": "optional, your agent's name",
    "agent.operator": "optional, who runs the agent"
  },
  "book_fields": {
    "request_id": "required, from step 1",
    "slot": "required, one of the slot start values from step 1, copied exactly"
  },
  "examples": {
    "request_meeting": {
      "person": {
        "name": "Jane Doe",
        "email": "jane@acme.com",
        "organization": "Acme"
      },
      "need": "Exploring NVC training for our leadership team of 12 people.",
      "timezone": "America/Toronto",
      "preferred_window": "next 7 days",
      "agent": {
        "name": "Jane's assistant",
        "operator": "Acme"
      }
    },
    "book": {
      "request_id": "<request_id from step 1>",
      "slot": "2026-11-10T14:00:00.000-05:00"
    }
  },
  "errors": {
    "400": "Missing or invalid fields; the response lists which ones.",
    "403": "Request not accepted (too short a need, or a disposable email).",
    "404": "request_id unknown or expired; request slots again.",
    "409": "Slot just taken; request slots again.",
    "429": "Too many requests from this address (limit 10/hour)."
  },
  "rate_limit": "10 meeting requests per hour per IP address; separately, 10 slot lookups (GET /api/slots) per hour per IP address",
  "fallback_email": "Francois@Beausoleil.ai",
  "agent_card": "https://beausoleil.ai/.well-known/agent-card.json"
}