{"openapi":"3.1.0","info":{"title":"pollicms REST API","version":"1","description":"Everything the pollicms web pages can do, as JSON. Guide for AI agents: /llms.txt.\n\n- Signed in as the person whose browser this is: call the API from a page of this site with fetch(url, { credentials: \"same-origin\" }). The session cookie is the credential.\n- Send JSON: `content-type: application/json` on every POST, PUT, PATCH and DELETE that has a body. Cross-site writes are refused.\n- Times in responses are epoch milliseconds (UTC). Input times take epoch milliseconds or ISO 8601 with an offset.\n- Errors: `{ \"error\": { \"code\", \"message\", \"issues\"? } }` with 400 (input), 403, 404 (missing or not yours), 409 (duplicate), 429 (rate limit).\n- Invitations, meetings, connection requests and group invites send real email to real people. Confirm with the human before you send them, and before you delete anything."},"servers":[{"url":"https://pollicms.serve.beshu.tech/api/v1"}],"security":[{"session":[]}],"tags":[{"name":"Account"},{"name":"Connections"},{"name":"Notifications"},{"name":"Settings"},{"name":"Calendars"},{"name":"People"},{"name":"Tags"},{"name":"Meetups"},{"name":"Meetings"},{"name":"Groups"}],"paths":{"/me":{"get":{"operationId":"getMe","tags":["Account"],"summary":"Who is signed in, unread notifications, and whether setup is still open","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteMe","tags":["Account"],"summary":"Delete your account for good","description":"Irreversible. Ask the human first. `confirm` must equal your account email.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"confirm":{"type":"string"}},"required":["confirm"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/home":{"get":{"operationId":"getHome","tags":["Account"],"summary":"The home dashboard: who is due, meetups to rate, connection requests, merge suggestions","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/setup/finish":{"post":{"operationId":"postSetupFinish","tags":["Account"],"summary":"Close the first-run setup wizard","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/export":{"get":{"operationId":"getExport","tags":["Account"],"summary":"Everything stored about you, as JSON","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/connections/requests":{"get":{"operationId":"getConnectionsRequests","tags":["Connections"],"summary":"Connection requests sent to you and by you","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postConnectionsRequests","tags":["Connections"],"summary":"Ask someone to connect, by email (emails them when they have no account)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","minLength":3,"maxLength":254}},"required":["email"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/connections/requests/{requestId}/respond":{"post":{"operationId":"postConnectionsRequestsBy_requestIdRespond","tags":["Connections"],"summary":"Accept or decline a connection request","parameters":[{"name":"requestId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accept":{"type":"boolean"}},"required":["accept"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notifications":{"get":{"operationId":"getNotifications","tags":["Notifications"],"summary":"Your notifications, newest first, 50 per page","description":"Next page: `before` = `<createdAt>.<id>` of the last item.","parameters":[{"name":"before","in":"query","required":false,"schema":{"type":"string","maxLength":100}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/notifications/read":{"post":{"operationId":"postNotificationsRead","tags":["Notifications"],"summary":"Mark notifications as read","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"ids":{"maxItems":100,"type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}},"required":["ids"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/settings":{"get":{"operationId":"getSettings","tags":["Settings"],"summary":"Your preferences and weekly hours","description":"Weekdays 1 (Monday) to 7; minutes from local midnight (1440 = end of day). A weekday without a row is not available.","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchSettings","tags":["Settings"],"summary":"Change any preferences; fields you leave out keep their value","description":"`weeklyHours`, when sent, replaces every weekday. calendarNudges needs a reminder calendar (PUT /calendars/{calendarId}/destination).","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":80},"timezone":{"description":"IANA zone, e.g. Europe/Rome","type":"string"},"minNoticeMin":{"type":"integer","minimum":0,"maximum":20160},"bufferMin":{"type":"integer","minimum":0,"maximum":240},"digestWeekday":{"type":"integer","minimum":1,"maximum":7},"digestHour":{"type":"integer","minimum":0,"maximum":23},"shareAvailabilityWithConnections":{"type":"boolean"},"emailNudges":{"type":"boolean"},"calendarNudges":{"type":"boolean"},"ownCalendarSignal":{"type":"boolean"},"weeklyHours":{"maxItems":7,"type":"array","items":{"type":"object","properties":{"weekday":{"type":"integer","minimum":1,"maximum":7},"startMin":{"type":"integer","minimum":0,"maximum":1440},"endMin":{"type":"integer","minimum":0,"maximum":1440}},"required":["weekday","startMin","endMin"]}}}}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/settings/guest-history":{"post":{"operationId":"postSettingsGuestHistory","tags":["Settings"],"summary":"Add (or not) the meetings you were invited to as a guest before you had an account","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"adopt":{"type":"boolean"}},"required":["adopt"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calendars":{"get":{"operationId":"getCalendars","tags":["Calendars"],"summary":"Connected calendar accounts and their calendars","description":"Google and Microsoft accounts connect only in the browser: open /api/calendars/google/start or /api/calendars/microsoft/start.","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calendars/ics":{"post":{"operationId":"postCalendarsIcs","tags":["Calendars"],"summary":"Connect a calendar by its ICS or webcal link (busy times only)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","minLength":8,"maxLength":2000},"name":{"default":"","type":"string","maxLength":80}},"required":["url"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calendars/{calendarId}/busy":{"put":{"operationId":"putCalendarsBy_calendarIdBusy","tags":["Calendars"],"summary":"Count (or stop counting) one calendar's events as busy","parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"busy":{"type":"boolean"}},"required":["busy"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calendars/{calendarId}/destination":{"put":{"operationId":"putCalendarsBy_calendarIdDestination","tags":["Calendars"],"summary":"Put meetings and reminders in this calendar","parameters":[{"name":"calendarId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/calendar-accounts/{accountId}":{"delete":{"operationId":"deleteCalendarAccountsBy_accountId","tags":["Calendars"],"summary":"Disconnect a calendar account and all its calendars","parameters":[{"name":"accountId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people":{"get":{"operationId":"getPeople","tags":["People"],"summary":"List everyone you keep track of","description":"Private contacts, connections and anyone you added notes to, sorted by name. `state` is on_track, slipping, overdue or null (not tracked). `interests`: what you share with them (find who likes climbing).","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postPeople","tags":["People"],"summary":"Add a private contact","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}]},"label":{"type":"string","maxLength":80},"cadenceDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":3660},{"type":"null"}],"description":"Days between meetups you aim for; null stops tracking"}},"required":["name"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/bulk":{"post":{"operationId":"postPeopleBulk","tags":["People"],"summary":"Add up to 200 private contacts at once (all or none)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"people":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}]},"label":{"anyOf":[{"type":"string","maxLength":80},{"type":"null"}]},"cadenceDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":3660},{"type":"null"}],"description":"Days between meetups you aim for; null stops tracking"}},"required":["name"]}}},"required":["people"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/merge-candidates":{"get":{"operationId":"getPeopleMergeCandidates","tags":["People"],"summary":"Private contacts that look like the same person as a connection","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}":{"get":{"operationId":"getPeopleBy_personId","tags":["People"],"summary":"One person: summary, how you met, what they are like, details, recent meetups with notes, tags, mute and block state","description":"`userId` is set for account people (use it for mute and block). `details.interest` holds the shared interests. `recentMeetups`: the last 6, in the shape of GET /interactions.","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchPeopleBy_personId","tags":["People"],"summary":"Change label, notes or cadence","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"label":{"type":"string","maxLength":80},"notes":{"type":"string","maxLength":4000},"cadenceDays":{"anyOf":[{"type":"integer","minimum":1,"maximum":3660},{"type":"null"}],"description":"Days between meetups you aim for; null stops tracking"}}}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deletePeopleBy_personId","tags":["People"],"summary":"Delete a private contact and everything private about them","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/identity":{"put":{"operationId":"putPeopleBy_personIdIdentity","tags":["People"],"summary":"Rename a private contact or change their email","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":120},"email":{"anyOf":[{"type":"string","maxLength":254},{"type":"null"}]}},"required":["name"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/about":{"put":{"operationId":"putPeopleBy_personIdAbout","tags":["People"],"summary":"Relationship, birthday, how you met, what they are like, contact details and shared interests","description":"Fields you leave out stay; null clears. Every detail kind you send replaces that kind; kinds you leave out stay. Kinds: email, phone, address, location, language, interest (interest: Things you both enjoy. One short item each. Tags group people; shared interests say what you two share. Example: climbing · Italian cooking · jazz · board games). All private to you.","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"relationship":{"anyOf":[{"type":"string","enum":["significant_other","spouse","date","lover","in_love_with","loved_by","ex","parent","child","sibling","grandparent","grandchild","uncle_aunt","nephew_niece","cousin","godparent","godchild","friend","best_friend","colleague","boss","subordinate","mentor","protege"]},{"type":"null"}]},"birthday":{"anyOf":[{"type":"object","properties":{"day":{"type":"integer","minimum":1,"maximum":31},"month":{"type":"integer","minimum":1,"maximum":12},"year":{"default":null,"anyOf":[{"type":"integer","minimum":1900,"maximum":9999},{"type":"null"}]}},"required":["day","month"]},{"type":"null"}]},"details":{"type":"object","propertyNames":{"type":"string","enum":["email","phone","address","location","language","interest"]},"additionalProperties":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string"},"label":{"default":null,"type":["string","null"]}},"required":["value"]}}},"metOn":{"description":"A year is enough. Add the month and day if you know them. Example: 2014, or 2014-06, or 2014-06-12. Not after today.","anyOf":[{"type":"string","pattern":"^\\d{4}(-\\d{2}(-\\d{2})?)?$"},{"type":"null"}]},"metStory":{"description":"The place and the story. It helps you remember what you share. Example: At Marta's wedding in Lisbon. We sat at the same table and talked about sailing all night.","anyOf":[{"type":"string","maxLength":1000},{"type":"null"}]},"character":{"description":"What they are like and what they think: temperament, values, strong views, likes and dislikes, topics to avoid. Example: Calm, dry humour, always late. Vegetarian. Loves urban design; avoid politics. Prefers calls to texts.","anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]}}}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/snooze":{"post":{"operationId":"postPeopleBy_personIdSnooze","tags":["People"],"summary":"Pause nudges about a person for some days (0 ends the snooze)","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"days":{"type":"integer","minimum":0,"maximum":365}},"required":["days"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/check-in":{"post":{"operationId":"postPeopleBy_personIdCheckIn","tags":["People"],"summary":"Answer the cadence check-in: keep it, change it, or stop tracking","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"type":"object","properties":{"keep":{"type":"boolean","const":true}},"required":["keep"]},{"type":"object","properties":{"cadenceDays":{"type":"integer","minimum":1,"maximum":3660}},"required":["cadenceDays"]},{"type":"object","properties":{"stop":{"type":"boolean","const":true}},"required":["stop"]}]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/merge":{"post":{"operationId":"postPeopleBy_personIdMerge","tags":["People"],"summary":"Merge a private contact into another person (see /people/merge-candidates)","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"intoPersonId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},"required":["intoPersonId"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/connection":{"delete":{"operationId":"deletePeopleBy_personIdConnection","tags":["Connections"],"summary":"Remove the connection with an account person","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/blocks":{"get":{"operationId":"getBlocks","tags":["Connections"],"summary":"Accounts you blocked","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postBlocks","tags":["Connections"],"summary":"Block an account (ends the connection, hides their invitations)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"userId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},"required":["userId"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/blocks/{userId}":{"delete":{"operationId":"deleteBlocksBy_userId","tags":["Connections"],"summary":"Unblock an account","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/mutes/{userId}":{"put":{"operationId":"putMutesBy_userId","tags":["Connections"],"summary":"Mute or unmute an account","parameters":[{"name":"userId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"muted":{"type":"boolean"}},"required":["muted"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tags":{"get":{"operationId":"getTags","tags":["Tags"],"summary":"Your tags, each with the people who carry it","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postTags","tags":["Tags"],"summary":"Put a tag (new or existing) on people","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"description":"Any case and spacing; stored normalized. An existing name reuses that tag"},"personIds":{"minItems":1,"maxItems":500,"type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}},"required":["name","personIds"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/tags/{tagId}":{"patch":{"operationId":"patchTagsBy_tagId","tags":["Tags"],"summary":"Rename a tag (merges into a tag that already has the new name)","parameters":[{"name":"tagId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"description":"Any case and spacing; stored normalized. An existing name reuses that tag"}},"required":["name"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteTagsBy_tagId","tags":["Tags"],"summary":"Delete a tag (people stay)","parameters":[{"name":"tagId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/tags":{"post":{"operationId":"postPeopleBy_personIdTags","tags":["Tags"],"summary":"Tag one person","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":200,"description":"Any case and spacing; stored normalized. An existing name reuses that tag"}},"required":["name"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/people/{personId}/tags/{tagId}":{"delete":{"operationId":"deletePeopleBy_personIdTagsBy_tagId","tags":["Tags"],"summary":"Take a tag off one person","parameters":[{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},{"name":"tagId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions/prompts":{"get":{"operationId":"getInteractionsPrompts","tags":["Meetups"],"summary":"Recent meetups waiting for a rating (newest first, at most 5)","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions":{"get":{"operationId":"getInteractions","tags":["Meetups"],"summary":"Your meetups with their notes, newest first; optionally only those with one person","description":"A meetup: id, occurredAt, channel (null on old rows: then read mode), mode, source (manual | in_app_meeting | own_calendar), partySize, meeting ({ id, title } or null), note (what you talked about), plans, decisions, openQuestions, promisedByMe, promisedToMe, eventAffect, people [{ personId, name, mood, affect }]. All private to you. Returns { meetups, nextBefore }: pass nextBefore as `before` for the next page (null on the last one).","parameters":[{"name":"personId","in":"query","required":false,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},{"name":"before","in":"query","required":false,"schema":{"description":"nextBefore of the page before","type":"string","maxLength":100}},{"name":"limit","in":"query","required":false,"schema":{"description":"Default 30","type":"integer","minimum":1,"maximum":100}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postInteractions","tags":["Meetups"],"summary":"Log a meetup (\"I met…\") with your notes","description":"Send channel (or, from older callers, mode). 409 when a meeting or your calendar already recorded these people that day: error.existingId is that meetup, so PATCH your notes onto it. A meetup you already logged with exactly the same people that day does not stop this call (the web form asks first): GET /interactions to check before you log it again.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD in your time zone; never later than today"},"channel":{"type":"string","enum":["in_person","video","phone","messages"],"description":"How you met up Example: In person · Video call · Phone call · Messages. Sets mode: in_person → in_person, video and phone → remote, messages → async."},"mode":{"description":"Upkeep weight class; prefer channel","type":"string","enum":["in_person","remote","async"]},"people":{"minItems":1,"type":"array","items":{"type":"object","properties":{"personId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"},"mood":{"anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"How they seemed to you. Only you see it. Example: 1 very low · 2 low · 3 okay · 4 good · 5 great"},{"type":"null"}]},"affect":{"description":"Legacy; prefer mood and eventAffect","anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"},{"type":"null"}]}},"required":["personId"]}},"partySize":{"description":"Everyone present including you","type":"integer","minimum":2,"maximum":10000},"note":{"description":"Only you see it. The main topics and news, in your own words. Example: Her new job at the museum. His knee surgery is in March.","type":"string","maxLength":4000},"plans":{"description":"Only you see it. What you want to do together. Add a date if you have one. Example: Hike the Path of the Gods in May. Dinner at ours after the move.","type":"string","maxLength":2000},"decisions":{"description":"Only you see it. What you agreed or settled. Example: We split the gift for Luca. Book club moves to Thursdays.","type":"string","maxLength":2000},"openQuestions":{"description":"Only you see it. What is not decided yet, or what to ask next time. Example: Will she take the London offer? Ask how the surgery went.","type":"string","maxLength":2000},"promisedByMe":{"description":"Only you see it. What you said you will do. In a group, say for whom. Example: Send Ben the photographer's number. Lend Ann the tent.","type":"string","maxLength":2000},"promisedToMe":{"description":"Only you see it. What they said they will do. In a group, say who. Example: Ben: intro to his architect friend. Ann: send the recipe.","type":"string","maxLength":2000},"eventAffect":{"description":"How did it feel for you? Example: 1 drained · 2 tired · 3 okay · 4 good · 5 energized","anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"},{"type":"null"}]}},"required":["date","people"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions/{interactionId}":{"get":{"operationId":"getInteractionsBy_interactionId","tags":["Meetups"],"summary":"One meetup with all your notes","description":"A meetup: id, occurredAt, channel (null on old rows: then read mode), mode, source (manual | in_app_meeting | own_calendar), partySize, meeting ({ id, title } or null), note (what you talked about), plans, decisions, openQuestions, promisedByMe, promisedToMe, eventAffect, people [{ personId, name, mood, affect }]. All private to you.","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchInteractionsBy_interactionId","tags":["Meetups"],"summary":"Change the notes, channel, ratings or (for meetups you logged) the date of a meetup","description":"Fields you leave out stay; null clears. people: moods and ratings of people already in the meetup; who was there does not change. Meetings and calendar events fix their date.","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"date":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"YYYY-MM-DD in your time zone; never later than today"},"channel":{"anyOf":[{"type":"string","enum":["in_person","video","phone","messages"],"description":"How you met up Example: In person · Video call · Phone call · Messages. Sets mode: in_person → in_person, video and phone → remote, messages → async."},{"type":"null"}]},"note":{"description":"Only you see it. The main topics and news, in your own words. Example: Her new job at the museum. His knee surgery is in March.","anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"plans":{"description":"Only you see it. What you want to do together. Add a date if you have one. Example: Hike the Path of the Gods in May. Dinner at ours after the move.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"decisions":{"description":"Only you see it. What you agreed or settled. Example: We split the gift for Luca. Book club moves to Thursdays.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"openQuestions":{"description":"Only you see it. What is not decided yet, or what to ask next time. Example: Will she take the London offer? Ask how the surgery went.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"promisedByMe":{"description":"Only you see it. What you said you will do. In a group, say for whom. Example: Send Ben the photographer's number. Lend Ann the tent.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"promisedToMe":{"description":"Only you see it. What they said they will do. In a group, say who. Example: Ben: intro to his architect friend. Ann: send the recipe.","anyOf":[{"type":"string","maxLength":2000},{"type":"null"}]},"eventAffect":{"description":"How did it feel for you? Example: 1 drained · 2 tired · 3 okay · 4 good · 5 energized","anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"},{"type":"null"}]},"people":{"type":"array","items":{"type":"object","properties":{"personId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"},"mood":{"anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"How they seemed to you. Only you see it. Example: 1 very low · 2 low · 3 okay · 4 good · 5 great"},{"type":"null"}]},"affect":{"description":"Legacy; prefer mood","anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"},{"type":"null"}]}},"required":["personId"]}}}}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"deleteInteractionsBy_interactionId","tags":["Meetups"],"summary":"Delete a meetup and its notes (\"I did not go\")","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions/{interactionId}/rating":{"post":{"operationId":"postInteractionsBy_interactionIdRating","tags":["Meetups"],"summary":"Rate a meetup (null skips the rating and closes the prompt)","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"eventAffect":{"anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"},{"type":"null"}]}},"required":["eventAffect"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions/{interactionId}/people/{personId}/mood":{"post":{"operationId":"postInteractionsBy_interactionIdPeopleBy_personIdMood","tags":["Meetups"],"summary":"Set how one person in a meetup seemed to you (their mood)","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mood":{"anyOf":[{"type":"integer","minimum":1,"maximum":5,"description":"How they seemed to you. Only you see it. Example: 1 very low · 2 low · 3 okay · 4 good · 5 great"},{"type":"null"}]}},"required":["mood"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/interactions/{interactionId}/people/{personId}/rating":{"post":{"operationId":"postInteractionsBy_interactionIdPeopleBy_personIdRating","tags":["Meetups"],"summary":"How it felt for you with this person (legacy; prefer mood and eventAffect)","parameters":[{"name":"interactionId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},{"name":"personId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"affect":{"type":"integer","minimum":1,"maximum":5,"description":"1 (drained) to 5 (energized)"}},"required":["affect"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings":{"get":{"operationId":"getMeetings","tags":["Meetings"],"summary":"Meetings you organize or were invited to, soonest first","description":"`next`: start of the next scheduled date (epoch ms) or null. `myStatus`: invited, accepted, declined.","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postMeetings","tags":["Meetings"],"summary":"Create a meeting and invite people, groups or email addresses","description":"The meeting starts in finding_time. Then GET /meetings/{meetingId}/times for free slots, and POST …/confirm (one time) or …/poll (2 to 4 options). Invitations go out by email at once.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"durationMin":{"type":"integer","minimum":5,"maximum":1440},"where":{"type":"string","enum":["in_person","jitsi","link","google_meet","teams"],"description":"google_meet and teams need a connected calendar of that provider"},"location":{"description":"For in_person","anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"videoUrl":{"description":"For link","anyOf":[{"type":"string","maxLength":500},{"type":"null"}]},"repeat":{"default":"none","type":"string","enum":["none","weekly","biweekly","monthly"]},"searchDays":{"default":14,"description":"How many days ahead to look for a time","type":"integer","minimum":1,"maximum":60},"people":{"default":[],"description":"personId values from GET /people","type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},"groups":{"default":[],"description":"Group ids: invites their active members","type":"array","items":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},"emails":{"default":[],"description":"Guests without an account","maxItems":100,"type":"array","items":{"type":"string","maxLength":254}}},"required":["title","durationMin","where"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}":{"get":{"operationId":"getMeetingsBy_meetingId","tags":["Meetings"],"summary":"One meeting: details, the participants you may see, dates, open poll and your RSVPs","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"patch":{"operationId":"patchMeetingsBy_meetingId","tags":["Meetings"],"summary":"Organizer: change title, description, place or length for the whole meeting","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"description":{"anyOf":[{"type":"string","maxLength":4000},{"type":"null"}]},"location":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}]},"durationMin":{"type":"integer","minimum":5,"maximum":1440}}}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/times":{"get":{"operationId":"getMeetingsBy_meetingIdTimes","tags":["Meetings"],"summary":"Organizer: free times for everyone who shares availability","description":"kind is slots, least_bad (nobody fully free; ranked by who can come), organizer_calendar_failed or no_organizer_time. Rate limited per hour.","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/confirm":{"post":{"operationId":"postMeetingsBy_meetingIdConfirm","tags":["Meetings"],"summary":"Organizer: confirm the start time (sends the confirmation and calendar invites)","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"startsAt":{"description":"Epoch milliseconds, or ISO 8601 with an offset, e.g. 2026-11-03T18:30:00+01:00","anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}]}},"required":["startsAt"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/poll":{"post":{"operationId":"postMeetingsBy_meetingIdPoll","tags":["Meetings"],"summary":"Organizer: let invitees vote on 2 to 4 start times","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"starts":{"minItems":2,"maxItems":4,"type":"array","items":{"description":"Epoch milliseconds, or ISO 8601 with an offset, e.g. 2026-11-03T18:30:00+01:00","anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}]}}},"required":["starts"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/cancel":{"post":{"operationId":"postMeetingsBy_meetingIdCancel","tags":["Meetings"],"summary":"Organizer: cancel the whole meeting (tells everyone)","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/respond":{"post":{"operationId":"postMeetingsBy_meetingIdRespond","tags":["Meetings"],"summary":"Invitee: accept or decline","description":"Accepting lets the organizer see when you are free or busy (never what you do) between the meeting's search dates.","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"accept":{"type":"boolean"}},"required":["accept"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/rsvp":{"post":{"operationId":"postMeetingsBy_meetingIdRsvp","tags":["Meetings"],"summary":"Participant: RSVP to one date of a meeting","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"occurrenceId":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"},"status":{"type":"string","enum":["yes","no","maybe"]}},"required":["occurrenceId","status"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/meetings/{meetingId}/join":{"post":{"operationId":"postMeetingsBy_meetingIdJoin","tags":["Groups"],"summary":"Group member: opt in to a group meeting series","parameters":[{"name":"meetingId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/occurrences/{occurrenceId}/move":{"post":{"operationId":"postOccurrencesBy_occurrenceIdMove","tags":["Meetings"],"summary":"Organizer: move one date","parameters":[{"name":"occurrenceId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"startsAt":{"description":"Epoch milliseconds, or ISO 8601 with an offset, e.g. 2026-11-03T18:30:00+01:00","anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}]}},"required":["startsAt"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/occurrences/{occurrenceId}/split":{"post":{"operationId":"postOccurrencesBy_occurrenceIdSplit","tags":["Meetings"],"summary":"Organizer: move this date and every later one of a series","description":"Returns the meeting that carries the series on (a new id unless this is the first date).","parameters":[{"name":"occurrenceId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"startsAt":{"description":"Epoch milliseconds, or ISO 8601 with an offset, e.g. 2026-11-03T18:30:00+01:00","anyOf":[{"type":"integer","minimum":0,"maximum":8640000000000000},{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}]}},"required":["startsAt"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/occurrences/{occurrenceId}/cancel":{"post":{"operationId":"postOccurrencesBy_occurrenceIdCancel","tags":["Meetings"],"summary":"Organizer: cancel one date","parameters":[{"name":"occurrenceId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups":{"get":{"operationId":"getGroups","tags":["Groups"],"summary":"Groups you belong to or asked to join","responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"postGroups","tags":["Groups"],"summary":"Create a group (you become its owner)","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":80},"description":{"type":"string","maxLength":1000},"joinPolicy":{"type":"string","enum":["open","request","invite"]}},"required":["name","joinPolicy"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{slug}":{"get":{"operationId":"getGroupsBy_slug","tags":["Groups"],"summary":"One group by slug: members and meetings when you are an active member, else the join view","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/join":{"post":{"operationId":"postGroupsBy_groupIdJoin","tags":["Groups"],"summary":"Join (open group) or ask to join (request group)","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/leave":{"post":{"operationId":"postGroupsBy_groupIdLeave","tags":["Groups"],"summary":"Leave a group (the last member leaving deletes it)","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/subscription":{"put":{"operationId":"putGroupsBy_groupIdSubscription","tags":["Groups"],"summary":"Get or stop emails about new group meetings","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"subscribed":{"type":"boolean"}},"required":["subscribed"]}}}},"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/members/{userId}/approve":{"post":{"operationId":"postGroupsBy_groupIdMembersBy_userIdApprove","tags":["Groups"],"summary":"Admin: approve a join request","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}},{"name":"userId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/invitations":{"post":{"operationId":"postGroupsBy_groupIdInvitations","tags":["Groups"],"summary":"Admin: invite someone by email","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","maxLength":254}},"required":["email"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/group-invitations/{token}/accept":{"post":{"operationId":"postGroupInvitationsBy_tokenAccept","tags":["Groups"],"summary":"Accept a group invitation (the token is the last part of the /g/<token> link)","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":20,"maxLength":100,"pattern":"^[\\w-]+$"}}],"responses":{"200":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/groups/{groupId}/meetings":{"post":{"operationId":"postGroupsBy_groupIdMeetings","tags":["Groups"],"summary":"Admin: start a group meeting series (members opt in)","parameters":[{"name":"groupId","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[\\w-]+$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":200},"durationMin":{"type":"integer","minimum":15,"maximum":480},"repeat":{"type":"string","enum":["none","weekly","biweekly","monthly"]}},"required":["title","durationMin","repeat"]}}}},"responses":{"201":{"description":"Success (JSON)","content":{"application/json":{"schema":{}}}},"400":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Not signed in: open /sign-in in the browser"},"404":{"description":"Refused; see error.code and error.message","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"session":{"type":"apiKey","in":"cookie","name":"better-auth.session_token","description":"Set by signing in at /sign-in (prefixed __Secure- on https)."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"issues":{}}}}}}}}