Skip to main content

Documentation Index

Fetch the complete documentation index at: https://api.lensmor.com/llms.txt

Use this file to discover all available pages before exploring further.

Personnel list

List personnel records for a specific event. Use this endpoint when you want a paginated people directory for one event, with optional exhibitor, department, level, and search filters. The response now includes a semantics object that explains preview versus full event access.

Endpoint

GET /external/personnel/list

Authentication

See Authentication

Success status code

200 OK

Query parameters

NameRequiredTypeNotes
event_idYesstringEvent identifier returned by Lensmor event endpoints.
pageNointegerDefaults to 1.
pageSizeNointegerDefaults to 20, max 100.
exhibitor_idNostringOptional numeric-string exhibitor filter.
departmentNostringCase-insensitive department filter.
levelNostringCase-insensitive management-level filter.
search_queryNostringMatches relation position or personnel full name.

Response body

Top-level fields

FieldTypeNotes
itemsobject[]Personnel contact summaries for the event.
totalintegerTotal distinct personnel matches.
pageintegerCurrent page number.
pageSizeintegerPage size used for this response.
totalPagesinteger0 when total is 0.
hasMorebooleantrue when another page exists.

items[] fields

FieldTypeNotes
idstringLensmor personnel identifier.
fullNamestringFull name.
titlestring or nullFor this route, sourced from personnel.bio.
departmentstring or nullDepartment value.
seniorityLevelstring or nullSeniority or level value.
linkedinUrlstring or nullLinkedIn URL.
companyNamestring or nullAssociated exhibitor company name.
sourceTypestring or nullSource label.
emailstring or nullEmail when this caller has already unlocked the contact; otherwise null.
contactUnlockStatusstringUser-scoped contact state. Current complete enum: locked, unlocking, unlocked, failed.

semantics fields

FieldTypeNotes
accessModestringpreview when the event is still preview-locked, full when the caller already has full event access.
previewLimitinteger or nullCurrently 50 in preview mode; null in full mode.
countsobjectActual-versus-visible match counts for the current query.
pageStateobjectWhether the requested page is currently accessible.
unlockobjectWhether event unlock is required to see more results.
guidanceobjectUser-facing machine-readable guidance for the current access state.

semantics.counts fields

FieldTypeNotes
actualTotalintegerTotal matching personnel for the current query before preview gating.
visibleTotalintegerTotal currently accessible under the present access mode.
remainingLockedCountintegerCount of matching personnel that remain inaccessible until event unlock.

semantics.pageState fields

FieldTypeNotes
requestedPageintegerEchoes the requested page number.
accessiblebooleanfalse when the requested page falls outside the preview-accessible window.
maxAccessiblePageintegerHighest page currently accessible under the present access mode.

semantics.unlock fields

FieldTypeNotes
requiredForMoreResultsbooleantrue when event unlock is required to continue beyond the current preview boundary.
actionTypestring or nullAction code for the next recommended step when more access is available.
creditsinteger or nullCredits required for that recommended step when applicable.

semantics.guidance fields

FieldTypeNotes
codestringCurrent codes include preview_page_inaccessible, preview_results_truncated, preview_complete_for_query, full_access, and no_matching_results.
messagestringHuman-readable explanation of the current access state.

Response example

{
  "items": [
    {
      "id": "789",
      "fullName": "Jane Doe",
      "title": "VP Marketing",
      "department": "Marketing",
      "seniorityLevel": "vp",
      "linkedinUrl": "https://linkedin.com/in/jane-doe",
      "companyName": "Acme",
      "sourceType": "exhibitor",
      "email": null,
      "contactUnlockStatus": "locked"
    }
  ],
  "total": 237,
  "page": 1,
  "pageSize": 20,
  "totalPages": 12,
  "hasMore": true,
  "semantics": {
    "accessMode": "preview",
    "previewLimit": 50,
    "counts": {
      "actualTotal": 237,
      "visibleTotal": 50,
      "remainingLockedCount": 187
    },
    "pageState": {
      "requestedPage": 1,
      "accessible": true,
      "maxAccessiblePage": 1
    },
    "unlock": {
      "requiredForMoreResults": true,
      "actionType": "<next-step-code>",
      "credits": 2000
    },
    "guidance": {
      "code": "preview_results_truncated",
      "message": "This event is locked. Only the first 50 matching personnel are currently accessible. Unlock the event to access the remaining matching results."
    }
  }
}

Error responses

  • 400 Bad Request when event_id or exhibitor_id is invalid.
  • 401 Unauthorized when the API key is missing, malformed, or invalid.
  • 404 Not Found when the target event cannot be resolved.

Notes

  • Request-side identifiers use event_id and optional exhibitor_id, while response-side identifiers use only id.
  • title reflects the person’s role for the current event, while email and contactUnlockStatus reflect the authenticated caller’s access state.
  • search_query matches role or title text, or personnel fullName.
  • semantics exposes whether the caller is in preview or full-access mode for this event, including unlock guidance and actual-versus-visible result counts.
  • When semantics.pageState.accessible is false, the route can return an empty page while semantics.counts.actualTotal still shows more matching results behind the preview boundary.