# Update connected calendar event

Propose changing the title or time of an event the acting member organizes on a connected calendar. The member approves the change in Brigg. Supply both start and end when moving it; recurring events are unsupported.

POST https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent

## Access & visibility

Allow `meetings.UpdateConnectedCalendarEvent` on your API key.

**Acting member required.** Send `Brigg-Act-As` with an [approved member account ID](https://developer.brigg.app/authentication#member-delegation). The key supplies permissions; the member selects whose data is used.

The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply.

[Set up authentication](https://developer.brigg.app/authentication) · [Choose permissions](https://developer.brigg.app/permissions)

## Request fields

Send a JSON object with the following fields. Required fields must be included; omit optional fields you do not need.
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `event_id` | string | Yes | Brigg CalendarEvent record ID from ListCalendarEvents for this member's connected-provider event. It is not a Meeting ID or raw provider ID. The member must organize the event; recurring occurrences cannot be changed here. At least 1 character. At most 200 characters. |
| `title` | string | No | Display title. At least 1 character. At most 500 characters. |
| `start` | string | No | ISO 8601 start with an explicit time zone. For an update supply both start and end, or neither. |
| `end` | string | No | ISO 8601 end with an explicit time zone, later than start. Updating only one boundary is refused. |

## Treat this as a proposal, not a completed calendar change

API calls are non-interactive proposals, even with approved member delegation. A standing calendar permission does not bypass human approval here. A valid proposal normally returns awaiting_permission and posts a card to the acting member in Brigg. The member can approve or refuse it there; no public operation approves the card.

For denied, stop: the member's calendar-action policy refuses the proposal. For done, inspect outcome.status. In particular, done with needs_auth means provider access must be connected or renewed; no calendar change happened. Open the returned auth_url only for that member to complete provider consent. The response schema also represents provider execution outcomes: only outcome.status=done denotes a completed attempt; failed includes reason.

Replaying the same idempotency key returns the original proposal response, not live approval status. Do not poll by creating more proposals. After the member acts, check the connected calendar or its synchronized records in [List calendar events](https://developer.brigg.app/reference/meetings/ListCalendarEvents); synchronization can lag. If provider consent changed and the member still wants the action, submit a deliberate new proposal with a new key.

## Provider access and action approval

[List calendar connections](https://developer.brigg.app/reference/meetings/ListCalendarConnections) first. The acting member needs a connected Google or Microsoft account with calendar write permission. The key's grant does not replace the provider's OAuth permission or the member's action policy. API calls propose an action for member approval; a standing setting does not turn an API call into the person's direct action.

Inspect `status`, `outcome` and `permission` before treating the action as complete. A response requiring approval must be continued by the member in Brigg; returning an approval card is not evidence that a provider event was written. Retrying with a new idempotency key can create another logical action.

For update or cancellation, use the Brigg record ID of the synchronized event, not a raw provider ID. A Brigg-owned event without a connected-provider identity uses the separate calendar-event operations.

## Response

Returns **200 OK** with a JSON body.
| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | string | Yes | Proposal state: awaiting_permission requires the member's decision in Brigg; denied means their policy refused it; done requires inspecting outcome.status and does not itself prove a calendar write. Allowed: `"done"`, `"awaiting_permission"`, `"denied"`. |
| `outcome` | [object](#response-outcome) | No | Execution or provider-authorization result when top-level status is done. Missing on an awaiting_permission response. |
| `card` | [CalendarApprovalCard](#calendarapprovalcard-response-card) | No | Approval card delivered to the acting member in Brigg. This is a proposal, not permission granted to the integration. |
| `permission` | string | No | The refused action policy. Calendar proposals use create_calendar_event, including updates and cancellations. |

### response.outcome

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | string | Yes | done denotes a completed provider attempt; failed reports reason; needs_auth requires member provider consent before a new proposal can proceed. Allowed: `"done"`, `"failed"`, `"needs_auth"`. |
| `reason` | string | No | Machine-readable cause, such as missing_scope, no_connection, rate_limited or provider_error. Treat the reason set as extensible; do not assume failed is safe to repeat blindly. |
| `auth_url` | string | No | Member-only continuation URL when outcome.status=needs_auth. Open it for the same acting member to connect or renew provider access; do not fetch it with the API key. |
| `job_id` | string | No | Optional shared action-result field. Calendar proposals do not return a polling job through this field; do not wait for it. |

### CalendarApprovalCard · response.card

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | Yes | Identifier of the approval card. No public API accepts this ID to approve it or poll its decision. |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"card_agent_permission"`. |
| `payload` | [object](#response-card-payload) | Yes | Action details shown for approval when the calendar policy requires review. |

### response.card.payload

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"card_agent_permission"`. |
| `permission` | string | Yes | create_calendar_event for this calendar action. Other values belong to the shared card schema. Allowed: `"create_calendar_event"`, `"send_email"`, `"email_people"`, `"text_people"`, `"place_calls"`, `"use_browser"`. |
| `action` | [object (8 variants)](#response-card-payload-action) | Yes | The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema. |

### response.card.payload.action

#### kind = "browser_task"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"browser_task"`. |
| `goal` | string | Yes | Purpose the proposed agenda should help achieve. |
| `start_url` | string | No | URL where the acting member begins the connection flow. |
| `context` | string | No | Background information available for preparing the agenda. |
| `attachments` | array of [object](#response-card-payload-action-variant1-attachments) | No | Attachments supplied for the related action. |
| `keep_tab_open` | boolean | No | Whether the connection flow requires its browser tab to remain open. Allowed: `false`, `true`. |

### response.card.payload.action.variant1.attachments[]

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `file_id` | string | Yes | File identifier. |
| `name` | string | Yes | Display name. |

#### kind = "place_call"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"place_call"`. |
| `to` | string | Yes | Recipients of the related message or calendar action. |
| `name` | null or string | Yes | Display name. |
| `brief` | string | Yes | Preparation summary for the upcoming meeting. |
| `record_id` | string | No | Record identifier. |

#### kind = "send_sms"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"send_sms"`. |
| `to` | string | Yes | Recipients of the related message or calendar action. |
| `name` | string | Yes | Display name. |
| `text` | string | Yes | Text content. |
| `record_id` | string | No | Record identifier. |
| `unknown_recipient` | boolean | No | Whether the action includes a recipient not already recognized by the caller's policy. Allowed: `false`, `true`. |

#### kind = "contact_person"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"contact_person"`. |
| `to` | string | Yes | Recipients of the related message or calendar action. |
| `subject` | string | Yes | Title or subject supplied for this calendar action. |
| `body` | string | Yes | Descriptive content supplied for the calendar action. |
| `instruction` | string | No | Instructions to use when preparing the requested meeting content. |

#### kind = "send_email"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"send_email"`. |
| `to` | array of string | Yes | Recipients of the related message or calendar action. |
| `cc` | array of string | No | Recipients to copy on the related message. |
| `subject` | string | Yes | Title or subject supplied for this calendar action. |
| `body` | string | Yes | Descriptive content supplied for the calendar action. |

#### kind = "create_calendar_event"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"create_calendar_event"`. |
| `title` | string | Yes | Display title. |
| `start` | string | Yes | Start of the interval. |
| `end` | string | Yes | End of the interval; must be later than its start. |
| `attendees` | array of string | No | People invited to the event and their invitation details. |
| `add_conference` | boolean | No | Whether to request a video-conference link from the connected calendar provider. Allowed: `false`, `true`. |
| `provider` | string | No | Connected calendar provider used for this action. Allowed: `"google"`, `"microsoft"`. |

#### kind = "update_calendar_event"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"update_calendar_event"`. |
| `event_id` | string | Yes | The same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase. |
| `current` | [object](#response-card-payload-action-variant7-current) | Yes | Snapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval. |
| `title` | string | No | Display title. |
| `start` | string | No | Start of the interval. |
| `end` | string | No | End of the interval; must be later than its start. |

### response.card.payload.action.variant7.current

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `title` | string | Yes | Display title. |
| `start` | string | Yes | Start of the interval. |
| `end` | string | Yes | End of the interval; must be later than its start. |

#### kind = "cancel_calendar_event"

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `kind` | string | Yes | Category identifying which variant of this model applies. Always `"cancel_calendar_event"`. |
| `event_id` | string | Yes | The same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase. |
| `current` | [object](#response-card-payload-action-variant8-current) | Yes | Snapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval. |

### response.card.payload.action.variant8.current

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `title` | string | Yes | Display title. |
| `start` | string | Yes | Start of the interval. |
| `end` | string | Yes | End of the interval; must be later than its start. |

## Errors & retries

Set `BRIGG_REQUEST_ID` once for each logical action. The samples send it as `Idempotency-Key`. Reuse the same value and body on retries, including after a timeout; a missing response does not prove the action failed.

For rate limits, follow the server’s retry guidance and back off. See [HTTP errors](https://developer.brigg.app/http#errors) and [safe retries and limits](https://developer.brigg.app/reliability).

| HTTP status | Code | What to do |
| --- | --- | --- |
| 400 | `invalid_json` | Send a JSON object with Content-Type: application/json. |
| 400 | `invalid_input` | Check the request fields and types. Supply a stable Idempotency-Key containing 1–200 characters. |
| 401 | `invalid_key` | The workspace API key is missing, invalid or revoked. |
| 403 | `forbidden` | Check the key’s operation and resource grants. Supply Brigg-Act-As with a member authorized by the key’s delegation grant. The selected member must be active and approved by the credential. This selects whose private data is used; the credential supplies permissions. Private ownership and project boundaries still apply. |
| 404 | `not_found` | The requested operation or resource is not available to this credential. |
| 429 | `rate_limited` | Wait for Retry-After before retrying. Reuse the original Idempotency-Key. |
| 400 | `event_not_found` | Choose the acting member's synchronized CalendarEvent ID, not a Meeting ID. |
| 400 | `not_organizer` | Only the event's organizer can change it. Ask the organizer to act. |
| 400 | `recurring_event` | Edit repeating events in the provider calendar; this API does not change occurrences or series. |
| 400 | `invalid_range` | Use an end after start with explicit time zones. |
| 400 | `invalid_action` | An update must change a title or supply both start and end. |

## Next steps

- [List calendar connections](https://developer.brigg.app/reference/meetings/ListCalendarConnections)
- [List calendar events](https://developer.brigg.app/reference/meetings/ListCalendarEvents)

[Download OpenAPI](https://developer.brigg.app/openapi.json) · [Versioning & retirement](https://developer.brigg.app/versioning)

## Examples

### Member approval is required

HTTP 200 means the proposal was processed. No provider event has been changed yet.
#### cURL


```sh
curl 'https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Brigg-Act-As: $BRIGG_ACT_AS" \
  -H "Idempotency-Key: $BRIGG_REQUEST_ID" \
  --data-raw '{
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}'
```

#### TypeScript


```typescript
const actAs = process.env.BRIGG_ACT_AS;
if (!actAs) throw new Error("Set BRIGG_ACT_AS to an approved member account ID.");

const requestId = process.env.BRIGG_REQUEST_ID;
if (!requestId) throw new Error("Set BRIGG_REQUEST_ID once per action and reuse it on retries.");

const response = await fetch("https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
    "Content-Type": "application/json",
    "Brigg-Act-As": actAs,
    "Idempotency-Key": requestId, // Create once per action; reuse on retries.
  },
  body: JSON.stringify({
    "event_id": "e_calendar_kickoff",
    "title": "Northstar planning review"
  }),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error} — ${result.message}`);
console.log(result);
```

#### Python


```python
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError

request_id = os.environ["BRIGG_REQUEST_ID"]  # Reuse for retries of this action.
payload = {
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}
request = Request(
    "https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['BRIGG_API_KEY']}",
        "Content-Type": "application/json",
        "Brigg-Act-As": os.environ["BRIGG_ACT_AS"],
        "Idempotency-Key": request_id,  # Create once per action; reuse on retries.
    },
    method="POST",
)
try:
    with urlopen(request) as response:
        print(json.load(response))
except HTTPError as error:
    print(error.code, json.load(error))
    raise
```

#### Response example


```json
{
  "status": "awaiting_permission",
  "card": {
    "id": "card_calendar_proposal",
    "kind": "card_agent_permission",
    "payload": {
      "kind": "card_agent_permission",
      "permission": "create_calendar_event",
      "action": {
        "kind": "update_calendar_event",
        "event_id": "e_calendar_kickoff",
        "current": {
          "title": "Northstar project kickoff",
          "start": "2026-11-10T09:00:00.000Z",
          "end": "2026-11-10T09:45:00.000Z"
        },
        "title": "Northstar planning review"
      }
    }
  }
}
```

### The member's policy refuses the action

Stop here. Broader key grants do not override the member's action policy.
#### cURL


```sh
curl 'https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Brigg-Act-As: $BRIGG_ACT_AS" \
  -H "Idempotency-Key: $BRIGG_REQUEST_ID" \
  --data-raw '{
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}'
```

#### TypeScript


```typescript
const actAs = process.env.BRIGG_ACT_AS;
if (!actAs) throw new Error("Set BRIGG_ACT_AS to an approved member account ID.");

const requestId = process.env.BRIGG_REQUEST_ID;
if (!requestId) throw new Error("Set BRIGG_REQUEST_ID once per action and reuse it on retries.");

const response = await fetch("https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
    "Content-Type": "application/json",
    "Brigg-Act-As": actAs,
    "Idempotency-Key": requestId, // Create once per action; reuse on retries.
  },
  body: JSON.stringify({
    "event_id": "e_calendar_kickoff",
    "title": "Northstar planning review"
  }),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error} — ${result.message}`);
console.log(result);
```

#### Python


```python
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError

request_id = os.environ["BRIGG_REQUEST_ID"]  # Reuse for retries of this action.
payload = {
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}
request = Request(
    "https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['BRIGG_API_KEY']}",
        "Content-Type": "application/json",
        "Brigg-Act-As": os.environ["BRIGG_ACT_AS"],
        "Idempotency-Key": request_id,  # Create once per action; reuse on retries.
    },
    method="POST",
)
try:
    with urlopen(request) as response:
        print(json.load(response))
except HTTPError as error:
    print(error.code, json.load(error))
    raise
```

#### Response example


```json
{
  "status": "denied",
  "permission": "create_calendar_event"
}
```

### Provider consent needs attention

This does not cancel or update the event. The acting member must complete the provider connection first.
#### cURL


```sh
curl 'https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent' \
  -H "Authorization: Bearer $BRIGG_API_KEY" \
  -H 'Content-Type: application/json' \
  -H "Brigg-Act-As: $BRIGG_ACT_AS" \
  -H "Idempotency-Key: $BRIGG_REQUEST_ID" \
  --data-raw '{
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}'
```

#### TypeScript


```typescript
const actAs = process.env.BRIGG_ACT_AS;
if (!actAs) throw new Error("Set BRIGG_ACT_AS to an approved member account ID.");

const requestId = process.env.BRIGG_REQUEST_ID;
if (!requestId) throw new Error("Set BRIGG_REQUEST_ID once per action and reuse it on retries.");

const response = await fetch("https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BRIGG_API_KEY}`,
    "Content-Type": "application/json",
    "Brigg-Act-As": actAs,
    "Idempotency-Key": requestId, // Create once per action; reuse on retries.
  },
  body: JSON.stringify({
    "event_id": "e_calendar_kickoff",
    "title": "Northstar planning review"
  }),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error} — ${result.message}`);
console.log(result);
```

#### Python


```python
import json
import os
from urllib.request import Request, urlopen
from urllib.error import HTTPError

request_id = os.environ["BRIGG_REQUEST_ID"]  # Reuse for retries of this action.
payload = {
  "event_id": "e_calendar_kickoff",
  "title": "Northstar planning review"
}
request = Request(
    "https://api.brigg.app/v1/operations/meetings.UpdateConnectedCalendarEvent",
    data=json.dumps(payload).encode("utf-8"),
    headers={
        "Authorization": f"Bearer {os.environ['BRIGG_API_KEY']}",
        "Content-Type": "application/json",
        "Brigg-Act-As": os.environ["BRIGG_ACT_AS"],
        "Idempotency-Key": request_id,  # Create once per action; reuse on retries.
    },
    method="POST",
)
try:
    with urlopen(request) as response:
        print(json.load(response))
except HTTPError as error:
    print(error.code, json.load(error))
    raise
```

#### Response example


```json
{
  "status": "done",
  "outcome": {
    "status": "needs_auth",
    "reason": "missing_scope",
    "auth_url": "https://app.example.com/account"
  }
}
```

## JSON schemas


```json-schema-request
{
  "type": "object",
  "properties": {
    "event_id": {
      "type": "string",
      "minLength": 1,
      "maxLength": 200,
      "description": "Brigg CalendarEvent record ID from ListCalendarEvents for this member's connected-provider event. It is not a Meeting ID or raw provider ID. The member must organize the event; recurring occurrences cannot be changed here."
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 500,
      "description": "Display title."
    },
    "start": {
      "type": "string",
      "description": "ISO 8601 start with an explicit time zone. For an update supply both start and end, or neither."
    },
    "end": {
      "type": "string",
      "description": "ISO 8601 end with an explicit time zone, later than start. Updating only one boundary is refused."
    }
  },
  "required": [
    "event_id"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "event_id": "e_calendar_kickoff",
      "title": "Northstar planning review"
    }
  ]
}
```


```json-schema-response
{
  "type": "object",
  "description": "done means the policy allowed an attempt: inspect outcome.status for the provider result. awaiting_permission means a person must approve the action in Brigg. denied means the member's policy refused it. An approval response is not a completed provider write.",
  "properties": {
    "status": {
      "type": "string",
      "enum": [
        "done",
        "awaiting_permission",
        "denied"
      ],
      "description": "Proposal state: awaiting_permission requires the member's decision in Brigg; denied means their policy refused it; done requires inspecting outcome.status and does not itself prove a calendar write."
    },
    "outcome": {
      "type": "object",
      "properties": {
        "status": {
          "type": "string",
          "enum": [
            "done",
            "failed",
            "needs_auth"
          ],
          "description": "done denotes a completed provider attempt; failed reports reason; needs_auth requires member provider consent before a new proposal can proceed."
        },
        "reason": {
          "type": "string",
          "description": "Machine-readable cause, such as missing_scope, no_connection, rate_limited or provider_error. Treat the reason set as extensible; do not assume failed is safe to repeat blindly."
        },
        "auth_url": {
          "type": "string",
          "description": "Member-only continuation URL when outcome.status=needs_auth. Open it for the same acting member to connect or renew provider access; do not fetch it with the API key."
        },
        "job_id": {
          "type": "string",
          "description": "Optional shared action-result field. Calendar proposals do not return a polling job through this field; do not wait for it."
        }
      },
      "required": [
        "status"
      ],
      "additionalProperties": false,
      "description": "Execution or provider-authorization result when top-level status is done. Missing on an awaiting_permission response."
    },
    "card": {
      "description": "Approval card delivered to the acting member in Brigg. This is a proposal, not permission granted to the integration.",
      "title": "CalendarApprovalCard",
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Identifier of the approval card. No public API accepts this ID to approve it or poll its decision."
        },
        "kind": {
          "type": "string",
          "const": "card_agent_permission",
          "description": "Category identifying which variant of this model applies."
        },
        "payload": {
          "type": "object",
          "properties": {
            "kind": {
              "type": "string",
              "const": "card_agent_permission",
              "description": "Category identifying which variant of this model applies."
            },
            "permission": {
              "type": "string",
              "enum": [
                "create_calendar_event",
                "send_email",
                "email_people",
                "text_people",
                "place_calls",
                "use_browser"
              ],
              "description": "create_calendar_event for this calendar action. Other values belong to the shared card schema."
            },
            "action": {
              "anyOf": [
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "browser_task",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "goal": {
                      "type": "string",
                      "description": "Purpose the proposed agenda should help achieve."
                    },
                    "start_url": {
                      "type": "string",
                      "description": "URL where the acting member begins the connection flow."
                    },
                    "context": {
                      "type": "string",
                      "description": "Background information available for preparing the agenda."
                    },
                    "attachments": {
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "file_id": {
                            "type": "string",
                            "description": "File identifier."
                          },
                          "name": {
                            "type": "string",
                            "description": "Display name."
                          }
                        },
                        "required": [
                          "file_id",
                          "name"
                        ],
                        "additionalProperties": false
                      },
                      "description": "Attachments supplied for the related action."
                    },
                    "keep_tab_open": {
                      "type": "boolean",
                      "enum": [
                        false,
                        true
                      ],
                      "description": "Whether the connection flow requires its browser tab to remain open."
                    }
                  },
                  "required": [
                    "kind",
                    "goal"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "place_call",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "to": {
                      "type": "string",
                      "description": "Recipients of the related message or calendar action."
                    },
                    "name": {
                      "anyOf": [
                        {
                          "type": "null"
                        },
                        {
                          "type": "string"
                        }
                      ],
                      "description": "Display name."
                    },
                    "brief": {
                      "type": "string",
                      "description": "Preparation summary for the upcoming meeting."
                    },
                    "record_id": {
                      "type": "string",
                      "description": "Record identifier."
                    }
                  },
                  "required": [
                    "kind",
                    "to",
                    "name",
                    "brief"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "send_sms",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "to": {
                      "type": "string",
                      "description": "Recipients of the related message or calendar action."
                    },
                    "name": {
                      "type": "string",
                      "description": "Display name."
                    },
                    "text": {
                      "type": "string",
                      "description": "Text content."
                    },
                    "record_id": {
                      "type": "string",
                      "description": "Record identifier."
                    },
                    "unknown_recipient": {
                      "type": "boolean",
                      "enum": [
                        false,
                        true
                      ],
                      "description": "Whether the action includes a recipient not already recognized by the caller's policy."
                    }
                  },
                  "required": [
                    "kind",
                    "to",
                    "name",
                    "text"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "contact_person",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "to": {
                      "type": "string",
                      "description": "Recipients of the related message or calendar action."
                    },
                    "subject": {
                      "type": "string",
                      "description": "Title or subject supplied for this calendar action."
                    },
                    "body": {
                      "type": "string",
                      "description": "Descriptive content supplied for the calendar action."
                    },
                    "instruction": {
                      "type": "string",
                      "description": "Instructions to use when preparing the requested meeting content."
                    }
                  },
                  "required": [
                    "kind",
                    "to",
                    "subject",
                    "body"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "send_email",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "to": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Recipients of the related message or calendar action."
                    },
                    "cc": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "Recipients to copy on the related message."
                    },
                    "subject": {
                      "type": "string",
                      "description": "Title or subject supplied for this calendar action."
                    },
                    "body": {
                      "type": "string",
                      "description": "Descriptive content supplied for the calendar action."
                    }
                  },
                  "required": [
                    "kind",
                    "to",
                    "subject",
                    "body"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "create_calendar_event",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "title": {
                      "type": "string",
                      "description": "Display title."
                    },
                    "start": {
                      "type": "string",
                      "description": "Start of the interval."
                    },
                    "end": {
                      "type": "string",
                      "description": "End of the interval; must be later than its start."
                    },
                    "attendees": {
                      "type": "array",
                      "items": {
                        "type": "string"
                      },
                      "description": "People invited to the event and their invitation details."
                    },
                    "add_conference": {
                      "type": "boolean",
                      "enum": [
                        false,
                        true
                      ],
                      "description": "Whether to request a video-conference link from the connected calendar provider."
                    },
                    "provider": {
                      "type": "string",
                      "enum": [
                        "google",
                        "microsoft"
                      ],
                      "description": "Connected calendar provider used for this action."
                    }
                  },
                  "required": [
                    "kind",
                    "title",
                    "start",
                    "end"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "update_calendar_event",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "event_id": {
                      "type": "string",
                      "description": "The same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase."
                    },
                    "current": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "description": "Display title."
                        },
                        "start": {
                          "type": "string",
                          "description": "Start of the interval."
                        },
                        "end": {
                          "type": "string",
                          "description": "End of the interval; must be later than its start."
                        }
                      },
                      "required": [
                        "title",
                        "start",
                        "end"
                      ],
                      "additionalProperties": false,
                      "description": "Snapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval."
                    },
                    "title": {
                      "type": "string",
                      "description": "Display title."
                    },
                    "start": {
                      "type": "string",
                      "description": "Start of the interval."
                    },
                    "end": {
                      "type": "string",
                      "description": "End of the interval; must be later than its start."
                    }
                  },
                  "required": [
                    "kind",
                    "event_id",
                    "current"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                },
                {
                  "type": "object",
                  "properties": {
                    "kind": {
                      "type": "string",
                      "const": "cancel_calendar_event",
                      "description": "Category identifying which variant of this model applies."
                    },
                    "event_id": {
                      "type": "string",
                      "description": "The same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase."
                    },
                    "current": {
                      "type": "object",
                      "properties": {
                        "title": {
                          "type": "string",
                          "description": "Display title."
                        },
                        "start": {
                          "type": "string",
                          "description": "Start of the interval."
                        },
                        "end": {
                          "type": "string",
                          "description": "End of the interval; must be later than its start."
                        }
                      },
                      "required": [
                        "title",
                        "start",
                        "end"
                      ],
                      "additionalProperties": false,
                      "description": "Snapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval."
                    }
                  },
                  "required": [
                    "kind",
                    "event_id",
                    "current"
                  ],
                  "additionalProperties": false,
                  "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
                }
              ],
              "description": "The proposed calendar change. Only kind=update_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
            }
          },
          "required": [
            "kind",
            "permission",
            "action"
          ],
          "additionalProperties": false,
          "description": "Action details shown for approval when the calendar policy requires review."
        }
      },
      "required": [
        "id",
        "kind",
        "payload"
      ],
      "additionalProperties": false
    },
    "permission": {
      "type": "string",
      "description": "The refused action policy. Calendar proposals use create_calendar_event, including updates and cancellations."
    }
  },
  "required": [
    "status"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "status": "awaiting_permission",
      "card": {
        "id": "card_calendar_proposal",
        "kind": "card_agent_permission",
        "payload": {
          "kind": "card_agent_permission",
          "permission": "create_calendar_event",
          "action": {
            "kind": "update_calendar_event",
            "event_id": "e_calendar_kickoff",
            "current": {
              "title": "Northstar project kickoff",
              "start": "2026-11-10T09:00:00.000Z",
              "end": "2026-11-10T09:45:00.000Z"
            },
            "title": "Northstar planning review"
          }
        }
      }
    }
  ]
}
```

