---
title: "The deanonymized visitor feed"
method: GET
path: "/business/website-visitors"
tags: ["Website intent"]
---

# The deanonymized visitor feed

`GET /business/website-visitors`

## Request

- Base URL: `https://api.tryfuse.ai/api/v1`
- URL: `https://api.tryfuse.ai/api/v1/business/website-visitors`
- Auth: HTTP basic

The deanonymized visitor feed for the token owner's team (the Website Intent screen): `type=companies` returns one row per visiting company, `type=people` one row per identified person. Both feeds return the same row shape — company details, the identified person when there is one, the visit count, the last visit date (YYYY-MM-DD) and the resolver's confidence (high, moderate, low) — with null wherever a value is unknown. The feed is all-time unless a visit window is given: `since` (ISO date, inclusive) and optionally `to` (ISO date, inclusive, defaults to now) restrict which visits count, so `count` and `lastVisitDate` reflect the window and rows with no visit inside it are omitted — the same windowed rows GET /business/analytics/website-intent shows as its top visitors. Paged (pageSize up to 100, page up to 10000) and sorted by last visit by default; `search` matches the company name (companies) or the person's name (people). Needs website tracking to be set up: an account with no tracking record answers 404. Rate limit: 30 requests per minute, 2000 per day.

Errors:
- `404` `WEBSITE_TRACKING_NOT_SET_UP` — This account has no website-tracking record (no Webtraffic entry, or the caller resolves to no team owner) — set website tracking up in the app first.
- `422` `VALIDATION_FAILED` — The request failed validation: `type` is missing or is not people/companies, `since` or `to` is not an ISO date, `since` is in the future, `to` is earlier than `since`, or another query parameter is outside its declared values or bounds. Unknown query parameters are ignored, not rejected.
- `429` `RATE_LIMITED` — Per-user quota for this endpoint family exceeded (30 per minute, 2000 per day); retry after the Retry-After / RateLimit-Reset seconds.

Requires one of the following token scopes: intent.

## Query parameters

- `type` 'people' | 'companies', required: Which feed to return: `people` (identified visitors, one row per person) or `companies` (visiting companies, one row per company).
- `since` string, date-time: Inclusive start of the visit window as an ISO 8601 date: a date-only `YYYY-MM-DD` (read as UTC midnight) or a full instant such as `2026-03-01T00:00:00.000Z`. Omit for the all-time feed. Only visits at or after this instant count towards a row's `count` and `lastVisitDate`, and a company or person with no visit in the window is not returned. Must not be in the future.
- `to` string, date-time: Inclusive end of the visit window as an ISO 8601 date, taken as the exact instant sent — a date-only `YYYY-MM-DD` is that day's UTC midnight and so excludes the day itself; send `YYYY-MM-DDT23:59:59.999Z` to include it. Omit to run the window up to now. May be in the future; must not be earlier than `since`.
- `page` integer: 1-based page number, 1 to 10000 (default 1).
- `pageSize` integer: Rows per page, 1 to 100 (default 20).
- `search` string: Free text, 1 to 200 characters; there is no vocabulary to look up. Matched as a case-insensitive substring against exactly one column: the person's name when `type=people`, the company name when `type=companies` — the people feed never matches a company name, so searching a company there returns 0 rows. The value is interpolated into a SQL LIKE pattern without escaping, so `%` and `_` act as wildcards (`search=%` matches every row). Rows whose name was never resolved are excluded from both feeds whether or not `search` is sent. A value that matches nothing is not an error: the response is 200 with an empty `visitors` array.
- `sortBy` 'lastVisitDate' | 'count' | 'companyName' | 'name' | 'companySize' | 'companyIndustry' | 'department' | 'location' | 'confidenceInterval': Field to sort the feed by (default lastVisitDate); `count` is the visit count and `name` the identified person's name.
- `sortOrder` 'asc' | 'desc': Sort direction, asc or desc (default desc).

## Response `200`

Success

- object
  - `visitors` object[], required
    - `companyName` string, nullable, required
    - `companyWebsite` string, nullable, required
    - `companyIndustry` string, nullable, required
    - `companySize` string, nullable, required
    - `companyLinkedin` string, nullable, required
    - `personName` string, nullable, required
    - `personLinkedin` string, nullable, required
    - `department` string, nullable, required
    - `location` string, nullable, required
    - `count` integer, required
    - `lastVisitDate` string, nullable, required
    - `confidenceInterval` 'high' | 'moderate' | 'low' | 'null', nullable, required
    - `page` string, nullable, required
  - `pagination` object, required
    - `total` integer, required
    - `page` integer, required
    - `pageSize` integer, required
    - `totalPages` integer, required

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `403`: Error
- `404`: Error
- `409`: Error
- `422`: Error
- `429`: Error
- `500`: Error

---

[API](https://skmtc.dev/fuseai/apis/fuse-business-api.md) · [All operations](https://skmtc.dev/fuseai/apis/fuse-business-api/llms.txt) · [OpenAPI document](https://skmtc.dev/fuseai/apis/fuse-business-api/revisions/50d95e0536f4?raw)
