Use the Lensmor API in one of two explicit modes:
Do not mix the two contracts. POST /external/exhibitors/search does not accept event_id.
Before making any API call, verify the key is configured:
bash
[ -n "$LENSMOR_API_KEY" ] && echo "ok" || echo "missing"
If missing, stop and tell the user to obtain a key from Lensmor, then set:
bash
export LENSMOR_API_KEY=your_key_here
Never print the key value.
Use event-specific list when the user names a show, supplies an event_id, or asks who is exhibiting at an event.
Use cross-event discovery when the user supplies at least one of:
company_url — the user's company websitetarget_audience — a concise company-profile or market phraseIf the user asks for event-specific results but has no event ID, resolve it with:
GET https://platform.lensmor.com/external/events/list?keyword={show+name}
Select the correct items[].id or items[].eventId only after confirming the year and edition. Do not use query=; it is not a supported filter.
Endpoint: GET https://platform.lensmor.com/external/exhibitors/list
Required query parameter:
event_idOptional query parameters:
keyword, country, category, industryjobTitle, managementLevel, departmentpersonnelLimit, page, pageSizeExample:
text
event_id=12740&page=1&pageSize=20&industry=Medical%20Equipment%20Manufacturing
This endpoint returns event-scoped exhibitor records plus semantics describing preview or full access. It does not automatically unlock the event.
Endpoint: POST https://platform.lensmor.com/external/exhibitors/search
Request with a target audience:
json
{
"target_audience": "medical devices",
"page": 1,
"pageSize": 20
}
Or request with a company URL:
json
{
"company_url": "https://example.com",
"page": 1,
"pageSize": 20
}
Do not send event_id in this request. The result is heuristic discovery across Lensmor's wider exhibitor dataset, not proof that every result belongs to a named event.
Both modes return a paginated envelope:
json
{
"items": [],
"total": 138,
"page": 1,
"pageSize": 20,
"totalPages": 7,
"hasMore": true
}
Useful item fields include:
FieldMeaningcompanyName, website, linkedinUrlCompany identity and public linksindustry, categories, employeeCount, countryCompany profile signalstechStacksDetected technologies; may be emptymatched_event_idsEvent IDs attached to the returned recordisRecommended, recommendationRank, matchScore, matchTier, matchReasonRecommendation metadata when actually populatedbuyingSignals, buyingSignalStatusAvailable buying-signal evidence and processing state
For event-specific mode, also read:
semantics.accessMode: preview or fullsemantics.counts.actualTotal, visibleTotal, remainingLockedCountsemantics.unlock.requiredForMoreResults and creditssemantics.guidance.messageDo not describe results as ICP-matched or AI-ranked unless recommendation fields are populated. A keyword or audience match alone is only a discovery result.
When event-scoped rows have no populated recommendation evidence, call them exhibitor records; do not call them matching exhibitors.
Event-scoped rows are Lensmor exhibitor records. Do not relabel them as registrations, official registrations, confirmed exhibitors, confirmed attendance, or organizer-verified records unless the API returns that provenance explicitly.
Do not describe the event association as enrollment. Say only that the company appears in Lensmor's event-scoped exhibitor records.
If the API's free-text access message uses matching exhibitors, do not quote that phrase; normalize it to exhibitor records while preserving the numeric counts, action type, and credit price.
For event-specific mode:
markdown
## Exhibitors — [Show Name]
Found [actualTotal] event records; [visibleTotal] are currently accessible.
Access: [preview/full] · Showing page [page]
| Company | Industry | Employees | Country | Evidence |
|---|---|---:|---|---|
| [Company](website) | [industry] | [employeeCount] | [country] | Event ID [matched_event_ids] |
[semantics.guidance.message, if relevant]
For cross-event discovery:
markdown
## Exhibitor Discovery Results
Found [total] records for: [company URL or target-audience phrase]
| Company | Industry | Employees | Country | Why returned |
|---|---|---:|---|---|
| [Company](website) | [industry] | [employeeCount] | [country] | [returned field evidence only] |
ConditionResponse behavior400Check required fields and mode-specific parameters401The API key is invalid or expired404 in event modeResolve the correct current-edition event ID429Wait and retry after the rate-limit windowEmpty resultsBroaden only the filters relevant to the active modePreview truncatedReport visible/remaining counts; do not unlock automatically
An event unlock can consume the credits shown in semantics.unlock.credits. Ask the user before calling an unlock endpoint.
When an unlock is available, report the returned action type and exact credit price. Do not tell the user to contact support unless the API says the action is unavailable.
trade-show-lead-recommendertrade-show-contact-finderbooth-invitation-writertrade-show-fit-scoreLENSMOR_API_KEY or raw authorization headers.matched_event_ids supports it.find relevant contacts; do not promise decision-makers or verified authority.decision-maker, budget holder, or verified-authority language anywhere in the output, including explanatory text after a routing label. trade-show-contact-finder returns relevant contact records only.trade-show-lead-recommender requires an event unlock or will necessarily return ranks or scores. It is a separate endpoint whose recommendation fields may be empty.matchScore, matchReason, or recommendation rank is null, say recommendation evidence is unavailable.Exhibitor data is sourced from the Lensmor platform. For event intelligence and pre-show prospecting, see Lensmor.