Docs
API referenceWatchlist

Add a watchlist entry

Preview· P9
POST
/watchlist

Adds a person to your watchlist. Give a name and a phone number, an ID number or both. When a visit is created for, or someone checks in as, a person matching an entry (on name, allowing for spelling differences, phone number or ID number), Agoo holds the visit, alerts your security team silently and fires watchlist.matched. The visitor, the host and the kiosk aren't told why. Every watchlist read and change is in the audit trail.

Leave site_ids empty to watch for the person at every site.

Scope: watchlist:write · Plan: Pro and Enterprise in live mode; every plan in test mode.

Authorization

headerAuthorizationBearer <token>

Send Authorization: Bearer <token> on every request. The token is one of:

PrefixWhat it isWhere it may be used
agoo_sk_live_Secret key, live modeYour servers only
agoo_sk_test_Secret key, test modeYour servers only
agoo_pk_live_Publishable key, live modeBrowsers and apps: create pre-registrations and bookings, read public booking types (with their intake questions) and their free slots, read the visit types open for pre-registration with their public forms. Never lists people.
agoo_pk_test_Publishable key, test modeAs above, in test mode

Admins create keys in Console → Developers → API keys and choose each key's scopes. A key is shown once. Never put a secret key in a URL, a browser or a mobile app.

Scope: watchlist:write

Header Parameters

Idempotency-Key*string

A UUID you generate for this operation. If you retry with the same key within 24 hours, Agoo returns the original response instead of acting twice. While the first request is still running, a retry returns conflict. Reusing a key with a different request returns idempotency_key_reused. Responses with rate_limited, internal_error or unavailable aren't stored, so retry those with the same key.

Formatuuid

Request Body

application/json
  1. body

A new watchlist entry. Give a phone number, an ID number or both, as well as the name.

name*string
Length1 <= length <= 120
phone?PhoneNumber

A phone number in E.164 format.

Match^\+[1-9][0-9]{7,14}$
Example"+233241234567"
id_number?string

An ID document number, such as a Ghana Card number. Agoo stores only a secure hash for matching and never returns it.

Lengthlength <= 40
reason*string
Length1 <= length <= 500
site_ids?array<>
Default[]
expires_at?string

When the entry stops matching. Leave it out for no end.

Formatdate-time

Response Body

The new watchlist entry.

application/json
  1. response

A person your security team wants to be alerted about.

id*WatchlistEntryId

A watchlist entry ID (TypeID with the watch prefix).

Match^watch_[0-7][0-9a-hjkmnp-tv-z]{25}$
Example"watch_01m0fqhdr0e31ray1qxa2x5vtk"
name*string
Example"Kojo Badu"
phone*|
Match^\+[1-9][0-9]{7,14}$
has_id_number*boolean

Whether the entry includes an ID number. The number itself is stored only as a secure hash and is never returned.

reason*string

Why the person is on the watchlist. Only staff with watchlist access see it.

site_ids*array<>

The sites the entry applies to. Empty means every site.

expires_at*|

When the entry stops matching. null for no end.

Formatdate-time
created_by*|

The person who added it. null when added with an API key.

Match^person_[0-7][0-9a-hjkmnp-tv-z]{25}$
created_at*string
Formatdate-time
curl -X POST 'https://api.agoohq.com/v1/watchlist' \  -H 'Idempotency-Key: 3f6b2a1e-8c4d-4f7a-9b2e-5d1c0a7e9f64' \  -H 'Content-Type: application/json' \  -d '{  "name": "Kojo Badu",  "id_number": "GHA-000000000-0",  "reason": "Former employee. Site access withdrawn on 20 August.",  "site_ids": []}'
{  "id": "watch_01m0fqhdr0e31ray1qxa2x5vtk",  "name": "Kojo Badu",  "phone": null,  "has_id_number": true,  "reason": "Former employee. Site access withdrawn on 20 August.",  "site_ids": [],  "expires_at": null,  "created_by": null,  "created_at": "2026-08-20T14:00:00Z"}