# Schedule/Send a Meeting Agent

> **BETA**

In addition to [attaching a Meeting Agent to an event](/developers/api/meeting-agents/provisioning/index.md)
, given a conference join URL, it is possible to directly schedule a Meeting Agent
to join the meeting either immediately or in the future.

> **INFO:** To enable this feature you will need to toggle it on in the Features section for your application in the Cronofy developer dashboard.

## Immediate dispatch
When dispatching immediately, only a [`join_url`](#param-join_url) and
[`on_behalf_of_attendee`](#param-on_behalf_of_attendee) is required, and the
response will contain the Meeting Agent state at the point of creation.

Future state changes and meeting artefacts are available as part of [notification callbacks](#example-callbacks).

Meeting Agents created this way will be dispatched as soon as possible. Scheduling for a future time, when possible, will give you a more reliable timing as it allows us to provision the required resources ahead of time.

### Example Request
```http
POST /v1/meeting_agents HTTP/1.1
Host: {data_center_url}
Authorization: Bearer {API_KEY}
Content-Type: application/json; charset=utf-8

{
  "join_url": "https://teams.microsoft.com/meet/00000000000000?p=abcdefg",
  "on_behalf_of_attendee": {
    "email": "marty@evenitron.com"
  },
  "subscriptions": [
    {
      "type": "webhook",
      "uri": "https://example.com/notification",
      "interactions": [
        { "type": "meeting_agent_activated" },
        { "type": "meeting_agent_complete" },
        { "type": "meeting_agent_failed" }
      ]
    }
  ]
}
```

### Example Response
```http
HTTP/1.1 200 OK

{
  "meeting_agent": {
    "sub": "agt_692702a100ccd07000000000",
    "state": "created",
    "resources": [
      {
        "category": "cronofy",
        "type": "dashboard",
        "url": "https://..."
      }
    ]
  }
}
```

## Future scheduling
When scheduling for the future, [`scheduling_key`](#param-scheduling_key) and [`join_time`](#param-join_time) parameters are provided and a `202 Accepted` response is generated. Status information, and meeting artefacts will provided as part of [notification callbacks]().

### Example Request
```http
POST /v1/meeting_agents HTTP/1.1
Host: {data_center_url}
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json; charset=utf-8

{
  "scheduling_key": "your-identifier-for-this-unique-meeting",
  "join_time": "2026-05-06T15:30:00Z",
  "join_url": "https://teams.microsoft.com/meet/00000000000000?p=abcdefg",
  "on_behalf_of_attendee": {
    "email": "marty@evenitron.com"
  },
  "subscriptions": [
    {
      "type": "webhook",
      "uri": "https://example.com/notification",
      "interactions": [
        { "type": "meeting_agent_activated" },
        { "type": "meeting_agent_complete" },
        { "type": "meeting_agent_failed" }
      ]
    }
  ]
}
```

### Example Response
```http
HTTP/1.1 202 Accepted
```

### Request Parameters
##### `data_center_url` *(required)*

The URL for the data center you want to communicate with. Possible choices are:

- `api-au.cronofy.com` - Australia
- `api-ca.cronofy.com` - Canada
- `api-de.cronofy.com` - Germany
- `api-sg.cronofy.com` - Singapore
- `api-uk.cronofy.com` - United Kingdom
- `api.cronofy.com` - United States

Find out more about [Cronofy's data centers](/developers/data-centers/index.md).
##### `scheduling_key` *(optional)*

Required when including a [`join_time`](#param-join_time).

The `scheduling_key` identifies the Meeting Agent for rescheduling or cancelling a previously-scheduled Meeting Agent.

Providing the same `scheduling_key` as a previous call to this API enables you to update the `join_url`, `join_time`, and `subscriptions` of an already scheduled Meeting Agent.

If the previously-scheduled Meeting Agent has already begun joining the meeting, then it will remain active, and a new Meeting Agent will be scheduled.

If no scheduling key is provided a new Meeting Agent is created each time and cannot be rescheduled.

##### `join_time` *(optional)*

Required when including a [`scheduling_key`](#param-scheduling_key).

The date and time at which the Meeting Agent should join the meeting, provided as a [`Time`](/developers/api/data-types/index.md) string.

It must represent a future point in time.

The Meeting Agent will schedule itself to join the meeting on or slightly before the `join_time`.

If no join time is provided the Meeting Agent will join the meeting as soon as possible.

> **INFO:** Providing less than 5 minutes notice may result in the Meeting Agent joining the meeting after the requested time.

##### `join_url` *(required)*

The URL of the meeting that the Meeting Agent should attempt to join.

Must be a valid HTTPS URL for a Microsoft Teams, Google Meet, or Zoom meeting.

##### `display_name` *(optional)*

The name of the Meeting Agent as displayed when it joins the meeting.

If not provided the Meeting Agent will use the name specified by your [application branding](/developers/application-management/customization/index.md).

##### `image_url` *(optional)*

An optional URL which hosts an image that the Meeting Agent will display while in the meeting.

This image URL will be accessed for use shortly before the Meeting Agent joins a given meeting, so must remain accessible when scheduling ahead of time.

We recommend a PNG or JPEG image sized to a 16:9 aspect ratio.

If not provided the Meeting Agent will use the image specified by your [application branding](/developers/application-management/customization/index.md).
##### `on_behalf_of_attendee` *(required)*


An object identifying an attendee of the meeting, who the Meeting Agent is joining
on behalf of.

Zoom requires that applications such as Cronofy Meeting Agents are attributed to
an attendee of the meeting, and Meeting Agents can only be active when this attendee is present.

For further details on how we use this email, please see our [Zoom Authorization Flow](/developers/meeting-agents/zoom-authorization/index.md) documentation.

##### `on_behalf_of_attendee.email` *(required)*

The email address of a meeting attendee who the Meeting Agent is joining on behalf of.

##### `subscriptions` *(optional)*

Object containing an array of subscriptions.

> **INFO:** Subscriptions are required to programatically access Meeting Agent resources

##### `subscriptions[].type` *(optional)*

Only one value of `webhook` is supported.

##### `subscriptions[].uri` *(optional)*

The URI within your application you want Cronofy to send notifications to when the interaction is triggered. Must be an externally accessible HTTP or HTTPS URI.

##### `subscriptions[].interactions` *(optional)*

An array of interactions that should trigger a call to the `uri`.

##### `subscriptions[].interactions[].type` *(optional)*

The type of interaction. Currently supported are:

- `meeting_agent_activated` - sent when the Meeting Agent is preparing to join the meeting. This will be up to 5 minutes before the `join_time`.

- `meeting_agent_complete` - sent when the Meeting Agent has successfully joined the meeting, captured data from it, and processed those into resources it has made available for download

- `meeting_agent_failed` - sent when the Meeting Agent was unable to run successfully

### Callback notifications
Read more about callbacks in our [Callback Notification documentation](/developers/api/meeting-agents/callbacks/index.md).



---
[Read in HTML](/developers/api/meeting-agents/schedule/)