Docs
Webhooks

Event catalogue

Every webhook event Agoo sends, when it fires and what data.object contains, with an example of each.

Preview· P9

This is a published preview. Names and fields may still change before general availability; changes will be listed in the changelog.

Each event below is delivered to the webhook endpoints subscribed to its type, and is also available from GET/events for 30 days. Every event has the same envelope; data.object is a snapshot of the object, in the same shape as its own endpoint returns.

Examples are trimmed

To keep this page readable, the examples show only the fields of data.object that matter for each event. Real payloads always carry the complete object. Each event's page in the API reference shows the full schema and a full example.

New event types can be added at any time. Subscribe only to the types you handle, and ignore types you don't recognise. See versioning.

All events

EventFires whendata.object
visit.createdA visit is created: an invitation or pre-registration (from the API, the console or the Workspace app), a walk-in at the kiosk, or a confirmed in-person booking.Visit
visit.updatedA visit's details change: site, host, type, times, purpose or custom fields.Visit
visit.approval_requestedA visit needs a host's decision and Agoo has asked the host (push, WhatsApp, an SMS link or email).Visit
visit.approvedA host, or someone acting for them, approves a visit.Visit
visit.deniedA host, or someone acting for them, denies a visit that was awaiting approval.Visit
visit.checked_inA visitor is checked in: at the kiosk, by reception or a guard, after an approval, or through the API.Visit
visit.checked_outA visitor is checked out: at the kiosk, by scanning their pass again, by their host or reception, from the check-out link, automatically at the end of the day, or through the API.Visit
visit.cancelledAn expected visit, or one awaiting approval, is cancelled.Visit
visit.no_showAn expected visit's day ends, in the site's time zone, without the visitor checking in.Visit
pass.sentAgoo sends a visitor their QR pass: when a visit is created with send_pass, when you resend it, or when a booking is rescheduled.Visit
delivery.receivedReception, or your system through the API, records a parcel for someone.Delivery
delivery.collectedA parcel is collected from reception.Delivery
booking.createdSomeone books a slot, on a booking page, in an embed or through the API. Fires for every booking; status is pending or confirmed.Booking
booking.confirmedThe host confirms a pending booking.Booking
booking.declinedThe host declines a pending booking.Booking
booking.expiredA pending booking isn't confirmed in time.Booking
booking.rescheduledA confirmed booking moves to a new time, by the attendee's reschedule link, the host or the API.Booking
booking.cancelledA booking is cancelled, by the attendee's cancel link (also while it's pending), the host or the API.Booking
attendance.clocked_inAn employee clocks in, by any method.Attendance event
attendance.clocked_outAn employee clocks out, by any method.Attendance event
attendance.lateA clock-in is later than the person's shift start plus its grace period.Attendance event
watchlist.matchedSomeone checking in matches a watchlist entry.Watchlist match
roll_call.startedA roll call starts at a site, from the Workspace app, the console or the API.Roll call
roll_call.updatedSomeone is accounted for (by their "I'm safe" link or by a marshal), so the counts change.Roll call
roll_call.closedA roll call is closed.Roll call
person.createdA host or employee is added: in the console, by CSV import, by directory sync or through the API.Person
person.updatedA person's details change.Person
person.deactivatedA person is deactivated.Person
person.reactivatedA deactivated person is reactivated in the console.Person
visitor.erasedA visitor's personal data is erased, through the API, the console or a data subject request.Visitor erasure

Visits

visit.created

A visit is created: an invitation or pre-registration (from the API, the console or the Workspace app), a walk-in at the kiosk, or a confirmed in-person booking. data.object.source tells you which.

data.object: Visit · Full schema: visit.created

{
  "id": "evt_01m4k5z5h8f8dbawht614vgwsk",
  "type": "visit.created",
  "created_at": "2026-10-10T15:12:41Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "expected",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "expected_at": "2026-10-14T09:30:00Z",
      "expected_until": "2026-10-14T11:30:00Z"
    }
  }
}

visit.updated

