Access & visibility
Allow meetings.CreateConnectedCalendarEvent on your API key.
Acting member required. Send Brigg-Act-As with an approved member account ID. 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.
Request fields
Send a JSON object with the following fields. Required fields must be included; omit optional fields you do not need.
titlestringRequiredDisplay title.
At least 1 character. At most 500 characters.
startstringRequiredISO 8601 start with an explicit time zone. For an update supply both start and end, or neither.
endstringRequiredISO 8601 end with an explicit time zone, later than start. Updating only one boundary is refused.
attendeesarray of stringOptionalInvitee email addresses for the connected provider, not workspace account IDs. Invitation delivery follows member approval.
At most 100 items.
add_conferencebooleanOptionalAttach a Meet/Teams link (default true).
providerstringOptionalChoose an enabled connection with calendar write permission. Provider permissions and the member's Brigg action policy both apply. meetings.ListCalendarConnections.
Allowed: "google", "microsoft".
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; 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 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.
statusstringRequiredProposal 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".
outcomeobjectOptionalExecution or provider-authorization result when top-level status is done. Missing on an awaiting_permission response.
Nested fields
statusstringRequireddone 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".
reasonstringOptionalMachine-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_urlstringOptionalMember-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_idstringOptionalOptional shared action-result field. Calendar proposals do not return a polling job through this field; do not wait for it.
cardCalendarApprovalCardOptionalApproval card delivered to the acting member in Brigg. This is a proposal, not permission granted to the integration.
CalendarApprovalCard
idstringRequiredIdentifier of the approval card. No public API accepts this ID to approve it or poll its decision.
kind"card_agent_permission"RequiredCategory identifying which variant of this model applies.
Always "card_agent_permission".
payloadobjectRequiredAction details shown for approval when the calendar policy requires review.
Nested fields
kind"card_agent_permission"RequiredCategory identifying which variant of this model applies.
Always "card_agent_permission".
permissionstringRequiredcreate_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".
actionobject (8 variants)RequiredThe proposed calendar change. Only kind=create_calendar_event applies to this operation; other variants belong to the shared approval-card schema.
Nested fields
kind = "browser_task"
kind"browser_task"RequiredCategory identifying which variant of this model applies.
Always "browser_task".
goalstringRequiredPurpose the proposed agenda should help achieve.
start_urlstringOptionalURL where the acting member begins the connection flow.
contextstringOptionalBackground information available for preparing the agenda.
attachmentsarray of objectOptionalAttachments supplied for the related action.
Item fields
file_idstringRequiredFile identifier.
namestringRequiredDisplay name.
keep_tab_openbooleanOptionalWhether the connection flow requires its browser tab to remain open.
Allowed: false, true.
kind = "place_call"
kind"place_call"RequiredCategory identifying which variant of this model applies.
Always "place_call".
tostringRequiredRecipients of the related message or calendar action.
namenull or stringRequiredDisplay name.
briefstringRequiredPreparation summary for the upcoming meeting.
record_idstringOptionalRecord identifier.
kind = "send_sms"
kind"send_sms"RequiredCategory identifying which variant of this model applies.
Always "send_sms".
tostringRequiredRecipients of the related message or calendar action.
namestringRequiredDisplay name.
textstringRequiredText content.
record_idstringOptionalRecord identifier.
unknown_recipientbooleanOptionalWhether the action includes a recipient not already recognized by the caller's policy.
Allowed: false, true.
kind = "contact_person"
kind"contact_person"RequiredCategory identifying which variant of this model applies.
Always "contact_person".
tostringRequiredRecipients of the related message or calendar action.
subjectstringRequiredTitle or subject supplied for this calendar action.
bodystringRequiredDescriptive content supplied for the calendar action.
instructionstringOptionalInstructions to use when preparing the requested meeting content.
kind = "send_email"
kind"send_email"RequiredCategory identifying which variant of this model applies.
Always "send_email".
toarray of stringRequiredRecipients of the related message or calendar action.
ccarray of stringOptionalRecipients to copy on the related message.
subjectstringRequiredTitle or subject supplied for this calendar action.
bodystringRequiredDescriptive content supplied for the calendar action.
kind = "create_calendar_event"
kind"create_calendar_event"RequiredCategory identifying which variant of this model applies.
Always "create_calendar_event".
titlestringRequiredDisplay title.
startstringRequiredStart of the interval.
endstringRequiredEnd of the interval; must be later than its start.
attendeesarray of stringOptionalPeople invited to the event and their invitation details.
add_conferencebooleanOptionalWhether to request a video-conference link from the connected calendar provider.
Allowed: false, true.
providerstringOptionalConnected calendar provider used for this action.
Allowed: "google", "microsoft".
kind = "update_calendar_event"
kind"update_calendar_event"RequiredCategory identifying which variant of this model applies.
Always "update_calendar_event".
event_idstringRequiredThe same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase.
currentobjectRequiredSnapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval.
Nested fields
titlestringRequiredDisplay title.
startstringRequiredStart of the interval.
endstringRequiredEnd of the interval; must be later than its start.
titlestringOptionalDisplay title.
startstringOptionalStart of the interval.
endstringOptionalEnd of the interval; must be later than its start.
kind = "cancel_calendar_event"
kind"cancel_calendar_event"RequiredCategory identifying which variant of this model applies.
Always "cancel_calendar_event".
event_idstringRequiredThe same Brigg CalendarEvent record ID supplied as event_id. The card uses camelCase.
currentobjectRequiredSnapshot of the synchronized event when the proposal was prepared, not a promise that the event cannot change before approval.
Nested fields
titlestringRequiredDisplay title.
startstringRequiredStart of the interval.
endstringRequiredEnd of the interval; must be later than its start.
permissionstringOptionalThe refused action policy. Calendar proposals use create_calendar_event, including updates and cancellations.
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 and safe retries and limits.
| 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 | 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
JSON schemas
Use the complete schemas for validation or client generation.
Full request JSON schema
{
"type": "object",
"properties": {
"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."
},
"attendees": {
"type": "array",
"items": {
"type": "string",
"format": "email"
},
"maxItems": 100,
"description": "Invitee email addresses for the connected provider, not workspace account IDs. Invitation delivery follows member approval."
},
"add_conference": {
"type": "boolean",
"description": "Attach a Meet/Teams link (default true)."
},
"provider": {
"type": "string",
"enum": [
"google",
"microsoft"
],
"description": "Choose an enabled connection with calendar write permission. Provider permissions and the member's Brigg action policy both apply. [meetings.ListCalendarConnections](/reference/meetings/ListCalendarConnections)."
}
},
"required": [
"title",
"start",
"end"
],
"additionalProperties": false,
"examples": [
{
"title": "Northstar project kickoff",
"start": "2026-11-10T09:00:00.000Z",
"end": "2026-11-10T09:45:00.000Z",
"attendees": [
"alex@example.com"
]
}
]
}Full response JSON schema
{
"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=create_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=create_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=create_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=create_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=create_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=create_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=create_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=create_calendar_event applies to this operation; other variants belong to the shared approval-card schema."
}
],
"description": "The proposed calendar change. Only kind=create_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": "create_calendar_event",
"title": "Northstar project kickoff",
"start": "2026-11-10T09:00:00.000Z",
"end": "2026-11-10T09:45:00.000Z",
"attendees": [
"alex@example.com"
]
}
}
}
}
]
}