Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/docs-quality.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,20 @@ jobs:
redocly_output="$(npx --yes @redocly/cli@2.39.0 lint openapi.json --format json)"
printf '%s\n' "$redocly_output"
printf '%s\n' "$redocly_output" | jq -e '.totals.errors == 0 and .totals.warnings == 0'

mintlify-deployment:
name: Mintlify Deployment
runs-on: ubuntu-latest
timeout-minutes: 10

steps:
- name: Check out repository
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "22"

- name: Validate Mintlify build
run: npx --yes mintlify@4.2.740 validate
15 changes: 9 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![API](https://img.shields.io/badge/API-REST-orange.svg)](https://www.lensmor.com/platform?utm_source=github&utm_medium=readme&utm_campaign=API-Doc)
[![Docs](https://img.shields.io/badge/Docs-api.lensmor.com-green.svg)](https://api.lensmor.com/)

Lensmor provides developer-facing access to event, exhibitor, personnel, contact, and profile-matching data through the Lensmor API.
Lensmor provides developer-facing access to event, exhibitor, attendee-source, registered Visitor, contact, and profile-matching data through the Lensmor API.

This repository hosts the public documentation site for developers integrating with [Lensmor](https://www.lensmor.com/?utm_source=github&utm_medium=readme&utm_campaign=API-Doc) — an AI-native event intelligence platform for B2B teams.

Expand All @@ -14,6 +14,7 @@ Use the API to:

- Check credit balance before running credit-consuming workflows
- Browse and inspect event data
- Build attendee intelligence with Exhibitor, Social Signals, and registered Visitor source labels
- Search exhibitors using company context and optional event scope
- Retrieve exhibitor and personnel profiles
- Search contacts with company-based inputs and unlock contact emails
Expand Down Expand Up @@ -53,10 +54,12 @@ curl -X GET "https://platform.lensmor.com/external/events/list?page=1&pageSize=2
- `openapi.json` — OpenAPI 3.1 specification for documented endpoints
- `api-catalog.json` — machine-readable API catalog pointing to the OpenAPI file
- `llms.txt` and `llms-full.txt` — LLM-friendly documentation entry points
- `zh-Hans/` — Simplified Chinese core onboarding, attendee, access, and contact-unlock guides
- `api-reference/credits/` — credit balance endpoint
- `concepts/errors.mdx` — shared error conventions
- `concepts/pagination.mdx` — pagination behavior
- `concepts/identifiers.mdx` — identifier conventions
- `concepts/attendee-source-types.mdx` — product-to-API attendee source mapping and multi-source behavior
- `concepts/credits-and-access.mdx` — credit costs, preview access, and unlock behavior
- `concepts/rate-limits.mdx` — rate-limit headers and `429` behavior
- `api-reference/events/` — event endpoints
Expand All @@ -67,10 +70,10 @@ curl -X GET "https://platform.lensmor.com/external/events/list?page=1&pageSize=2

## Typical use cases

- Build event discovery workflows
- Match exhibitors to a company profile or target audience
- Enrich sales, partnership, or market research pipelines
- Explore people and organizations connected to relevant events
- Build event discovery and field-marketing workflows
- Segment accessible attendees by Exhibitor, Social Signals, and registered Visitor source
- Match target accounts and exhibiting companies to relevant events
- Prioritize selected attendees and enrich their contact data for sales engagement or CRM workflows

## Local preview

Expand All @@ -80,7 +83,7 @@ pnpm dlx mintlify dev

## Changelog

See `changelog.mdx` for versioned documentation updates. The current documentation version is `v0.24.0`.
See `changelog.mdx` for versioned documentation updates. The current documentation version is `v0.24.1`.

---

Expand Down
2 changes: 1 addition & 1 deletion api-catalog.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"apis": [
{
"name": "Lensmor API",
"description": "Lensmor Event Intelligence API.",
"description": "Lensmor Event and Attendee Intelligence API.",
"baseUrl": "https://platform.lensmor.com",
"openapi": "https://api.lensmor.com/openapi.json"
}
Expand Down
7 changes: 4 additions & 3 deletions api-reference-backup/contacts/search.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ openapi: "openapi.json GET /external/contacts/search"

Search contacts by company name.

Use this endpoint when you want a lightweight contact result set keyed off a company query, with optional role filtering.
Use this endpoint when you want a lightweight contact result set keyed off a company query, with optional role filtering and attendee source context aggregated across associated events.

## When to use this endpoint

Expand Down Expand Up @@ -62,7 +62,7 @@ curl "https://platform.lensmor.com/external/contacts/search?company_name=Acme&pe
"seniorityLevel": "vp",
"linkedinUrl": "https://linkedin.com/in/jane",
"companyName": "Acme",
"sourceType": ["exhibitor"],
"sourceType": ["social", "visitors"],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand Down Expand Up @@ -90,7 +90,7 @@ curl "https://platform.lensmor.com/external/contacts/search?company_name=Acme&pe
| `department`, `seniorityLevel` | Normalized role metadata when available. |
| `linkedinUrl` | LinkedIn profile URL when available. |
| `companyName` | Matched company name. |
| `sourceType` | Normalized source labels for the contact record. Values can include `exhibitor`, `social`, and `visitors`. |
| `sourceType` | Non-exclusive source labels aggregated across associated events. Product mapping: Exhibitor = `exhibitor`, Social Signals = `social`, Visitor = `visitors`. |
| `email` | Email if already unlocked for the caller; otherwise `null`. |
| `phone` | Phone number if already unlocked for the caller; otherwise `null`. |
| `contactUnlockStatus` | Contact access state for this API key owner. |
Expand All @@ -112,5 +112,6 @@ No matching contacts can return an empty paginated response. Use this as a valid

## Notes
- Emails are returned only when the contact is already unlocked for the caller.
- Use [Personnel list](/api-reference/personnel/list-event-personnel) when you need source labels for one specific event. See [Attendee source types](/concepts/attendee-source-types) for the full mapping.
- Contact-style list responses follow the shared [Pagination conventions](/concepts/pagination).
- Each item includes `linkedinActivity` and `linkedinActivityStatus` for shape consistency, but they are always `null` on this endpoint. Only [Personnel list](/api-reference/personnel/list-event-personnel) populates LinkedIn activity data.
8 changes: 6 additions & 2 deletions api-reference-backup/events/unlock-event-visitor-access.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ openapi: "openapi.json POST /external/events/{id}/visitors/unlock"

Unlock the visitor data layer for an event that already has base event access.

Use this endpoint when the caller needs visitor records in addition to the exhibitor and personnel coverage unlocked by [Unlock event](/api-reference/events/unlock-event-access).
Use this endpoint when the caller needs registered Visitor records in addition to the exhibitor and personnel coverage unlocked by [Unlock event](/api-reference/events/unlock-event-access). Visitor records are obtained through organizer or data-provider partnerships and are available only for selected events.

## Prerequisites

Expand All @@ -16,7 +16,11 @@ Before executing this paid action:
2. Call [Actions precheck](/api-reference/actions/precheck-an-external-action) with `action_type: "unlock_event_visitors"` and the selected `event_id`.
3. Continue only when precheck returns `allowed: true`.

Visitor access requires an active subscription, available visitor data for the event, and enough credits.
Visitor access requires an active subscription, available Visitor data for the event, and enough credits.

<Note>
The product label is **Visitor**, while personnel responses use the API source value `"visitors"`. See [Attendee source types](/concepts/attendee-source-types).
</Note>

<Warning>
The first successful visitor unlock consumes `3000` credits. Precheck is read-only and should be used before the paid call.
Expand Down
22 changes: 17 additions & 5 deletions api-reference-backup/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"openapi": "3.1.0",
"info": {
"title": "Lensmor API",
"version": "0.24.0",
"version": "0.24.1",
"description": "Lensmor Event Intelligence API for event discovery, exhibitor research, personnel lookup, credits, and profile matching.",
"license": {
"name": "Lensmor Terms of Service",
Expand Down Expand Up @@ -1228,7 +1228,7 @@
"Personnel"
],
"summary": "List event personnel",
"description": "Return paginated people for an event with preview or full-access semantics and visible coverage counts.",
"description": "Return paginated people for an event with event-scoped attendee source labels and preview or full base-event access semantics. The sourceType array can contain exhibitor, social, and visitors; labels are not mutually exclusive. The endpoint does not currently accept a source filter. Visitor is a separate access layer, so semantics.accessMode does not by itself confirm Visitor access.",
"operationId": "listPersonnel",
"parameters": [
{
Expand Down Expand Up @@ -1294,6 +1294,10 @@
"fullName": "Jane Smith",
"title": "VP of Retail Technology",
"companyName": "Acme Retail Systems",
"sourceType": [
"exhibitor",
"social"
],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand Down Expand Up @@ -1334,7 +1338,7 @@
"Personnel"
],
"summary": "Get personnel profile",
"description": "Return the public professional profile for one personnel identifier.",
"description": "Return the public professional profile for one personnel identifier. The sourceType array can aggregate non-exclusive attendee source labels across the person's associated events.",
"operationId": "getPersonnelProfile",
"parameters": [
{
Expand All @@ -1357,6 +1361,10 @@
"seniorityLevel": "vp",
"linkedinUrl": "https://linkedin.com/in/jane-smith",
"companyName": "Acme Retail Systems",
"sourceType": [
"exhibitor",
"visitors"
],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand Down Expand Up @@ -1594,7 +1602,7 @@
"Contacts"
],
"summary": "Search contacts",
"description": "Search public contact records by required company name and optional role or person-name filters.",
"description": "Search public contact records by required company name and optional role or person-name filters. Returned sourceType arrays can aggregate non-exclusive attendee source labels across associated events.",
"operationId": "searchContacts",
"parameters": [
{
Expand Down Expand Up @@ -1645,6 +1653,10 @@
"fullName": "Jane Doe",
"title": "VP Marketing",
"companyName": "Acme",
"sourceType": [
"social",
"visitors"
],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand Down Expand Up @@ -3892,7 +3904,7 @@
},
"sourceType": {
"type": "array",
"description": "Normalized Lensmor source labels for this person. Possible values are exhibitor, social, and visitors.",
"description": "Lensmor source/business labels for this person. Source labels are not mutually exclusive. Product mapping: Exhibitor is exhibitor, Social Signals is social, and Visitor is visitors. Visitor represents registered attendees obtained through organizer or data-provider partnerships; Social Signals is not proof of official registration. Event personnel lists return event-scoped labels, while personnel profile and contact search can aggregate labels across associated events.",
"items": {
"type": "string",
"enum": [
Expand Down
15 changes: 11 additions & 4 deletions api-reference-backup/personnel/list.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ openapi: "openapi.json GET /external/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.
Use this endpoint when you want a paginated people directory for one event, with optional exhibitor, department, level, and search filters. Each item can include event-scoped Exhibitor, Social Signals, and Visitor source labels.

## When to use this endpoint

Expand All @@ -17,8 +17,13 @@ Common use cases:
- browse people associated with an event
- filter by department or seniority
- find contacts for a selected exhibitor
- segment accessible attendees by their event-scoped `sourceType` labels
- collect personnel IDs before calling [Unlock contact emails](/api-reference/contacts/unlock-contact-emails)

<Note>
The endpoint does not currently accept a source filter. Fetch the accessible result set and segment it client-side. See [Attendee source types](/concepts/attendee-source-types).
</Note>

## Endpoint
`GET /external/personnel/list`

Expand Down Expand Up @@ -64,7 +69,7 @@ curl "https://platform.lensmor.com/external/personnel/list?event_id=139574&depar
"seniorityLevel": "vp",
"linkedinUrl": "https://linkedin.com/in/jane-smith",
"companyName": "Acme Retail Systems",
"sourceType": ["exhibitor"],
"sourceType": ["exhibitor", "social"],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand Down Expand Up @@ -121,7 +126,7 @@ curl "https://platform.lensmor.com/external/personnel/list?event_id=139574&depar
| `department`, `seniorityLevel` | Normalized role metadata when available. |
| `linkedinUrl` | LinkedIn profile URL when available. |
| `companyName` | Associated company or exhibitor name. |
| `sourceType` | Normalized source labels for the person record. Values can include `exhibitor`, `social`, and `visitors`; an empty array means no supported source label is available. |
| `sourceType` | Event-scoped, non-exclusive source labels. Product mapping: Exhibitor = `exhibitor`, Social Signals = `social`, Visitor = `visitors`. An empty array means no supported source label is available. |
| `email` | Email address if already unlocked for the caller; otherwise `null`. |
| `phone` | Phone number if already unlocked for the caller; otherwise `null`. |
| `contactUnlockStatus` | Contact access state, such as `locked` or unlocked states. |
Expand All @@ -137,7 +142,7 @@ curl "https://platform.lensmor.com/external/personnel/list?event_id=139574&depar

Locked events can still return preview personnel results. Read `semantics` before deciding whether to unlock the event:

- `accessMode` tells you whether the response is preview or full access.
- `accessMode` tells you whether base event coverage is preview or full access. It does not describe the separate Visitor access layer.
- `counts.remainingLockedCount` tells you whether more records are hidden.
- `unlock.requiredForMoreResults` tells you whether event unlock is useful for this query.
- `guidance.message` provides a user-facing explanation.
Expand All @@ -150,6 +155,8 @@ Locked events can still return preview personnel results. Read `semantics` befor

## Notes
- Personnel list responses intentionally use the lightweight contact-style response shape.
- A person can have multiple source labels. Preserve every value rather than assigning one exclusive category.
- Visitor records are registered attendees obtained through organizer or data-provider partnerships. Visitor availability and access must be checked separately.
- Emails are returned only when the contact is already unlocked for the caller.
- Locked events can return preview results. Use `semantics.unlock` to decide whether to call [Unlock event](/api-reference/events/unlock-event-access).
- Pagination behavior follows the shared [Pagination conventions](/concepts/pagination).
8 changes: 5 additions & 3 deletions api-reference-backup/personnel/profile.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ Use this endpoint when you already know the personnel identifier and need profil

Use `GET /external/personnel/profile` after a user selects a person from a personnel list, contact search result, or LinkedIn-based event lookup.

This endpoint is intentionally lightweight. Use it to confirm the person's identity and current email unlock state before starting a contact unlock workflow.
This endpoint is intentionally lightweight. Use it to confirm the person's identity, aggregated source labels, and current email unlock state before starting a contact unlock workflow.

## Endpoint
`GET /external/personnel/profile`
Expand Down Expand Up @@ -44,7 +44,7 @@ curl "https://platform.lensmor.com/external/personnel/profile?personnel_id=789"
"seniorityLevel": "vp",
"linkedinUrl": "https://linkedin.com/in/jane-smith",
"companyName": "Acme Retail Systems",
"sourceType": ["exhibitor"],
"sourceType": ["exhibitor", "visitors"],
"email": null,
"phone": null,
"contactUnlockStatus": "locked",
Expand All @@ -62,7 +62,7 @@ curl "https://platform.lensmor.com/external/personnel/profile?personnel_id=789"
| `department`, `seniorityLevel` | Normalized role metadata when available. |
| `linkedinUrl` | Public LinkedIn profile URL when available. |
| `companyName` | Associated company or exhibitor. |
| `sourceType` | Normalized source labels such as `exhibitor`, `social`, and `visitors`. |
| `sourceType` | Non-exclusive source labels aggregated across the person's associated events. Product mapping: Exhibitor = `exhibitor`, Social Signals = `social`, Visitor = `visitors`. |
| `email` | Email address if already unlocked for the caller; otherwise `null`. |
| `phone` | Phone number if already unlocked for the caller; otherwise `null`. |
| `contactUnlockStatus` | Current contact access state for this API key owner. |
Expand All @@ -81,5 +81,7 @@ An empty `email` value does not necessarily mean Lensmor has no email data. It c

## Notes
- This response stays intentionally lightweight.
- Use [Personnel list](/api-reference/personnel/list-event-personnel) when you need source labels for one specific event. Profile labels can reflect multiple associated events.
- See [Attendee source types](/concepts/attendee-source-types) for label meanings and Visitor access behavior.
- Emails are returned only when the contact is already unlocked for the caller.
- The response includes `linkedinActivity` and `linkedinActivityStatus` for shape consistency, but they are always `null` on this endpoint. Only [Personnel list](/api-reference/personnel/list-event-personnel) populates LinkedIn activity data.
Loading
Loading