A visit's details change: site, host, type, times, purpose or custom fields. Status changes fire their own events instead.

data.object: Visit · Full schema: visit.updated

{
  "id": "evt_01m4v10qr8f6kavnzk4fdkdaqb",
  "type": "visit.updated",
  "created_at": "2026-10-13T16:20:05Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "expected",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "expected_at": "2026-10-14T10:00:00Z",
      "expected_until": "2026-10-14T12:00:00Z",
      "custom_fields": {
        "vehicle_plate": "GR 4521-24"
      }
    }
  }
}

visit.approval_requested

A visit needs a host's decision and Agoo has asked the host (push, WhatsApp, an SMS link or email). The visit is awaiting_approval.

data.object: Visit · Full schema: visit.approval_requested

{
  "id": "evt_01m4wvzsg0ex6rfc40bsp210yj",
  "type": "visit.approval_requested",
  "created_at": "2026-10-14T09:30:40Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "awaiting_approval",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "gate_id": "gate_01kjpt7m20fpf9vcsaexsxgqr3",
      "expected_at": "2026-10-14T09:30:00Z"
    }
  }
}

visit.approved

A host, or someone acting for them, approves a visit. If the visitor is on site, visit.checked_in follows straight away. If they haven't arrived yet (a pre-registration), the visit is expected again and pass.sent follows once their pass is sent.

data.object: Visit · Full schema: visit.approved

{
  "id": "evt_01m4ww0ezgfezvnd1htbzhtss0",
  "type": "visit.approved",
  "created_at": "2026-10-14T09:31:02Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "checked_in",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "checked_in_at": "2026-10-14T09:31:02Z",
      "decision": {
        "outcome": "approved",
        "decided_at": "2026-10-14T09:31:02Z",
        "decided_by": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
        "reason": null
      }
    }
  }
}

visit.denied

A host, or someone acting for them, denies a visit that was awaiting approval.

data.object: Visit · Full schema: visit.denied

{
  "id": "evt_01m4wq1d4geb5bbj7e01cdme22",
  "type": "visit.denied",
  "created_at": "2026-10-14T08:04:10Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4wpxe60fp5s0pgj6jct2rj6",
      "status": "denied",
      "type": "other",
      "source": "walk_in",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "decision": {
        "outcome": "denied",
        "decided_at": "2026-10-14T08:04:10Z",
        "decided_by": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
        "reason": "Not expecting this visitor today."
      }
    }
  }
}

visit.checked_in

A visitor is checked in: at the kiosk, by reception or a guard, after an approval, or through the API.

data.object: Visit · Full schema: visit.checked_in

{
  "id": "evt_01m4ww0ezgf2bryg9gxb2gbewx",
  "type": "visit.checked_in",
  "created_at": "2026-10-14T09:31:02Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "checked_in",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "gate_id": "gate_01kjpt7m20fpf9vcsaexsxgqr3",
      "checked_in_at": "2026-10-14T09:31:02Z"
    }
  }
}

visit.checked_out

A visitor is checked out: at the kiosk, by scanning their pass again, by their host or reception, from the check-out link, automatically at the end of the day, or through the API.

data.object: Visit · Full schema: visit.checked_out

{
  "id": "evt_01m4x1sks8fapr4jzmbnx9c9p1",
  "type": "visit.checked_out",
  "created_at": "2026-10-14T11:12:09Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "checked_out",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "checked_in_at": "2026-10-14T09:31:02Z",
      "checked_out_at": "2026-10-14T11:12:09Z"
    }
  }
}

visit.cancelled

An expected visit, or one awaiting approval, is cancelled. Its pass stops working. Cancelling an in-person booking also cancels its visit.

data.object: Visit · Full schema: visit.cancelled

{
  "id": "evt_01m4v9a2z0eb0sxhk2web9nv2d",
  "type": "visit.cancelled",
  "created_at": "2026-10-13T18:45:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4qne6m0fgjbj3tkcv9xjn5p",
      "status": "cancelled",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01knvdere0f738bjjhnyhtyv2z",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "expected_at": "2026-10-15T13:00:00Z",
      "cancelled_at": "2026-10-13T18:45:00Z"
    }
  }
}

