List people
Required permissions: people:read.
A page of people, most recently created first. PAGINATES: follow nextCursor until hasMore is false.
Why each person matters is behind ?expand=. Send ?expand=stakeholderReport,events to add both stakeholderReport — the generated report on the person, the same one the Trayo app shows — and events, the events they are attached to with the per-event reasoning. Without the parameter neither KEY is present (absent, not null and not []), because a page of 50 reports is a large response for a call that only wanted names. GET /v1/people/{id} always includes both.
Request
- Base URL: https://api.trayo.ai
- URL: https://api.trayo.ai/v1/people
- Auth: HTTP bearer
Query parameters
Restrict to people linked to this account. An accountId that does not exist, or belongs to another workspace, is not an error — it simply matches no rows.
Case-insensitive substring match against fullName only — does not search title, email, or anything else.
Send the literal string true or false. true returns only people whose email comes back non-null, false only those whose does not. Omit the parameter to return people regardless. Any other value is rejected rather than guessed at.
It filters on the SAME email the response publishes, from either source: an address you wrote (emailSource: "manual") or one a lookup found and still considers deliverable (emailSource: "enrichment"). So POST /v1/people/{id}/enrich finding an address moves that person from ?hasEmail=false to ?hasEmail=true. A found address that later bounced, or a lookup that is still running, found nothing, or went stale, leaves email null and the person on the false side — the two sides always partition the workspace, never overlap.
Filter on the derived isRepVisible flag. Same parsing as hasEmail, but NOT the same idea — the two sit next to each other and are unrelated.
Omit it to list both values. ?isRepVisible=true lists people somebody added or Trayo attached to an event. ?isRepVisible=false lists profiles Trayo collected while searching but never surfaced. Adding one of those with POST /v1/people moves it to the true side. See the field's own description on PersonDto.
Send a plain date — 2026-06-07, read as midnight UTC — or a full ISO-8601 timestamp — 2026-06-07T14:30:00Z — when you need the time of day. Relative words are not accepted: yesterday, last-quarter, 7d and anything else that has to be resolved against "now" is rejected with a 400 (invalid_date). Compute the date yourself and send it. Returns people with updatedAt >= this value.
A contact lookup counts as an update: when a lookup finishes for a person — whether it found an email or phone, found nothing, or a previously found address bounced — that person's updatedAt moves. A sweep that polls this parameter on a schedule therefore sees contact details that arrived since its last run, not only edits made through the API.
Send expand=stakeholderReport,events to add the stakeholderReport and events fields to every item in data. Despite the comma-separated syntax, expansion is ALL-OR-NOTHING: any non-empty value — events alone, even expand=bogus — expands both fields together. There is no way to request only one. Omit the parameter entirely for the compact form, which omits both KEYS rather than sending them empty.
Both are heavy — a whole markdown report and a join across every event a person is attached to — which is why they are behind this parameter here and unconditional on GET /v1/people/{id}.
Only people who say on their LinkedIn profile that they are in this city, e.g. San Diego. Case-insensitive, whole name. A person whose profile names only a metro area (Greater San Diego Area) also matches when that text contains the city. This is where the person is, not where their account is headquartered; see the person's location.
Only people whose stated LinkedIn location is in this state, province or region, e.g. California. Case-insensitive, whole name.
Only people whose stated LinkedIn location is in this country: an ISO-2 code (US) or a country name (United States), any case. A name is read as its ISO-2 code.
Opaque pagination cursor from a previous page's nextCursor. Omit for the first page. Do not construct or parse this value — it is a base64url-encoded implementation detail and may change shape without notice.
Page size, default 25. Values above 100 are silently CAPPED to 100, not rejected. Note the deliberate contrast with the two other bounds in this API: POST /v1/find's limit is rejected above 100 (and a sentence search returns at most 50), and a /v1/…/batch array of more than 200 items is an ERROR rather than a clamp — silently dropping rows would lose records the caller believes it created. A limit that is zero, negative or not an integer is rejected here too; only the upper bound clamps.
Response
Changes
No recorded changes to this operation across all 1 revision of this API.