NUWAY API
Meetings
Read your team's meetings, find free times and cancel meetings. Meetings are booked through chat; to reschedule, cancel the meeting and book a new one through chat.
List meetings
GET /api/v1/external/meetings
Meetings booked with your team.
Query parameters
| Name | Description |
|---|---|
start_date, end_date date | YYYY-MM-DD; meetings on or between these dates |
team_member_email string | Filter by host. Repeat the parameter for several hosts. |
status string | scheduled, confirmed, pending, completed, cancelled, rescheduled |
platform string | google_calendar, microsoft_graph (Outlook), calcom, calendly, on_site |
Example request
curl "https://ai.nuway.co/api/v1/external/meetings?start_date=2026-10-01&status=confirmed" \
-H "X-API-KEY: $NUWAY_API_KEY"// Node.js 18+. Uses top-level await: save as .mjs (or set "type": "module").
const res = await fetch("https://ai.nuway.co/api/v1/external/meetings?start_date=2026-10-01&status=confirmed", {
method: "GET",
headers: {
"X-API-KEY": process.env.NUWAY_API_KEY
}
});
const data = await res.json();import os
import requests
r = requests.get(
"https://ai.nuway.co/api/v1/external/meetings?start_date=2026-10-01&status=confirmed",
headers={"X-API-KEY": os.environ["NUWAY_API_KEY"]},
timeout=30,
)
r.raise_for_status()
data = r.json()Response
{
"total_count": 1,
"meetings": [
{
"meeting_id": "822f29b4-5acd-4cff-ac49-2eab3b4babde",
"meeting_title": "Office Tour",
"scheduled_date": "2026-10-20",
"scheduled_time": "10:00:00",
"scheduled_timezone": "America/Toronto",
"duration_minutes": 30,
"status": "confirmed",
"platform": "google_calendar",
"host_name": "Ana",
"host_email": "[email protected]",
"attendee_name": "Jane Doe",
"attendee_email": "[email protected]",
"preferred_address": "https://meet.google.com/abc-defg-hij",
"chat_id": "api_0a8a897f15f547a7839987037932a43b",
"reminder_sent": false,
"created_at": "2026-10-11 08:31:04.954654",
"updated_at": "2026-10-11 08:31:04.954654"
}
],
"filters_applied": { "start_date": "2026-10-01", "status": "confirmed" }
}Response fields
| Name | Description |
|---|---|
meeting_id | Use it to cancel. |
scheduled_date, scheduled_time | In the host's time zone, given in scheduled_timezone. |
status | See the status filter values. |
platform | Where the meeting lives. |
preferred_address | The online meeting link, or the address for in-person meetings. |
chat_id | The conversation that booked it, when booked through chat. |
Get free time slots
GET /api/v1/external/meetings/availability
Free start times for one team member on one day. Use it to show options before your customer books through chat.
Query parameters
| Name | Description |
|---|---|
host_email string required | A team member's email (from /team-members). |
date date required | YYYY-MM-DD, in the customer's time zone. |
timezone string required | The customer's IANA time zone. |
duration_minutes integer | 5–480, default 30. |
earliest_time string | HH:MM in the customer's time zone, e.g. 08:00 for mornings only. |
latest_time string | HH:MM, latest start time to consider. |
Example request
curl "https://ai.nuway.co/api/v1/external/meetings/[email protected]&date=2026-10-20&timezone=Europe/London&earliest_time=09:00&latest_time=12:00" \
-H "X-API-KEY: $NUWAY_API_KEY"// Node.js 18+. Uses top-level await: save as .mjs (or set "type": "module").
const res = await fetch("https://ai.nuway.co/api/v1/external/meetings/[email protected]&date=2026-10-20&timezone=Europe/London&earliest_time=09:00&latest_time=12:00", {
method: "GET",
headers: {
"X-API-KEY": process.env.NUWAY_API_KEY
}
});
const data = await res.json();import os
import requests
r = requests.get(
"https://ai.nuway.co/api/v1/external/meetings/[email protected]&date=2026-10-20&timezone=Europe/London&earliest_time=09:00&latest_time=12:00",
headers={"X-API-KEY": os.environ["NUWAY_API_KEY"]},
timeout=30,
)
r.raise_for_status()
data = r.json()Response
{
"host_email": "[email protected]",
"date": "2026-10-20",
"timezone": "Europe/London",
"duration_minutes": 30,
"available_slots": [
{ "start": "2026-10-20T14:00:00+01:00", "host_time": "2026-10-20T09:00:00-04:00", "requires_external_calendar_check": true },
{ "start": "2026-10-20T14:30:00+01:00", "host_time": "2026-10-20T09:30:00-04:00", "requires_external_calendar_check": true }
]
}Response fields
| Name | Description |
|---|---|
available_slots[].start | Start time in the customer's time zone. |
available_slots[].host_time | The same moment in the host's time zone. |
available_slots[].requires_external_calendar_check | true when the host uses an external calendar (Google, Outlook, Cal.com, Calendly). The slot respects working hours, breaks, blocked dates and NUWAY bookings; the external calendar is checked when the meeting is booked. |
reason | Only when available_slots is empty: not_working_day, outside_working_hours, break_time, blocked_date, blocked_time, meeting_conflict or no_free_slots. |
Errors 404 unknown team member, 422 invalid date or time zone.
Cancel a meeting
POST /api/v1/external/meetings/{meeting_id}/cancel
Removes the meeting from the host's calendar, marks it cancelled, and notifies both the host and the attendee by email (or by SMS when only a phone number is known).
Path parameters
| Name | Description |
|---|---|
meeting_id string required | From List meetings. |
Request body
| Name | Description |
|---|---|
reason string | Included in the cancellation notices, up to 1,000 characters. |
Example request
curl -X POST "https://ai.nuway.co/api/v1/external/meetings/{meeting_id}/cancel" \
-H "X-API-KEY: $NUWAY_API_KEY" \
-H "Content-Type: application/json" \
-d '{"reason":"Customer asked to reschedule"}'// Node.js 18+. Uses top-level await: save as .mjs (or set "type": "module").
const res = await fetch("https://ai.nuway.co/api/v1/external/meetings/{meeting_id}/cancel", {
method: "POST",
headers: {
"X-API-KEY": process.env.NUWAY_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({
"reason": "Customer asked to reschedule"
})
});
const data = await res.json();import os
import requests
r = requests.post(
"https://ai.nuway.co/api/v1/external/meetings/{meeting_id}/cancel",
headers={"X-API-KEY": os.environ["NUWAY_API_KEY"]},
json={
"reason": "Customer asked to reschedule"
},
timeout=30,
)
r.raise_for_status()
data = r.json()Response
{
"status": "success",
"message": "Meeting 'Office Tour' cancelled successfully",
"meeting_id": "822f29b4-5acd-4cff-ac49-2eab3b4babde",
"platform": "google_calendar",
"meeting_title": "Office Tour",
"emails_sent": true,
"database_updated": true
}status is success, or partial when the meeting was cancelled in NUWAY and both parties were notified but the external calendar could not be updated (for example, the host's calendar connection expired). message explains which. In that case, remove the event from the calendar by hand.
Errors 404 when the meeting doesn't exist, isn't yours, or is already cancelled.