Meetings and roles

Two things automations most often do for people: put a meeting on the calendar, and give someone a role. Both go through the same code as the Missived app, so the same rules apply: invites are emailed by Missived, outside guests are allowed only where the org allows them, and only owners and admins hand out roles.

Schedule a meeting

A meeting is organised by a person, so this needs a personal token (or a person's OAuth connection) with meetings:write. An app token gets 403: bots have no calendar.

curl -X POST https://api.missived.com/v1/orgs/$ORG_ID/meetings \
  -H "Authorization: Bearer $MISSIVED_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: weekly-sync-2026-10-20" \
  -d '{
    "title": "Weekly sync",
    "agenda": "Roadmap, then open questions",
    "start_time": "2026-10-20T15:00:00Z",
    "duration_minutes": 30,
    "time_zone": "America/New_York",
    "invitees": [
      { "user_id": "u_123" },
      { "email": "[email protected]", "name": "Vic", "role": "participant" }
    ]
  }'

The answer (201) is the meeting, with its id and join_url. Everyone invited gets an email with a calendar file, unless you send "send_invites": false.

Errors keep the meeting's own codes: invalid_time (start, length or zone), invalid_settings, too_many_invitees (200, of whom at most 100 from outside) and invalid_request. The message names the field.

Change, re-invite or cancel

Only the meeting's organiser can do these. Anyone else who can see the meeting gets 403. Anyone who can't see it gets 404.

Call What it does
PATCH /v1/meetings/{meetingId} Change title, agenda, start_time, duration_minutes, time_zone or room_type. Fields you leave out keep their value. You can move a meeting only before it starts.
PUT /v1/meetings/{meetingId}/invitees Set the whole invitee list. New people are invited, people you leave out are sent a cancellation, and a changed role is applied.
POST /v1/meetings/{meetingId}/cancel Cancel it before it starts, with an optional reason. A live meeting is ended in the app instead (409).

Each one emails the people concerned unless you send "notify": false. A cancelled meeting answers 410 with meeting_cancelled to any further change.

These changes fire the meeting.scheduled, meeting.updated and meeting.cancelled events. A change made with "notify": false fires no event.

Give or take a custom role

# Give
curl -X PUT https://api.missived.com/v1/orgs/$ORG_ID/members/$USER_ID/roles/$ROLE_ID \
  -H "Authorization: Bearer $MISSIVED_TOKEN"

# Take away
curl -X DELETE https://api.missived.com/v1/orgs/$ORG_ID/members/$USER_ID/roles/$ROLE_ID \
  -H "Authorization: Bearer $MISSIVED_TOKEN"

Role ids come from GET /v1/orgs/{orgId}/roles. Both calls answer with the member and their custom roles. Giving a role they already have, or taking one they don't have, changes nothing and still answers 200.

Each change fires member.role_assigned or member.role_removed. The payload has member, role { id, name }, source (manual, or linked for a rule) and actor. The bot gateway sends these events under the members intent.