visit.no_show

An expected visit's day ends, in the site's time zone, without the visitor checking in. Agoo marks it no_show.

data.object: Visit · Full schema: visit.no_show

{
  "id": "evt_01m4ydnrd0fa0r7aers4df69hb",
  "type": "visit.no_show",
  "created_at": "2026-10-14T23:59:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4ndb2g0fezspg90a0a470ft",
      "status": "no_show",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "expected_at": "2026-10-14T14:00:00Z"
    }
  }
}

Passes

pass.sent

Agoo sends a visitor their QR pass: when a visit is created with send_pass, when you resend it, or when a booking is rescheduled. data.object is the visit; pass.channels lists where the pass went.

data.object: Visit · Full schema: pass.sent

{
  "id": "evt_01m4k5z8f0e1eanbs211hxv8qs",
  "type": "pass.sent",
  "created_at": "2026-10-10T15:12:44Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza",
      "status": "expected",
      "type": "meeting",
      "source": "invitation",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "visitor": {
        "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5",
        "name": "Ama Owusu"
      },
      "expected_at": "2026-10-14T09:30:00Z",
      "pass": {
        "channels": ["whatsapp"],
        "last_sent_at": "2026-10-10T15:12:44Z"
      }
    }
  }
}

Deliveries

delivery.received

Reception, or your system through the API, records a parcel for someone.

data.object: Delivery · Full schema: delivery.received

{
  "id": "evt_01m4x0bj50ftysd56z6pbzq7jp",
  "type": "delivery.received",
  "created_at": "2026-10-14T10:47:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "delivery_01m4x0bj50e43vcf8bz0ar7qhp",
      "status": "received",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "recipient_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "sender": "Coastline Consult",
      "package_count": 1,
      "received_at": "2026-10-14T10:47:00Z"
    }
  }
}

delivery.collected

A parcel is collected from reception.

data.object: Delivery · Full schema: delivery.collected

{
  "id": "evt_01m4x5dkpgfx8srrg2sjq59adq",
  "type": "delivery.collected",
  "created_at": "2026-10-14T12:15:30Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "delivery_01m4x0bj50e43vcf8bz0ar7qhp",
      "status": "collected",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "recipient_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "received_at": "2026-10-14T10:47:00Z",
      "collected_at": "2026-10-14T12:15:30Z",
      "collected_by_name": "Nii Armah"
    }
  }
}

Bookings

booking.created

Someone books a slot, on a booking page, in an embed or through the API. It fires for every booking. status is pending when the booking type requires the host's confirmation, and confirmed otherwise. Confirmed in-person bookings also fire visit.created for the linked visit; for a pending booking, that happens when the host confirms it.

data.object: Booking · Full schema: booking.created

{
  "id": "evt_01m4dtqd00f2nsmgf8nvxm1h2r",
  "type": "booking.created",
  "created_at": "2026-10-08T13:20:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4dtqd00eq4rtc1jdsr1gr6z",
      "status": "confirmed",
      "booking_type_id": "btype_01kn44arm0eya81713cpbnfbpq",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "start_at": "2026-10-16T10:00:00Z",
      "end_at": "2026-10-16T10:30:00Z",
      "meeting_kind": "in_person",
      "attendee": {
        "name": "Ama Owusu",
        "phone": "+233241234567",
        "email": "ama@coastline.example",
        "company": "Coastline Consult"
      },
      "visit_id": "visit_01m4dtqdz8f59rarmdksqjprz9"
    }
  }
}

booking.confirmed

The host confirms a pending booking, in the console, in the Workspace app, from the link in their confirmation request or through the API. Bookings that don't need confirmation fire only booking.created, with status: "confirmed". In-person bookings also fire visit.created now, for the visit created with the confirmation.

data.object: Booking · Full schema: booking.confirmed

