Unified dashboard view of every person or company across the caller’s lists, deduplicated and searchable.
name + company + linkedin_url — a single person appearing across three lists returns once, with a lists array listing all three.
Company deduplication cascades on domain (falling back to name). Each company row includes employeesInLists, the count of unique people from that company across any of the caller’s lists (deduped by LinkedIn URL).
Pagination is applied after deduplication so total is the true deduplicated count. Search hits the indexed search_text column; PostgREST special chars are stripped server-side to prevent injection.
GET /api/lists/{id}/rows — it is simpler and does not incur the dedup cost.Pagination:limit defaults to 500, hard cap is 10,000. Most callers want one big fetch and client-side filtering.offset is applied after dedup — offset=500&limit=500 is safe.hasMore tells you when to stop.limit and page client-side.Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Which entity to return. Defaults to people. Companies are deduplicated by domain and include an employeesInLists count summarising how many unique people from the same company appear across the caller's lists.
people, companies Page size. Defaults to 500, hard-capped at 10,000 (intentional — the dashboard fetches in one shot and paginates client-side).
0 < x <= 10000Offset applied after deduplication — so total row counts remain accurate across pages.
0 <= x <= 9007199254740991Case-insensitive search against the indexed search_text column. PostgREST special characters (,, (, ), %, _, \) are stripped server-side for safety.
Deduplicated rows + total + pagination cursor.
Unified dashboard view across all lists.
Shape depends on type; every row in a single response shares the same shape.
Person row — returned when type === "people".
Total deduplicated rows across all the caller's lists.
0 <= x <= 9007199254740991True when offset + limit < total.