List visits
Returns visits, newest first. Combine filters to answer everyday questions:
- Who is on site now:
status=checked_in&site_id=… - Today's expected guests:
status=expected&expected_after=…&expected_before=… - A host's visitors:
host_id=…
In live mode, visits created before your plan's visitor history are left out. They're kept, not deleted,
and come back if you move to a plan with a longer history. Visits that are still expected,
awaiting_approval or checked_in are always included.
Scope: visits:read · Plan: Pro and Enterprise in live mode; every plan in test mode.
AuthorizationBearer <token>Send Authorization: Bearer <token> on every request. The token is one of:
| Prefix | What it is | Where it may be used |
|---|---|---|
agoo_sk_live_ | Secret key, live mode | Your servers only |
agoo_sk_test_ | Secret key, test mode | Your servers only |
agoo_pk_live_ | Publishable key, live mode | Browsers 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 mode | As 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: visits:read
limit?integerHow many items to return, from 1 to 100.
1 <= value <= 10025cursor?stringThe next_cursor from the previous page. Leave it out for the first page.
length <= 512status?stringOnly visits with this status.
"expected""awaiting_approval""checked_in""checked_out""denied""cancelled""no_show"type?stringOnly visits of this visit type, by key. Types that are turned off still match their older visits.
^[a-z][a-z0-9_]{0,39}$"meeting""contractor""parent_pickup"site_id?stringOnly visits at this site.
^site_[0-7][0-9a-hjkmnp-tv-z]{25}$"site_01kjpt3yw0fz0v414608h9x65s"host_id?stringOnly visits this person is a host of, lead or not.
^person_[0-7][0-9a-hjkmnp-tv-z]{25}$"person_01kjsesxm0e4zbyvkr7bcfxbfg"team_id?stringOnly visits with this team.
^team_[0-7][0-9a-hjkmnp-tv-z]{25}$"team_01m4r6y616e1b973vj50h0643y"needs_someone?booleantrue: only visits whose visitor is waiting for someone to take them.
visitor_id?stringOnly visits by this visitor.
^visitor_[0-7][0-9a-hjkmnp-tv-z]{25}$"visitor_01krdtb870fxj8t6ntdtcxwdk5"expected_after?stringOnly visits expected at or after this time.
date-timeexpected_before?stringOnly visits expected before this time.
date-timecreated_after?stringOnly items created at or after this time.
date-timecreated_before?stringOnly items created before this time.
date-timeA page of visits.
application/json- response
data*array<>next_cursor*|Pass this as cursor to get the next page. null on the last page.
"b3BhcXVlLWN1cnNvcg"has_more*booleancurl -X GET 'https://api.agoohq.com/v1/visits?limit=25&status=checked_in&type=contractor&expected_after=2026-10-14T00%3A00%3A00Z&expected_before=2026-10-15T00%3A00%3A00Z&created_after=2026-10-01T00%3A00%3A00Z&created_before=2026-11-01T00%3A00%3A00Z'{ "data": [ { "id": "visit_01m4k5z4j0fxbte6sn6e8tpgza", "status": "checked_in", "type": "meeting", "source": "invitation", "site_id": "site_01kjpt3yw0fz0v414608h9x65s", "gate_id": "gate_01kjpt7m20fpf9vcsaexsxgqr3", "host_id": "person_01kjsesxm0e4zbyvkr7bcfxbfg", "audience": "person", "hosts": [ { "id": "person_01kjsesxm0e4zbyvkr7bcfxbfg", "name": "Kwame Mensah", "role": "lead", "state": "addressed" } ], "team": null, "asked_for": null, "needs_someone": false, "visitor": { "id": "visitor_01krdtb870fxj8t6ntdtcxwdk5", "name": "Ama Owusu", "phone": "+233241234567", "email": "ama@coastline.example", "company": "Coastline Consult" }, "purpose": "Quarterly treasury review", "expected_at": "2026-10-14T09:30:00Z", "expected_until": "2026-10-14T11:30:00Z", "checked_in_at": "2026-10-14T09:31:02Z", "checked_out_at": null, "cancelled_at": null, "decision": { "outcome": "approved", "decided_at": "2026-10-14T09:31:02Z", "decided_by": "person_01kjsesxm0e4zbyvkr7bcfxbfg", "reason": null }, "booking_id": null, "rescheduled_to": null, "pass": { "channels": [ "whatsapp" ], "last_sent_at": "2026-10-10T15:12:44Z" }, "custom_fields": { "vehicle_plate": "GR 4521-24", "bringing_laptop": true }, "created_at": "2026-10-10T15:12:40Z", "updated_at": "2026-10-14T09:31:02Z" } ], "next_cursor": null, "has_more": false}Remove a member from a team DELETE
Takes a person out of a team. Removing someone who isn't in it returns the team unchanged. **Scope:** `people:write` · **Plan:** Pro and Enterprise in live mode; every plan in test mode.
Create a visit POST
Creates an expected visit: an invitation from a host when you use a secret key or OAuth token, or a pre-registration when you use a publishable key. Agoo links the visit to an existing visitor record when the phone number (or, without a phone, the email address) matches one, and creates a visitor record otherwise. - With `send_pass` (the default), Agoo sends the visitor a QR pass on the channels in `pass_channels`, trying them in order and falling back to the next if one fails. Leave `pass_channels` out to use your organisation's default order. Each message counts towards your SMS and WhatsApp allowance. - Fires `visit.created`, then `pass.sent` once the pass is sent. - The visitor is checked against your watchlist straight away. On a match the visit is held for security (`awaiting_approval`): no pass is sent, no host is asked, `watchlist.matched` fires and your security team is alerted. The response shows only the status. - `type` is one of your organisation's visit type keys (see `GET /visit-types`) and defaults to `meeting`. A key your organisation doesn't have, or a type that is turned off, returns `validation_failed`. - `custom_fields` are checked against the visit form for the visit's `type` (see `GET /forms`). A photo or file question takes the ID of a file you registered first (`POST /files` with `kind` `answer_photo` or `answer_file`); the file then belongs to the visit and is deleted with it. A signature takes its strokes, `[[[x, y], …], …]` in a 1000 × 400 box. An ID scan takes any of `document_type`, `number` and `image` (an `id_image` file): the answer keeps `last4` (the number's last four characters), the full number is kept encrypted on the visitor and never returned by the API, and the visitor can be matched against your watchlist by it. - Pre-registrations made with a publishable key have `source: pre_registration`. If the site requires host approval for pre-registrations, the visit starts as `awaiting_approval`, the host is asked, and the pass is sent once the host approves (the visit is then `expected` again). - Each visitor new this month counts towards your plan's visitors a month. A new visitor beyond it returns `plan_required`; visitors already counted this month can always be invited again. - An unknown `site_id`, or a `host_id` that isn't an active person who can host, returns `validation_failed`. - With a publishable key, `type` must be open for pre-registration (`pre_registration: true` in `GET /visit-types`); any other type, including the default `meeting` when it isn't open, returns `validation_failed` at `body.type`. `custom_fields` may contain only the fields in that type's `public_form`; a field your staff fill in returns `validation_failed` at `body.custom_fields.<key>`. Publishable keys can't list or search people, so your page must already know the `host_id`; to let visitors search for their host, use the hosted pre-registration page (the embed script). - In test mode, messages go to the console's test outbox instead of the visitor. **Scope:** `visits:write` · **Plan:** Pro and Enterprise in live mode; every plan in test mode. **Publishable keys:** allowed, for visit types open for pre-registration.