{
  "id": "evt_01m4th3ht0f7x8n6y4aca84p3h",
  "type": "booking.confirmed",
  "created_at": "2026-10-13T11:42:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4t4p6z0f58tbhgwq3sywrf8",
      "status": "confirmed",
      "booking_type_id": "btype_01kqs3efm0emma1643wwgmw0jc",
      "start_at": "2026-10-20T10:00:00Z",
      "end_at": "2026-10-20T10:45:00Z",
      "visit_id": "visit_01m4th3ht0ej1vwm19q7zs06rr",
      "confirm_by": "2026-10-14T08:05:00Z",
      "confirmed_at": "2026-10-13T11:42:00Z"
    }
  }
}

booking.declined

The host declines a pending booking. The slot is free again, and the attendee is told their request wasn't accepted. decline_reason is for your organisation: the attendee sees it only if the host chose to share it.

data.object: Booking · Full schema: booking.declined

{
  "id": "evt_01m4tjzzd0fj3b2yraeyxpgrex",
  "type": "booking.declined",
  "created_at": "2026-10-13T12:15:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4t8d7j0f47vwvc95qzqkdf6",
      "status": "declined",
      "booking_type_id": "btype_01kqs3efm0emma1643wwgmw0jc",
      "start_at": "2026-10-21T14:00:00Z",
      "visit_id": null,
      "declined_at": "2026-10-13T12:15:00Z",
      "decline_reason": "Kwame is at the Kumasi Office that week."
    }
  }
}

booking.expired

A pending booking wasn't confirmed in time: the booking type's confirmation window passed, or the meeting's start time came first. confirm_by shows when. The slot is free again, and the attendee is told their request couldn't be confirmed.

data.object: Booking · Full schema: booking.expired

{
  "id": "evt_01m4xkzkt0fwxrg79zbpy7ewsb",
  "type": "booking.expired",
  "created_at": "2026-10-14T16:30:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4v1jwt0emvtprkfgc8pzb68",
      "status": "expired",
      "booking_type_id": "btype_01kqs3efm0emma1643wwgmw0jc",
      "start_at": "2026-10-22T09:00:00Z",
      "visit_id": null,
      "confirm_by": "2026-10-14T16:30:00Z"
    }
  }
}

booking.rescheduled

A confirmed booking moves to a new time, by the attendee's reschedule link, the host or the API.

data.object: Booking · Full schema: booking.rescheduled

{
  "id": "evt_01m4fx58b0e2hbybxcz34ze8bn",
  "type": "booking.rescheduled",
  "created_at": "2026-10-09T08:41:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4dtqd00eq4rtc1jdsr1gr6z",
      "status": "confirmed",
      "booking_type_id": "btype_01kn44arm0eya81713cpbnfbpq",
      "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "start_at": "2026-10-16T14:30:00Z",
      "end_at": "2026-10-16T15:00:00Z",
      "visit_id": "visit_01m4dtqdz8f59rarmdksqjprz9"
    }
  }
}

booking.cancelled

A booking is cancelled: a confirmed booking by the attendee's cancel link, the host or the API, or a pending request by the attendee's cancel link. In-person bookings that had a visit also fire visit.cancelled.

data.object: Booking · Full schema: booking.cancelled

{
  "id": "evt_01m4rh0rt0enb847ysybbtyj4f",
  "type": "booking.cancelled",
  "created_at": "2026-10-12T17:02:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "booking_01m4dtqd00eq4rtc1jdsr1gr6z",
      "status": "cancelled",
      "start_at": "2026-10-16T14:30:00Z",
      "visit_id": "visit_01m4dtqdz8f59rarmdksqjprz9",
      "cancelled_at": "2026-10-12T17:02:00Z",
      "cancellation_reason": "Kwame is travelling that day."
    }
  }
}

Attendance

attendance.clocked_in

An employee clocks in, by any method. Punches made offline fire when the device syncs, with their original occurred_at. The object carries evidence only when the punch has it: selfie_file_id, location, wifi, and face_check with review (see evidence and notices). Face punches carry face_check: "matched"; Agoo never sends face images or templates.

