Docs

List visits

Preview· P9
GET
/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.

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: visits:read

Query Parameters

limit?integer

How many items to return, from 1 to 100.

Range1 <= value <= 100
Default25
cursor?string

The next_cursor from the previous page. Leave it out for the first page.

Lengthlength <= 512
status?string

Only visits with this status.

Value in"expected""awaiting_approval""checked_in""checked_out""denied""cancelled""no_show"
type?string

Only visits of this visit type, by key. Types that are turned off still match their older visits.

Match^[a-z][a-z0-9_]{0,39}$
Example"meeting"
Example"contractor"
Example"parent_pickup"
site_id?string

Only visits at this site.

Match^site_[0-7][0-9a-hjkmnp-tv-z]{25}$
Example"site_01kjpt3yw0fz0v414608h9x65s"
host_id?string

Only visits this person is a host of, lead or not.

Match^person_[0-7][0-9a-hjkmnp-tv-z]{25}$
Example"person_01kjsesxm0e4zbyvkr7bcfxbfg"
team_id?string

Only visits with this team.

Match^team_[0-7][0-9a-hjkmnp-tv-z]{25}$
Example"team_01m4r6y616e1b973vj50h0643y"
needs_someone?boolean

true: only visits whose visitor is waiting for someone to take them.

visitor_id?string

Only visits by this visitor.

Match^visitor_[0-7][0-9a-hjkmnp-tv-z]{25}$
Example"visitor_01krdtb870fxj8t6ntdtcxwdk5"
expected_after?string

Only visits expected at or after this time.

Formatdate-time
expected_before?string

Only visits expected before this time.

Formatdate-time
created_after?string

Only items created at or after this time.

Formatdate-time
created_before?string

Only items created before this time.

Formatdate-time

Response Body

A page of visits.

application/json
  1. response
data*array<>
next_cursor*|

Pass this as cursor to get the next page. null on the last page.

Example"b3BhcXVlLWN1cnNvcg"
has_more*boolean
curl -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.