Worlds / Comms and scheduling
Calendly API
A local Calendly with event types, availability, buffers, scheduled events and invitees. Test the scheduling agent that books, cancels and handles reschedule requests through the right flow.
- Base path
/- Auth
- Personal access token or OAuth bearer token, the world key
- Endpoints
- 12
- Status
- Active today
This reference previews the surface the Calendly world serves in the closed beta. Paths mirror the public Calendly API; the exact subset is confirmed when your workflow is scoped.
Connect
The run gives your agent these bindings. Keep your SDK; change only where it sends requests.
| binding | meaning |
|---|---|
WORLDS_CALENDLY_URL | This world's origin followed by / |
WORLDS_API_KEY | The world key, accepted wherever Calendly expects a credential |
WORLDS_WORLD_ID | The isolated world's identity |
const base = process.env.WORLDS_CALENDLY_URL;
const res = await fetch(base + "/scheduled_events?user=" + encodeURIComponent(userUri) + "&status=active", {
headers: {
Authorization: "Bearer " + process.env.WORLDS_API_KEY,
},
});
const { collection } = await res.json();API reference
Scheduled events
Meetings that invitees booked.
- GET
/scheduled_eventsList scheduled events - GET
/scheduled_events/{uuid}Get a scheduled event - POST
/scheduled_events/{uuid}/cancellationCancel an event
Fields · 6
uri | string | Event URI |
name | string | Event name |
status | string | active or canceled |
start_time | datetime | Start |
end_time | datetime | End |
event_type | string | Event type URI |
Invitees
People who booked a slot.
- GET
/scheduled_events/{uuid}/inviteesList event invitees - GET
/scheduled_events/{event_uuid}/invitees/{invitee_uuid}Get an invitee - POST
/invitee_no_showsMark an invitee as no show
Fields · 5
uri | string | Invitee URI |
name | string | Name |
email | string | |
status | string | active or canceled |
questions_and_answers | array | Booking form answers |
Event types
The bookable meeting templates.
- GET
/event_typesList event types - GET
/event_types/{uuid}Get an event type - GET
/event_type_available_timesList available times
Fields · 5
uri | string | Event type URI |
name | string | Name |
duration | integer | Minutes |
active | boolean | Whether it can be booked |
scheduling_url | string | Booking link |
Users and memberships
Hosts and who belongs to the organization.
- GET
/users/meGet the current user - GET
/organization_membershipsList organization memberships - POST
/webhook_subscriptionsCreate a webhook subscription
Fields · 5
uri | string | User URI |
name | string | Name |
email | string | |
timezone | string | Time zone |
current_organization | string | Organization URI |
Test workflow
- Prepare. Select the Calendly setup for your workflow and review its starting records, including scheduled events, invitees, event types.
- Connect. Configure your agent with this world's URL and key using the SDK example. Check that it reaches the intended API before running a test.
- Define. Describe the task, expected final changes and records that must stay untouched. Keep expected outcomes separate from the agent's instructions.
- Run and inspect. Use the dashboard or your workflow's generated CLI setup. Review final records and changes, then rerun from the same starting setup with the relevant failure conditions. Use Deployment and CI to automate the same workflow.
What to verify
- Jamie Fox intro canceled with a reason
- Pat Moore intro on Wed 12 at 11:00
- Northwind demo still active
- No events inside buffer time
- Lin Wei and Sam Diaz untouched
Test file
A task file names the jobs, the policy your agent is given and what the grader reads back from the world's final state. The agent never sees the expected outcomes.
# worlds/tasks.yaml · Calendly
version: 2
connector: calendly
seed: calendly-starter
mode: isolated
policy: >
Jamie asked to cancel, so cancel that intro with a reason. Pat wants
Wednesday, so move it to an open slot that respects buffers. Leave every
demo as is.
tasks:
- id: cancel-events-with-a-reason-and-notify-the-invitee
prompt: Cancel events with a reason and notify the invitee
- id: send-single-use-scheduling-links-for-the-right-event-type
prompt: Send single-use scheduling links for the right event type
- id: mark-invitees-as-no-shows
prompt: Mark invitees as no-shows
expected:
- Jamie Fox intro canceled with a reason
- "Pat Moore intro on Wed 12 at 11:00"
- Northwind demo still active
- No events inside buffer time
- Lin Wei and Sam Diaz untouched
scenarios:
- rate-limited
- already-canceled
- token-expiredSee Tasks and outcomes for every field, and Deployment and CI to run the file on every pull request.
Failure conditions
Each one fires before the handler, at the same step on every run.
| condition | what the agent sees |
|---|---|
rate-limited | The API returns 429 |
already-canceled | A second cancellation on the same event is rejected |
token-expired | The OAuth token expires and calls return 401 |
webhook-twice | invitee.canceled is delivered two times |
slot-taken | The slot is booked by someone else before the invitee rebooks |
Starting data
Start each run from the same records and relationships. The overview below describes the Calendly starter; use the setup supplied for your workflow when preparing your own snapshot.
| Records | Starting setup |
|---|---|
| event types | 30 min intro, 60 min demo and a round robin team event |
| scheduled events | 120 active and canceled events with invitees |
| availability | Weekly hours, date overrides and buffers |
| hosts | 6 hosts with connected calendars |
| webhooks | invitee.created and invitee.canceled subscriptions |
The record shapes below reuse this world's API field definitions. They show illustrative values and placeholders, not an importable seed. API responses and seed input can differ; include all required records and references in the accepted import format for your workflow.
Scheduled events records
Scheduled events
Meetings that invitees booked.
| Field | Type | Meaning / relationship |
|---|---|---|
uri | string | Event URI |
name | string | Event name |
status | string | active or canceled |
start_time | datetime | Start |
end_time | datetime | End |
event_type | string | Event type URI |
{
"uri": "<Event URI>",
"name": "<Event name>",
"status": "<active or canceled>",
"start_time": "<Start>",
"end_time": "<End>",
"event_type": "<Event type URI>"
}Invitees records
Invitees
People who booked a slot.
| Field | Type | Meaning / relationship |
|---|---|---|
uri | string | Invitee URI |
name | string | Name |
email | string | |
status | string | active or canceled |
questions_and_answers | array | Booking form answers |
{
"uri": "<Invitee URI>",
"name": "<Name>",
"email": "person@example.test",
"status": "<active or canceled>",
"questions_and_answers": []
}Event types records
Event types
The bookable meeting templates.
| Field | Type | Meaning / relationship |
|---|---|---|
uri | string | Event type URI |
name | string | Name |
duration | integer | Minutes |
active | boolean | Whether it can be booked |
scheduling_url | string | Booking link |
{
"uri": "<Event type URI>",
"name": "<Name>",
"duration": 1,
"active": false,
"scheduling_url": "<Booking link>"
}Users and memberships records
Users and memberships
Hosts and who belongs to the organization.
| Field | Type | Meaning / relationship |
|---|---|---|
uri | string | User URI |
name | string | Name |
email | string | |
timezone | string | Time zone |
current_organization | string | Organization URI |
{
"uri": "<User URI>",
"name": "<Name>",
"email": "person@example.test",
"timezone": "<Time zone>",
"current_organization": "<Organization URI>"
}