data.object: Attendance event · Full schema: attendance.clocked_in

{
  "id": "evt_01m4wq6yw0ekmbj8816hhhdf3w",
  "type": "attendance.clocked_in",
  "created_at": "2026-10-14T08:07:12Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "clock_01m4wq6yw0ez5srdzr46tftpah",
      "person_id": "person_01kjw4mg80efgb5aqbsqnxhtbh",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "clock_in",
      "method": "face",
      "occurred_at": "2026-10-14T08:07:12Z",
      "shift_id": "shift_01kn6pqfm0fmasbh61jnr3syze",
      "late_minutes": 7,
      "offline": false,
      "face_check": "matched"
    }
  }
}

attendance.clocked_out

An employee clocks out, by any method.

data.object: Attendance event · Full schema: attendance.clocked_out

{
  "id": "evt_01m4xnzdsrfhw9jgnmd6xjx1xw",
  "type": "attendance.clocked_out",
  "created_at": "2026-10-14T17:04:51Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "clock_01m4xnzdsreh7a3gbm0xtrx108",
      "person_id": "person_01kjw4mg80efgb5aqbsqnxhtbh",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "clock_out",
      "method": "qr",
      "occurred_at": "2026-10-14T17:04:51Z",
      "shift_id": "shift_01kn6pqfm0fmasbh61jnr3syze",
      "late_minutes": null,
      "offline": false
    }
  }
}

attendance.late

A clock-in is later than the person's shift start plus its grace period. It fires after attendance.clocked_in for the same clock-in; late_minutes says how late.

data.object: Attendance event · Full schema: attendance.late

{
  "id": "evt_01m4wq6zv8fsa9yhnee5bck2jt",
  "type": "attendance.late",
  "created_at": "2026-10-14T08:07:13Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "clock_01m4wq6yw0ez5srdzr46tftpah",
      "person_id": "person_01kjw4mg80efgb5aqbsqnxhtbh",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "clock_in",
      "method": "face",
      "occurred_at": "2026-10-14T08:07:12Z",
      "shift_id": "shift_01kn6pqfm0fmasbh61jnr3syze",
      "late_minutes": 7,
      "offline": false,
      "face_check": "matched"
    }
  }
}

Watchlist

watchlist.matched

A visit created for, or someone checking in as, a person on your watchlist matches an entry. Agoo holds the visit and alerts your security team silently at the same time; the visitor isn't told. Only endpoints that list watchlist.matched receive it: * doesn't cover it.

data.object: Watchlist match · Full schema: watchlist.matched

{
  "id": "evt_01m4x88vm0f8cb5j9w0eqpn59n",
  "type": "watchlist.matched",
  "created_at": "2026-10-14T13:05:20Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "watchlist_entry_id": "watch_01m0fqhdr0e31ray1qxa2x5vtk",
      "visit_id": "visit_01m4x88hvgf28a4tk6b4egxkvz",
      "visitor_id": "visitor_01m4x88830e36bdvkkxs8gvd0b",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "matched_on": ["name"],
      "score": 0.92,
      "matched_at": "2026-10-14T13:05:20Z"
    }
  }
}

Roll calls

roll_call.started

A roll call starts at a site, from the Workspace app, the console or the API.

data.object: Roll call · Full schema: roll_call.started

{
  "id": "evt_01m4x13bw0fgj8cqb0dth1bdmn",
  "type": "roll_call.started",
  "created_at": "2026-10-14T11:00:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "rollcall_01m4x13bw0fjmr5ekjkshzkke6",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "drill",
      "status": "active",
      "counts": {
        "total": 46,
        "accounted_for": 0,
        "missing": 46
      },
      "started_at": "2026-10-14T11:00:00Z",
      "started_by": "person_01kjsexjt0e9rt8r69a60jzx03"
    }
  }
}

roll_call.updated

Someone is accounted for (by their "I'm safe" link or by a marshal), so the counts change.

