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

NameDescription
start_date, end_date dateYYYY-MM-DD; meetings on or between these dates
team_member_email stringFilter by host. Repeat the parameter for several hosts.
status stringscheduled, confirmed, pending, completed, cancelled, rescheduled
platform stringgoogle_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

NameDescription
meeting_idUse it to cancel.
scheduled_date, scheduled_timeIn the host's time zone, given in scheduled_timezone.
statusSee the status filter values.
platformWhere the meeting lives.
preferred_addressThe online meeting link, or the address for in-person meetings.
chat_idThe 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

NameDescription
host_email string requiredA team member's email (from /team-members).
date date requiredYYYY-MM-DD, in the customer's time zone.
timezone string requiredThe customer's IANA time zone.
duration_minutes integer5–480, default 30.
earliest_time stringHH:MM in the customer's time zone, e.g. 08:00 for mornings only.
latest_time stringHH: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

NameDescription
available_slots[].startStart time in the customer's time zone.
available_slots[].host_timeThe same moment in the host's time zone.
available_slots[].requires_external_calendar_checktrue 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.
reasonOnly 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

NameDescription
meeting_id string requiredFrom List meetings.

Request body

NameDescription
reason stringIncluded 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.