{
  "schemaVersion": "1.0",
  "item": {
    "slug": "cal-com",
    "name": "Cal.com",
    "source": "tencent",
    "type": "skill",
    "category": "开发工具",
    "sourceUrl": "https://clawhub.ai/byungkyu/cal-com",
    "canonicalUrl": "https://clawhub.ai/byungkyu/cal-com",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/cal-com",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=cal-com",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md",
      "LICENSE.txt"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-30T16:55:25.780Z",
      "expiresAt": "2026-05-07T16:55:25.780Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=network",
        "contentDisposition": "attachment; filename=\"network-1.0.0.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/cal-com"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/cal-com",
    "agentPageUrl": "https://openagent3.xyz/skills/cal-com/agent",
    "manifestUrl": "https://openagent3.xyz/skills/cal-com/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/cal-com/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Cal.com",
        "body": "Access the Cal.com API with managed OAuth authentication. Create and manage event types, bookings, schedules, calendars, and webhooks."
      },
      {
        "title": "Quick Start",
        "body": "# Get your profile\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/cal-com/v2/me')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Base URL",
        "body": "https://gateway.maton.ai/cal-com/v2/{resource}\n\nReplace {resource} with the Cal.com API endpoint path. The gateway proxies requests to api.cal.com and automatically injects your OAuth token."
      },
      {
        "title": "Authentication",
        "body": "All requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\""
      },
      {
        "title": "Getting Your API Key",
        "body": "Sign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key"
      },
      {
        "title": "Connection Management",
        "body": "Manage your Cal.com OAuth connections at https://ctrl.maton.ai."
      },
      {
        "title": "List Connections",
        "body": "python3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=cal-com&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Create Connection",
        "body": "python3 <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'cal-com'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Get Connection",
        "body": "python3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"4481afaa-03e4-4b2d-a1c6-7daaf4bff512\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-12T22:52:17.140998Z\",\n    \"last_updated_time\": \"2026-02-12T22:55:20.376189Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"cal-com\",\n    \"metadata\": {}\n  }\n}\n\nOpen the returned url in a browser to complete OAuth authorization."
      },
      {
        "title": "Delete Connection",
        "body": "python3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Specifying Connection",
        "body": "If you have multiple Cal.com connections, specify which one to use with the Maton-Connection header:\n\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/cal-com/v2/me')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '4481afaa-03e4-4b2d-a1c6-7daaf4bff512')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nIf omitted, the gateway uses the default (oldest) active connection."
      },
      {
        "title": "User Profile",
        "body": "Get Profile\n\nGET /cal-com/v2/me\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 2152180,\n    \"email\": \"user@example.com\",\n    \"name\": \"User Name\",\n    \"avatarUrl\": \"https://...\",\n    \"bio\": \"\",\n    \"timeFormat\": 12,\n    \"defaultScheduleId\": null,\n    \"weekStart\": \"Sunday\",\n    \"timeZone\": \"America/New_York\"\n  }\n}\n\nUpdate Profile\n\nPATCH /cal-com/v2/me\nContent-Type: application/json\n\n{\n  \"bio\": \"Updated bio\",\n  \"name\": \"New Name\"\n}"
      },
      {
        "title": "Event Types",
        "body": "List Event Types\n\nGET /cal-com/v2/event-types\n\nWith username filter:\n\nGET /cal-com/v2/event-types?username={username}\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"eventTypeGroups\": [\n      {\n        \"teamId\": null,\n        \"bookerUrl\": \"https://cal.com\",\n        \"profile\": {\n          \"slug\": \"username\",\n          \"name\": \"User Name\"\n        },\n        \"eventTypes\": [\n          {\n            \"id\": 4716831,\n            \"title\": \"30 min meeting\",\n            \"slug\": \"30min\",\n            \"length\": 30,\n            \"hidden\": false\n          }\n        ]\n      }\n    ]\n  }\n}\n\nGet Event Type\n\nGET /cal-com/v2/event-types/{eventTypeId}\n\nCreate Event Type\n\nPOST /cal-com/v2/event-types\nContent-Type: application/json\n\n{\n  \"title\": \"Meeting\",\n  \"slug\": \"meeting\",\n  \"length\": 30\n}\n\nRequired fields:\n\ntitle - Event type name\nslug - URL slug (must be unique)\nlength - Duration in minutes\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 4745911,\n    \"title\": \"Meeting\",\n    \"slug\": \"meeting\",\n    \"length\": 30,\n    \"locations\": [{\"type\": \"integrations:daily\"}],\n    \"hidden\": false,\n    \"userId\": 2152180\n  }\n}\n\nUpdate Event Type\n\nPATCH /cal-com/v2/event-types/{eventTypeId}\nContent-Type: application/json\n\n{\n  \"title\": \"Updated Meeting Title\",\n  \"description\": \"Updated description\"\n}\n\nDelete Event Type\n\nDELETE /cal-com/v2/event-types/{eventTypeId}"
      },
      {
        "title": "Event Type Webhooks",
        "body": "List Webhooks\n\nGET /cal-com/v2/event-types/{eventTypeId}/webhooks\n\nCreate Webhook\n\nPOST /cal-com/v2/event-types/{eventTypeId}/webhooks\nContent-Type: application/json\n\n{\n  \"subscriberUrl\": \"https://example.com/webhook\",\n  \"triggers\": [\"BOOKING_CREATED\"],\n  \"active\": true\n}\n\nAvailable triggers: BOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, BOOKING_CONFIRMED, BOOKING_REJECTED, BOOKING_REQUESTED, BOOKING_PAYMENT_INITIATED, BOOKING_NO_SHOW_UPDATED, MEETING_ENDED, MEETING_STARTED, RECORDING_READY, INSTANT_MEETING, RECORDING_TRANSCRIPTION_GENERATED\n\nGet Webhook\n\nGET /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}\n\nUpdate Webhook\n\nPATCH /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}\nContent-Type: application/json\n\n{\n  \"active\": false\n}\n\nDelete Webhook\n\nDELETE /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}"
      },
      {
        "title": "Bookings",
        "body": "List Bookings\n\nGET /cal-com/v2/bookings\n\nWith filters:\n\nGET /cal-com/v2/bookings?status=upcoming\nGET /cal-com/v2/bookings?status=past\nGET /cal-com/v2/bookings?status=cancelled\nGET /cal-com/v2/bookings?status=accepted\nGET /cal-com/v2/bookings?take=10\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"bookings\": [\n      {\n        \"id\": 15893969,\n        \"uid\": \"gZJNR7FQG2qLsBqnFdxAPE\",\n        \"title\": \"30 min meeting between User and Guest\",\n        \"startTime\": \"2026-02-13T17:00:00.000Z\",\n        \"endTime\": \"2026-02-13T17:30:00.000Z\",\n        \"status\": \"ACCEPTED\"\n      }\n    ],\n    \"totalCount\": 1,\n    \"nextCursor\": null\n  }\n}\n\nGet Booking\n\nGET /cal-com/v2/bookings/{bookingUid}\n\nCreate Booking\n\nPOST /cal-com/v2/bookings\nContent-Type: application/json\n\n{\n  \"eventTypeId\": 4716831,\n  \"start\": \"2026-02-13T17:00:00Z\",\n  \"timeZone\": \"America/New_York\",\n  \"language\": \"en\",\n  \"responses\": {\n    \"name\": \"Guest Name\",\n    \"email\": \"guest@example.com\"\n  },\n  \"metadata\": {}\n}\n\nRequired fields:\n\neventTypeId - ID of the event type\nstart - Start time in ISO 8601 format (must be an available slot)\ntimeZone - Valid IANA timezone\nlanguage - Language code (e.g., \"en\")\nresponses.name - Attendee name\nresponses.email - Attendee email\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 15893969,\n    \"uid\": \"gZJNR7FQG2qLsBqnFdxAPE\",\n    \"title\": \"30 min meeting between User and Guest Name\",\n    \"startTime\": \"2026-02-13T17:00:00.000Z\",\n    \"endTime\": \"2026-02-13T17:30:00.000Z\",\n    \"status\": \"ACCEPTED\",\n    \"location\": \"integrations:daily\"\n  }\n}\n\nCancel Booking\n\nPOST /cal-com/v2/bookings/{bookingUid}/cancel\nContent-Type: application/json\n\n{\n  \"cancellationReason\": \"Reason for cancellation\"\n}"
      },
      {
        "title": "Schedules",
        "body": "Get Default Schedule\n\nGET /cal-com/v2/schedules/default\n\nGet Schedule\n\nGET /cal-com/v2/schedules/{scheduleId}\n\nCreate Schedule\n\nPOST /cal-com/v2/schedules\nContent-Type: application/json\n\n{\n  \"name\": \"Work Hours\",\n  \"timeZone\": \"America/New_York\",\n  \"isDefault\": false\n}\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 1243030,\n    \"name\": \"Work Hours\",\n    \"isManaged\": false,\n    \"workingHours\": [\n      {\n        \"days\": [1, 2, 3, 4, 5],\n        \"startTime\": 540,\n        \"endTime\": 1020\n      }\n    ]\n  }\n}\n\nUpdate Schedule\n\nPATCH /cal-com/v2/schedules/{scheduleId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Schedule Name\"\n}\n\nDelete Schedule\n\nDELETE /cal-com/v2/schedules/{scheduleId}"
      },
      {
        "title": "Availability Slots",
        "body": "Get Available Slots\n\nGET /cal-com/v2/slots/available?eventTypeId={eventTypeId}&startTime={startTime}&endTime={endTime}\n\nParameters:\n\neventTypeId - Required. The event type ID\nstartTime - Required. Start of range (ISO 8601)\nendTime - Required. End of range (ISO 8601)\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"slots\": {\n      \"2026-02-13\": [\n        {\"time\": \"2026-02-13T17:00:00.000Z\"},\n        {\"time\": \"2026-02-13T17:30:00.000Z\"},\n        {\"time\": \"2026-02-13T18:00:00.000Z\"}\n      ],\n      \"2026-02-14\": [\n        {\"time\": \"2026-02-14T14:00:00.000Z\"}\n      ]\n    }\n  }\n}\n\nReserve Slot\n\nPOST /cal-com/v2/slots/reserve\nContent-Type: application/json\n\n{\n  \"eventTypeId\": 4716831,\n  \"slotUtcStartDate\": \"2026-02-20T14:00:00Z\",\n  \"slotUtcEndDate\": \"2026-02-20T14:30:00Z\"\n}\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": \"968ed924-83fb-4da7-969e-eaa621643535\"\n}"
      },
      {
        "title": "Calendars",
        "body": "List Connected Calendars\n\nGET /cal-com/v2/calendars\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"connectedCalendars\": [\n      {\n        \"integration\": {\n          \"name\": \"Google Calendar\",\n          \"type\": \"google_calendar\"\n        },\n        \"calendars\": [...]\n      }\n    ]\n  }\n}"
      },
      {
        "title": "Conferencing",
        "body": "List Conferencing Apps\n\nGET /cal-com/v2/conferencing\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": [\n    {\n      \"id\": 1769268,\n      \"type\": \"google_video\",\n      \"appId\": \"google-meet\"\n    }\n  ]\n}\n\nGet Default Conferencing App\n\nGET /cal-com/v2/conferencing/default"
      },
      {
        "title": "Webhooks (User-level)",
        "body": "List Webhooks\n\nGET /cal-com/v2/webhooks\n\nCreate Webhook\n\nPOST /cal-com/v2/webhooks\nContent-Type: application/json\n\n{\n  \"subscriberUrl\": \"https://example.com/webhook\",\n  \"triggers\": [\"BOOKING_CREATED\"],\n  \"active\": true\n}\n\nGet Webhook\n\nGET /cal-com/v2/webhooks/{webhookId}\n\nUpdate Webhook\n\nPATCH /cal-com/v2/webhooks/{webhookId}\nContent-Type: application/json\n\n{\n  \"active\": false\n}\n\nDelete Webhook\n\nDELETE /cal-com/v2/webhooks/{webhookId}"
      },
      {
        "title": "Teams",
        "body": "List Teams\n\nGET /cal-com/v2/teams"
      },
      {
        "title": "Verified Resources",
        "body": "List Verified Emails\n\nGET /cal-com/v2/verified-resources/emails"
      },
      {
        "title": "Pagination",
        "body": "Bookings use cursor-based pagination with take and nextCursor:\n\nGET /cal-com/v2/bookings?take=10\n\nResponse includes pagination info:\n\n{\n  \"data\": {\n    \"bookings\": [...],\n    \"totalCount\": 25,\n    \"nextCursor\": \"abc123\"\n  }\n}\n\nFor next page:\n\nGET /cal-com/v2/bookings?take=10&cursor=abc123"
      },
      {
        "title": "JavaScript",
        "body": "const response = await fetch(\n  'https://gateway.maton.ai/cal-com/v2/event-types',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();"
      },
      {
        "title": "Python",
        "body": "import os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/cal-com/v2/event-types',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()"
      },
      {
        "title": "Notes",
        "body": "All times are in UTC unless a timezone is specified\nlength field in event types is in minutes\nBooking creation requires an available slot - check /v2/slots/available first\nSchedule working hours use minutes from midnight (540 = 9:00 AM, 1020 = 5:00 PM)\nDays in schedules: 0 = Sunday, 1 = Monday, ... 6 = Saturday\nThe GET /v2/schedules endpoint may return 500 errors; use GET /v2/schedules/{id} instead\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments"
      },
      {
        "title": "Error Handling",
        "body": "StatusMeaning400Missing Cal.com connection or invalid request401Invalid or missing Maton API key404Resource not found409Conflict (duplicate resource)429Rate limited500Cal.com API error"
      },
      {
        "title": "Troubleshooting: API Key Issues",
        "body": "Check that the MATON_API_KEY environment variable is set:\n\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\n\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF"
      },
      {
        "title": "Troubleshooting: Invalid App Name",
        "body": "Ensure your URL path starts with cal-com. For example:\n\nCorrect: https://gateway.maton.ai/cal-com/v2/me\nIncorrect: https://gateway.maton.ai/v2/me"
      },
      {
        "title": "Troubleshooting: Booking Creation Fails",
        "body": "Check available slots before creating a booking:\n\nGET /cal-com/v2/slots/available?eventTypeId={id}&startTime=...&endTime=...\n\nEnsure all required fields are provided:\n\neventTypeId\nstart (must match an available slot)\ntimeZone\nlanguage\nresponses.name\nresponses.email"
      },
      {
        "title": "Resources",
        "body": "Cal.com API Documentation\nCal.com API Reference\nMaton Community\nMaton Support"
      }
    ],
    "body": "Cal.com\n\nAccess the Cal.com API with managed OAuth authentication. Create and manage event types, bookings, schedules, calendars, and webhooks.\n\nQuick Start\n# Get your profile\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/cal-com/v2/me')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nBase URL\nhttps://gateway.maton.ai/cal-com/v2/{resource}\n\n\nReplace {resource} with the Cal.com API endpoint path. The gateway proxies requests to api.cal.com and automatically injects your OAuth token.\n\nAuthentication\n\nAll requests require the Maton API key in the Authorization header:\n\nAuthorization: Bearer $MATON_API_KEY\n\n\nEnvironment Variable: Set your API key as MATON_API_KEY:\n\nexport MATON_API_KEY=\"YOUR_API_KEY\"\n\nGetting Your API Key\nSign in or create an account at maton.ai\nGo to maton.ai/settings\nCopy your API key\nConnection Management\n\nManage your Cal.com OAuth connections at https://ctrl.maton.ai.\n\nList Connections\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections?app=cal-com&status=ACTIVE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nCreate Connection\npython3 <<'EOF'\nimport urllib.request, os, json\ndata = json.dumps({'app': 'cal-com'}).encode()\nreq = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Content-Type', 'application/json')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nGet Connection\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nResponse:\n\n{\n  \"connection\": {\n    \"connection_id\": \"4481afaa-03e4-4b2d-a1c6-7daaf4bff512\",\n    \"status\": \"ACTIVE\",\n    \"creation_time\": \"2026-02-12T22:52:17.140998Z\",\n    \"last_updated_time\": \"2026-02-12T22:55:20.376189Z\",\n    \"url\": \"https://connect.maton.ai/?session_token=...\",\n    \"app\": \"cal-com\",\n    \"metadata\": {}\n  }\n}\n\n\nOpen the returned url in a browser to complete OAuth authorization.\n\nDelete Connection\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nSpecifying Connection\n\nIf you have multiple Cal.com connections, specify which one to use with the Maton-Connection header:\n\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://gateway.maton.ai/cal-com/v2/me')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nreq.add_header('Maton-Connection', '4481afaa-03e4-4b2d-a1c6-7daaf4bff512')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\n\nIf omitted, the gateway uses the default (oldest) active connection.\n\nAPI Reference\nUser Profile\nGet Profile\nGET /cal-com/v2/me\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 2152180,\n    \"email\": \"user@example.com\",\n    \"name\": \"User Name\",\n    \"avatarUrl\": \"https://...\",\n    \"bio\": \"\",\n    \"timeFormat\": 12,\n    \"defaultScheduleId\": null,\n    \"weekStart\": \"Sunday\",\n    \"timeZone\": \"America/New_York\"\n  }\n}\n\nUpdate Profile\nPATCH /cal-com/v2/me\nContent-Type: application/json\n\n{\n  \"bio\": \"Updated bio\",\n  \"name\": \"New Name\"\n}\n\nEvent Types\nList Event Types\nGET /cal-com/v2/event-types\n\n\nWith username filter:\n\nGET /cal-com/v2/event-types?username={username}\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"eventTypeGroups\": [\n      {\n        \"teamId\": null,\n        \"bookerUrl\": \"https://cal.com\",\n        \"profile\": {\n          \"slug\": \"username\",\n          \"name\": \"User Name\"\n        },\n        \"eventTypes\": [\n          {\n            \"id\": 4716831,\n            \"title\": \"30 min meeting\",\n            \"slug\": \"30min\",\n            \"length\": 30,\n            \"hidden\": false\n          }\n        ]\n      }\n    ]\n  }\n}\n\nGet Event Type\nGET /cal-com/v2/event-types/{eventTypeId}\n\nCreate Event Type\nPOST /cal-com/v2/event-types\nContent-Type: application/json\n\n{\n  \"title\": \"Meeting\",\n  \"slug\": \"meeting\",\n  \"length\": 30\n}\n\n\nRequired fields:\n\ntitle - Event type name\nslug - URL slug (must be unique)\nlength - Duration in minutes\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 4745911,\n    \"title\": \"Meeting\",\n    \"slug\": \"meeting\",\n    \"length\": 30,\n    \"locations\": [{\"type\": \"integrations:daily\"}],\n    \"hidden\": false,\n    \"userId\": 2152180\n  }\n}\n\nUpdate Event Type\nPATCH /cal-com/v2/event-types/{eventTypeId}\nContent-Type: application/json\n\n{\n  \"title\": \"Updated Meeting Title\",\n  \"description\": \"Updated description\"\n}\n\nDelete Event Type\nDELETE /cal-com/v2/event-types/{eventTypeId}\n\nEvent Type Webhooks\nList Webhooks\nGET /cal-com/v2/event-types/{eventTypeId}/webhooks\n\nCreate Webhook\nPOST /cal-com/v2/event-types/{eventTypeId}/webhooks\nContent-Type: application/json\n\n{\n  \"subscriberUrl\": \"https://example.com/webhook\",\n  \"triggers\": [\"BOOKING_CREATED\"],\n  \"active\": true\n}\n\n\nAvailable triggers: BOOKING_CREATED, BOOKING_RESCHEDULED, BOOKING_CANCELLED, BOOKING_CONFIRMED, BOOKING_REJECTED, BOOKING_REQUESTED, BOOKING_PAYMENT_INITIATED, BOOKING_NO_SHOW_UPDATED, MEETING_ENDED, MEETING_STARTED, RECORDING_READY, INSTANT_MEETING, RECORDING_TRANSCRIPTION_GENERATED\n\nGet Webhook\nGET /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}\n\nUpdate Webhook\nPATCH /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}\nContent-Type: application/json\n\n{\n  \"active\": false\n}\n\nDelete Webhook\nDELETE /cal-com/v2/event-types/{eventTypeId}/webhooks/{webhookId}\n\nBookings\nList Bookings\nGET /cal-com/v2/bookings\n\n\nWith filters:\n\nGET /cal-com/v2/bookings?status=upcoming\nGET /cal-com/v2/bookings?status=past\nGET /cal-com/v2/bookings?status=cancelled\nGET /cal-com/v2/bookings?status=accepted\nGET /cal-com/v2/bookings?take=10\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"bookings\": [\n      {\n        \"id\": 15893969,\n        \"uid\": \"gZJNR7FQG2qLsBqnFdxAPE\",\n        \"title\": \"30 min meeting between User and Guest\",\n        \"startTime\": \"2026-02-13T17:00:00.000Z\",\n        \"endTime\": \"2026-02-13T17:30:00.000Z\",\n        \"status\": \"ACCEPTED\"\n      }\n    ],\n    \"totalCount\": 1,\n    \"nextCursor\": null\n  }\n}\n\nGet Booking\nGET /cal-com/v2/bookings/{bookingUid}\n\nCreate Booking\nPOST /cal-com/v2/bookings\nContent-Type: application/json\n\n{\n  \"eventTypeId\": 4716831,\n  \"start\": \"2026-02-13T17:00:00Z\",\n  \"timeZone\": \"America/New_York\",\n  \"language\": \"en\",\n  \"responses\": {\n    \"name\": \"Guest Name\",\n    \"email\": \"guest@example.com\"\n  },\n  \"metadata\": {}\n}\n\n\nRequired fields:\n\neventTypeId - ID of the event type\nstart - Start time in ISO 8601 format (must be an available slot)\ntimeZone - Valid IANA timezone\nlanguage - Language code (e.g., \"en\")\nresponses.name - Attendee name\nresponses.email - Attendee email\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 15893969,\n    \"uid\": \"gZJNR7FQG2qLsBqnFdxAPE\",\n    \"title\": \"30 min meeting between User and Guest Name\",\n    \"startTime\": \"2026-02-13T17:00:00.000Z\",\n    \"endTime\": \"2026-02-13T17:30:00.000Z\",\n    \"status\": \"ACCEPTED\",\n    \"location\": \"integrations:daily\"\n  }\n}\n\nCancel Booking\nPOST /cal-com/v2/bookings/{bookingUid}/cancel\nContent-Type: application/json\n\n{\n  \"cancellationReason\": \"Reason for cancellation\"\n}\n\nSchedules\nGet Default Schedule\nGET /cal-com/v2/schedules/default\n\nGet Schedule\nGET /cal-com/v2/schedules/{scheduleId}\n\nCreate Schedule\nPOST /cal-com/v2/schedules\nContent-Type: application/json\n\n{\n  \"name\": \"Work Hours\",\n  \"timeZone\": \"America/New_York\",\n  \"isDefault\": false\n}\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": 1243030,\n    \"name\": \"Work Hours\",\n    \"isManaged\": false,\n    \"workingHours\": [\n      {\n        \"days\": [1, 2, 3, 4, 5],\n        \"startTime\": 540,\n        \"endTime\": 1020\n      }\n    ]\n  }\n}\n\nUpdate Schedule\nPATCH /cal-com/v2/schedules/{scheduleId}\nContent-Type: application/json\n\n{\n  \"name\": \"Updated Schedule Name\"\n}\n\nDelete Schedule\nDELETE /cal-com/v2/schedules/{scheduleId}\n\nAvailability Slots\nGet Available Slots\nGET /cal-com/v2/slots/available?eventTypeId={eventTypeId}&startTime={startTime}&endTime={endTime}\n\n\nParameters:\n\neventTypeId - Required. The event type ID\nstartTime - Required. Start of range (ISO 8601)\nendTime - Required. End of range (ISO 8601)\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"slots\": {\n      \"2026-02-13\": [\n        {\"time\": \"2026-02-13T17:00:00.000Z\"},\n        {\"time\": \"2026-02-13T17:30:00.000Z\"},\n        {\"time\": \"2026-02-13T18:00:00.000Z\"}\n      ],\n      \"2026-02-14\": [\n        {\"time\": \"2026-02-14T14:00:00.000Z\"}\n      ]\n    }\n  }\n}\n\nReserve Slot\nPOST /cal-com/v2/slots/reserve\nContent-Type: application/json\n\n{\n  \"eventTypeId\": 4716831,\n  \"slotUtcStartDate\": \"2026-02-20T14:00:00Z\",\n  \"slotUtcEndDate\": \"2026-02-20T14:30:00Z\"\n}\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": \"968ed924-83fb-4da7-969e-eaa621643535\"\n}\n\nCalendars\nList Connected Calendars\nGET /cal-com/v2/calendars\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"connectedCalendars\": [\n      {\n        \"integration\": {\n          \"name\": \"Google Calendar\",\n          \"type\": \"google_calendar\"\n        },\n        \"calendars\": [...]\n      }\n    ]\n  }\n}\n\nConferencing\nList Conferencing Apps\nGET /cal-com/v2/conferencing\n\n\nResponse:\n\n{\n  \"status\": \"success\",\n  \"data\": [\n    {\n      \"id\": 1769268,\n      \"type\": \"google_video\",\n      \"appId\": \"google-meet\"\n    }\n  ]\n}\n\nGet Default Conferencing App\nGET /cal-com/v2/conferencing/default\n\nWebhooks (User-level)\nList Webhooks\nGET /cal-com/v2/webhooks\n\nCreate Webhook\nPOST /cal-com/v2/webhooks\nContent-Type: application/json\n\n{\n  \"subscriberUrl\": \"https://example.com/webhook\",\n  \"triggers\": [\"BOOKING_CREATED\"],\n  \"active\": true\n}\n\nGet Webhook\nGET /cal-com/v2/webhooks/{webhookId}\n\nUpdate Webhook\nPATCH /cal-com/v2/webhooks/{webhookId}\nContent-Type: application/json\n\n{\n  \"active\": false\n}\n\nDelete Webhook\nDELETE /cal-com/v2/webhooks/{webhookId}\n\nTeams\nList Teams\nGET /cal-com/v2/teams\n\nVerified Resources\nList Verified Emails\nGET /cal-com/v2/verified-resources/emails\n\nPagination\n\nBookings use cursor-based pagination with take and nextCursor:\n\nGET /cal-com/v2/bookings?take=10\n\n\nResponse includes pagination info:\n\n{\n  \"data\": {\n    \"bookings\": [...],\n    \"totalCount\": 25,\n    \"nextCursor\": \"abc123\"\n  }\n}\n\n\nFor next page:\n\nGET /cal-com/v2/bookings?take=10&cursor=abc123\n\nCode Examples\nJavaScript\nconst response = await fetch(\n  'https://gateway.maton.ai/cal-com/v2/event-types',\n  {\n    headers: {\n      'Authorization': `Bearer ${process.env.MATON_API_KEY}`\n    }\n  }\n);\nconst data = await response.json();\n\nPython\nimport os\nimport requests\n\nresponse = requests.get(\n    'https://gateway.maton.ai/cal-com/v2/event-types',\n    headers={'Authorization': f'Bearer {os.environ[\"MATON_API_KEY\"]}'}\n)\ndata = response.json()\n\nNotes\nAll times are in UTC unless a timezone is specified\nlength field in event types is in minutes\nBooking creation requires an available slot - check /v2/slots/available first\nSchedule working hours use minutes from midnight (540 = 9:00 AM, 1020 = 5:00 PM)\nDays in schedules: 0 = Sunday, 1 = Monday, ... 6 = Saturday\nThe GET /v2/schedules endpoint may return 500 errors; use GET /v2/schedules/{id} instead\nIMPORTANT: When using curl commands, use curl -g when URLs contain brackets to disable glob parsing\nIMPORTANT: When piping curl output to jq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments\nError Handling\nStatus\tMeaning\n400\tMissing Cal.com connection or invalid request\n401\tInvalid or missing Maton API key\n404\tResource not found\n409\tConflict (duplicate resource)\n429\tRate limited\n500\tCal.com API error\nTroubleshooting: API Key Issues\nCheck that the MATON_API_KEY environment variable is set:\necho $MATON_API_KEY\n\nVerify the API key is valid by listing connections:\npython3 <<'EOF'\nimport urllib.request, os, json\nreq = urllib.request.Request('https://ctrl.maton.ai/connections')\nreq.add_header('Authorization', f'Bearer {os.environ[\"MATON_API_KEY\"]}')\nprint(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))\nEOF\n\nTroubleshooting: Invalid App Name\nEnsure your URL path starts with cal-com. For example:\nCorrect: https://gateway.maton.ai/cal-com/v2/me\nIncorrect: https://gateway.maton.ai/v2/me\nTroubleshooting: Booking Creation Fails\nCheck available slots before creating a booking:\nGET /cal-com/v2/slots/available?eventTypeId={id}&startTime=...&endTime=...\n\nEnsure all required fields are provided:\neventTypeId\nstart (must match an available slot)\ntimeZone\nlanguage\nresponses.name\nresponses.email\nResources\nCal.com API Documentation\nCal.com API Reference\nMaton Community\nMaton Support"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/byungkyu/cal-com",
    "publisherUrl": "https://clawhub.ai/byungkyu/cal-com",
    "owner": "byungkyu",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/cal-com",
    "downloadUrl": "https://openagent3.xyz/downloads/cal-com",
    "agentUrl": "https://openagent3.xyz/skills/cal-com/agent",
    "manifestUrl": "https://openagent3.xyz/skills/cal-com/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/cal-com/agent.md"
  }
}