data.object: Roll call · Full schema: roll_call.updated

{
  "id": "evt_01m4x197c0fm3s8zmebv9gr14v",
  "type": "roll_call.updated",
  "created_at": "2026-10-14T11:03:12Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "rollcall_01m4x13bw0fjmr5ekjkshzkke6",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "drill",
      "status": "active",
      "counts": {
        "total": 46,
        "accounted_for": 12,
        "missing": 34
      }
    }
  }
}

roll_call.closed

A roll call is closed. counts are final.

data.object: Roll call · Full schema: roll_call.closed

{
  "id": "evt_01m4x297s8e2yaadpyy9v88bny",
  "type": "roll_call.closed",
  "created_at": "2026-10-14T11:20:41Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "rollcall_01m4x13bw0fjmr5ekjkshzkke6",
      "site_id": "site_01kjpt3yw0fz0v414608h9x65s",
      "kind": "drill",
      "status": "closed",
      "counts": {
        "total": 46,
        "accounted_for": 46,
        "missing": 0
      },
      "closed_at": "2026-10-14T11:20:41Z",
      "closed_by": "person_01kjsexjt0e9rt8r69a60jzx03"
    }
  }
}

People

person.created

A host or employee is added: in the console, by CSV import, by directory sync or through the API.

data.object: Person · Full schema: person.created

{
  "id": "evt_01kjw4mh78f7vtyd390ky5chrw",
  "type": "person.created",
  "created_at": "2026-03-04T10:00:01Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "person_01kjw4mg80efgb5aqbsqnxhtbh",
      "name": "Nii Armah",
      "email": "nii.armah@voltabank.example",
      "department": "Operations",
      "can_host": true,
      "tracks_attendance": true,
      "status": "active"
    }
  }
}

person.updated

A person's details change.

data.object: Person · Full schema: person.updated

{
  "id": "evt_01m48sy4j0fhsa3qasnxrpxgef",
  "type": "person.updated",
  "created_at": "2026-10-06T14:30:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "person_01kjsesxm0e4zbyvkr7bcfxbfg",
      "name": "Kwame Mensah",
      "job_title": "Director, Treasury",
      "department": "Treasury",
      "status": "active",
      "updated_at": "2026-10-06T14:30:00Z"
    }
  }
}

person.deactivated

A person is deactivated. Their history stays; they can no longer host, clock in or sign in.

data.object: Person · Full schema: person.deactivated

{
  "id": "evt_01m0fq88s0fyj8r6ee2nc21qa3",
  "type": "person.deactivated",
  "created_at": "2026-08-20T13:55:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "person_01kjsf1800f38sgy433fabefh9",
      "name": "Kojo Badu",
      "status": "deactivated",
      "deactivated_at": "2026-08-20T13:55:00Z"
    }
  }
}

person.reactivated

A deactivated person is reactivated, in the console. They're back in the directory and can host and clock in again; if deactivating them removed their sign-in, it's back too.

data.object: Person · Full schema: person.reactivated

{
  "id": "evt_01m2hb3qp0fs7r1ax0n6d9kt4e",
  "type": "person.reactivated",
  "created_at": "2026-09-14T08:12:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "person_01kjsf1800f38sgy433fabefh9",
      "name": "Kojo Badu",
      "status": "active",
      "deactivated_at": null
    }
  }
}

Visitors

visitor.erased

A visitor's personal data is erased, through the API, the console or a data subject request. Delete any copy you hold of this visitor's personal data.

data.object: Visitor erasure · Full schema: visitor.erased

{
  "id": "evt_01m4n6fb80e6psh8734zwfns0v",
  "type": "visitor.erased",
  "created_at": "2026-10-11T10:00:00Z",
  "organisation_id": "org_01kjpsrza0etzb0a4vf72x8ang",
  "livemode": true,
  "data": {
    "object": {
      "id": "visitor_01kn6t5b80egpr6rwh8jds1930",
      "erased_at": "2026-10-11T10:00:00Z"
    }
  }
}

On this page