> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syncline.run/llms.txt
> Use this file to discover all available pages before exploring further.

# PUT /v1/meetings/{id}

> Update or reschedule an existing meeting

## Overview

Updates an existing meeting with new times, attendees, or other details. This endpoint modifies the Google Calendar event for all attendees and sends a `meeting.updated` webhook.

## Authentication

Requires **Platform API Key** in the `Authorization` header or `X-API-Key` header.

## Request

```bash theme={null}
PUT https://api.syncline.run/v1/meetings/{meeting_id}
```

### Path Parameters

<ParamField path="meeting_id" type="string" required>
  The meeting ID returned from the original schedule call
</ParamField>

### Request Body

<ParamField body="start_time" type="string" required>
  New meeting start time in RFC3339 format (e.g., `2025-11-26T15:00:00-08:00`)
</ParamField>

<ParamField body="end_time" type="string" required>
  New meeting end time in RFC3339 format (e.g., `2025-11-26T15:30:00-08:00`)
</ParamField>

<ParamField body="attendees" type="array" optional>
  Updated list of attendee emails. If omitted, keeps existing attendees.

  Example: `["alice@example.com", "bob@example.com"]`
</ParamField>

<ParamField body="reason" type="string" optional>
  Reason for the update (included in webhook). Defaults to `"meeting_rescheduled"`.

  Examples:

  * "Rescheduled due to conflict"
  * "Extended meeting duration"
  * "Added new participant"
</ParamField>

### Example Request

```json theme={null}
{
  "start_time": "2025-11-26T15:00:00-08:00",
  "end_time": "2025-11-26T15:30:00-08:00",
  "attendees": ["alice@example.com", "bob@example.com"],
  "reason": "Rescheduled due to conflict"
}
```

## Response

### Success Response (200 OK)

```json theme={null}
{
  "success": true,
  "meeting_id": "meet_abc123",
  "start_time": "2025-11-26T15:00:00-08:00",
  "end_time": "2025-11-26T15:30:00-08:00",
  "attendees": ["alice@example.com", "bob@example.com"],
  "status": "updated"
}
```

### Response Fields

<ResponseField name="success" type="boolean">
  Whether the update succeeded
</ResponseField>

<ResponseField name="meeting_id" type="string">
  ID of the updated meeting (same as request)
</ResponseField>

<ResponseField name="start_time" type="string">
  Confirmed new start time in RFC3339 format
</ResponseField>

<ResponseField name="end_time" type="string">
  Confirmed new end time in RFC3339 format
</ResponseField>

<ResponseField name="attendees" type="array">
  List of attendee emails for the updated meeting
</ResponseField>

<ResponseField name="status" type="string">
  Meeting status (always "updated" on success)
</ResponseField>

## Example

```javascript theme={null}
const response = await fetch('https://api.syncline.run/v1/meetings/meet_abc123', {
  method: 'PUT',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    start_time: '2025-11-26T15:00:00-08:00',
    end_time: '2025-11-26T15:30:00-08:00',
    attendees: ['alice@example.com', 'bob@example.com'],
    reason: 'Rescheduled due to conflict'
  })
});

const result = await response.json();
console.log(`Meeting updated: ${result.meeting_id}`);
```

## Webhook Notification

When a meeting is updated, Syncline sends a `meeting.updated` webhook:

```json theme={null}
{
  "id": "wh_mno345",
  "event_type": "meeting.updated",
  "timestamp": "2025-11-22T11:00:00Z",
  "platform_id": "plat_xyz789",
  "api_version": "v1",
  "data": {
    "meeting_id": "meet_abc123",
    "attendees": ["alice@example.com", "bob@example.com"],
    "updated_at": "2025-11-22T11:00:00Z",
    "changes": {
      "updated_by": "plat_xyz789",
      "reason": "meeting_rescheduled",
      "old_start_time": "2025-11-25T14:00:00-08:00",
      "new_start_time": "2025-11-26T15:00:00-08:00",
      "old_end_time": "2025-11-25T14:30:00-08:00",
      "new_end_time": "2025-11-26T15:30:00-08:00"
    }
  }
}
```

Learn more about [webhooks](/webhooks)

## Notes

* Calendar invites are automatically updated for all attendees
* Google Calendar sends update notifications to attendees
* Both old and new times are included in the webhook for tracking changes
* Only the platform that created the meeting can update it

## Error Responses

<ResponseField name="400 Bad Request" type="error">
  Invalid request body or time format
</ResponseField>

<ResponseField name="401 Unauthorized" type="error">
  Invalid or missing API key
</ResponseField>

<ResponseField name="404 Not Found" type="error">
  Meeting not found or already cancelled
</ResponseField>

<ResponseField name="500 Internal Server Error" type="error">
  Failed to update Google Calendar event
</ResponseField>

## Related Endpoints

<CardGroup cols={2}>
  <Card title="Schedule Meeting" icon="calendar-plus" href="/api-reference/schedule-meeting">
    Create a new meeting
  </Card>

  <Card title="Cancel Meeting" icon="xmark" href="/api-reference/cancel-meeting">
    Cancel an existing meeting
  </Card>
</CardGroup>
