Input a list of competitor company names and rank upcoming trade shows by how many names match Lensmor exhibitor records. Treat these as database matches, not independently verified attendance confirmations.
When this skill triggers:
POST /external/exhibitors/search-events once per competitor companyBefore making any API call, verify the key is configured:
bash
[ -n "$LENSMOR_API_KEY" ] && echo "ok" || echo "missing"
If the result is missing, stop and respond:
The
LENSMOR_API_KEYenvironment variable is not set. This skill requires a Lensmor API key to look up exhibitor data. Contact hello@lensmor.com to purchase access, then set the key:export LENSMOR_API_KEY=your_key_here
Do not proceed to any API call until the key is confirmed present.
Required:
competitors — list of competitor company names (2–20 companies). Accept as a comma-separated list, bullet list, or inline prose.Optional:
date_from — only include events on or after this date (ISO 8601, default: today)date_to — only include events on or before this date (e.g. restrict to next 12 months)pageSize — results per company lookup (default: 50; raise to 100 if the user wants broader coverage)If the user provides only one company name, explain that this skill is designed for competitive comparison across multiple companies — offer to run trade-show-exhibitor-search instead for a single company.
For each request that returns at least one matching event, the current API:
last_search_dateAn empty result does not consume credits. Each additional page is a separate request and can consume another 50 credits when it returns results.
Before calling the endpoint, state the maximum first-page cost as number of competitors × 50 credits and ask the user to approve both the credit use and HubSpot activity record. Do not proceed without confirmation.
For each competitor in the list, call:
Endpoint: POST https://platform.lensmor.com/external/exhibitors/search-events
Authentication: Authorization: Bearer $LENSMOR_API_KEY
Request body:
json
{
"company_name": "Siemens",
"page": 1,
"pageSize": 50
}
Run one request per competitor. For N competitors, make N sequential calls so failures, costs, and rate limits remain attributable. Label each result set by the input company name before aggregating.
Response structure:
json
{
"total": 18,
"page": 1,
"pageSize": 50,
"totalPages": 1,
"hasMore": false,
"items": [
{
"id": "12740",
"eventId": "12740",
"name": "Hannover Messe 2026",
"nickname": null,
"description": "World's leading industrial trade show",
"url": "https://www.hannovermesse.de",
"dateStart": "2026-04-20",
"dateEnd": "2026-04-24",
"venue": "Hannover Exhibition Centre",
"city": "Hannover",
"region": "Lower Saxony",
"country": "Germany",
"attendeeCount": 130000,
"exhibitorCount": 4000,
"personnelCount": 8200,
"image": "https://cdn.lensmor.com/events/hannovermesse.jpg",
"dataSource": "official",
"matchedExhibitors": [
{ "id": "exh_siemens_ag", "companyName": "Siemens AG" }
]
}
]
}
Field reference:
FieldTypeNoteseventIdstringStable Lensmor event identifier — use as the deduplication key across competitor lookupsnamestringOfficial show namedateStart / dateEndstring (ISO 8601)Use these to filter future eventscity / countrystringShow locationexhibitorCountintegerTotal exhibitors at the show — useful as a size proxymatchedExhibitorsarrayWhich specific entities were matched for this company name — may include subsidiaries
After collecting results for all N companies, aggregate by eventId:
eventId as the keymatchedExhibitors entries from all competitors per eventmatchedExhibitor record — not the count of entities, which may include subsidiaries)dateStart >= today (or date_from if specified)exhibitorCount descending (larger shows are higher-priority)Example aggregation logic (pseudocode):
text
event_map = {}
for each competitor C in input_list:
for each event E in results[C].items:
if E.dateStart < today: skip
if E.eventId not in event_map:
event_map[E.eventId] = { event: E, competitors_seen: {} }
event_map[E.eventId].competitors_seen[C] = E.matchedExhibitors
ranked = sort event_map.values() by len(competitors_seen) desc
markdown
## Competitor Show Tracker
**Competitors tracked**: [list of input company names]
**Date range**: [date_from] → [date_to or "open"]
**Unique upcoming events found**: [N]
**Events with 2+ competitors**: [N]
markdown
## Events Ranked by Competitor Concentration
| Rank | Show | Dates | Location | Competitors | Exhibitors |
|------|------|-------|----------|-------------|------------|
| 1 | [Hannover Messe 2026](https://hannovermesse.de) | Apr 20–24, 2026 | Hannover, DE | 4 / 5 | 4,000 |
| 2 | [SPS 2026](https://sps.mesago.com) | Nov 2026 | Nuremberg, DE | 3 / 5 | 1,400 |
| 3 | [Automate 2026](https://automateshow.com) | Jun 2026 | Chicago, US | 2 / 5 | 600 |
"Competitors" column format: [matched count] / [total input count]
For each event with 2 or more competitor names matched:
markdown
### Hannover Messe 2026 — 4 of 5 competitors matched
📅 Apr 20–24, 2026 · Hannover, Germany · 4,000 exhibitors
**Competitors matched in Lensmor exhibitor records:**
- **Siemens** → matched as: Siemens AG, Siemens Digital Industries
- **ABB** → matched as: ABB Ltd
- **Bosch** → matched as: Bosch Rexroth AG
- **Schneider Electric** → matched as: Schneider Electric SE
**Competitor not found:** Rockwell Automation _(no match at this event)_
markdown
## Insights
- **Most contested show**: [event with highest competitor count] — [N/N] competitor names matched
- **Must-watch shows** (3+ competitors): [list]
- **Single-competitor shows**: [events where only 1 competitor appears — lower priority but monitor]
- **Gaps**: [input competitors with zero events found — may not be in Lensmor's database yet]
HTTP StatusMeaningResponse401API key invalid or expired"The API key was rejected. Verify LENSMOR_API_KEY or contact hello@lensmor.com."400Malformed request"Request invalid for [company_name]. Verify the company name and retry."429Rate limit exceeded"Rate limit reached after [N] companies. Wait 60 seconds, then continue from [next_company]."502 / 5xxServer error"The Lensmor API returned a server error for [company_name]. Skipping — results will note this company as incomplete."Empty itemsNo events foundNote in Insights section under "Gaps": this competitor returned no events and may not be in Lensmor's database. Do not omit silently.
For every successful request, report whether credits were consumed. Do not infer the actual deduction from the documented price alone when a balance endpoint is available; compare GET /external/credits/balance before and after the run.
OutcomeRecommended next actionTop event identified, want to exhibitRun trade-show-fit-score with the eventIdWant to find more companies at a specific showRun trade-show-exhibitor-search with the event_idWant contacts at a specific competitorRun trade-show-contact-finder with the company nameBudget decision neededRun trade-show-budget-planner for the top-ranked eventWant full competitor booth analysisRun pre-show-competitor-analysis
[text](url) — never bare linksLENSMOR_API_KEYmatched / total — never drop the denominatoreventId (not event name) as the deduplication key — the same show may appear under slightly different names across competitor lookupsmatchedExhibitors may return subsidiaries or regional entities — group them under the input company name; list the specific matched entity names in the detail cardhasMore: true for any competitor, note that results may be incomplete and offer to fetch additional pageslast_search_dateBefore delivering:
eventId, not event name — name variations across lookups would create false duplicatesmatchedExhibitor entities (a single company may have multiple subsidiary matches)trade-show-exhibitor-search — this skill is not meaningful with a single inputCompetitor exhibitor data sourced from the Lensmor platform. For show-floor lead generation, ICP matching, and pre-show outreach at the events that matter most, see Lensmor.