Event catalogue
Every webhook event Agoo sends, when it fires and what data.object contains, with an example of each.
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
| Event | Fires when | data.object |
|---|---|---|
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. | Visit |
visit.updated | A visit's details change: site, host, type, times, purpose or custom fields. | Visit |
visit.approval_requested | A visit needs a host's decision and Agoo has asked the host (push, WhatsApp, an SMS link or email). | Visit |
visit.approved | A host, or someone acting for them, approves a visit. | Visit |
visit.denied | A host, or someone acting for them, denies a visit that was awaiting approval. | Visit |
visit.checked_in | A visitor is checked in: at the kiosk, by reception or a guard, after an approval, or through the API. | Visit |
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. | Visit |
visit.cancelled | An expected visit, or one awaiting approval, is cancelled. | Visit |
visit.no_show | An expected visit's day ends, in the site's time zone, without the visitor checking in. | Visit |
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. | Visit |
delivery.received | Reception, or your system through the API, records a parcel for someone. | Delivery |
delivery.collected | A parcel is collected from reception. | Delivery |
booking.created | Someone 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.confirmed | The host confirms a pending booking. | Booking |
booking.declined | The host declines a pending booking. | Booking |
booking.expired | A pending booking isn't confirmed in time. | Booking |
booking.rescheduled | A confirmed booking moves to a new time, by the attendee's reschedule link, the host or the API. | Booking |
booking.cancelled | A booking is cancelled, by the attendee's cancel link (also while it's pending), the host or the API. | Booking |
attendance.clocked_in | An employee clocks in, by any method. | Attendance event |
attendance.clocked_out | An employee clocks out, by any method. | Attendance event |
attendance.late | A clock-in is later than the person's shift start plus its grace period. | Attendance event |
watchlist.matched | Someone checking in matches a watchlist entry. | Watchlist match |
roll_call.started | A roll call starts at a site, from the Workspace app, the console or the API. | Roll call |
roll_call.updated | Someone is accounted for (by their "I'm safe" link or by a marshal), so the counts change. | Roll call |
roll_call.closed | A roll call is closed. | Roll call |
person.created | A host or employee is added: in the console, by CSV import, by directory sync or through the API. | Person |
person.updated | A person's details change. | Person |
person.deactivated | A person is deactivated. | Person |
person.reactivated | A deactivated person is reactivated in the console. | Person |
visitor.erased | A 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"
}
}
}Related
Webhooks
Get a signed HTTPS request the moment something happens in Agoo, such as a visitor checking in, a parcel arriving or a roll call starting.
Verify signatures
Check that every webhook really came from Agoo, with complete verification code for TypeScript, Python, PHP and Go, and rotate secrets without downtime.