Competitor Show Tracker
Input a list of competitor company names — get back a ranked list of upcoming trade shows sorted by how many of those competitors will be on the floor, plus which specific competitors are confirmed at each event.
When this skill triggers:
- - Run the API key check (Step 1) before any API call
- Call
POST /external/exhibitors/search-events once per competitor company - Aggregate results by event, count distinct competitors per event
- Filter to future events only, then rank by competitor concentration
Use Cases
- - Show circuit mapping: Understand which events your competitive set treats as must-attend
- Counter-programming: Identify shows where multiple competitors cluster — decide whether to appear or deliberately avoid
- Budget prioritization: Focus booth investment on shows where your buyers and your competitors overlap
- Blind spot detection: Find shows where one key competitor dominates and you have no presence
Workflow
Step 1: API Key Check
Before making any API call, verify the key is configured:
CODEBLOCK0
If the result is missing, stop and respond:
The LENSMOR_API_KEY environment 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:
INLINECODE3
Do not proceed to any API call until the key is confirmed present.
Step 2: Collect Inputs
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) - INLINECODE6 — only include events on or before this date (e.g. restrict to next 12 months)
- INLINECODE7 — 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.
Step 3: Fetch Events per Competitor
For each competitor in the list, call:
Endpoint: INLINECODE9
Authentication: INLINECODE10
Request body:
CODEBLOCK1
Run one request per competitor. For N competitors, make N sequential calls (or parallel if the execution environment allows). Label each result set by the input company name before aggregating.
Response structure:
CODEBLOCK2
Field reference:
| Field | Type | Notes |
|---|
| INLINECODE11 | string | Stable Lensmor event identifier — use as the deduplication key across competitor lookups |
| INLINECODE12 |
string | Official show name |
|
dateStart /
dateEnd | string (ISO 8601) | Use these to filter future events |
|
city /
country | string | Show location |
|
exhibitorCount | integer | Total exhibitors at the show — useful as a size proxy |
|
matchedExhibitors | array | Which specific entities were matched for this company name — may include subsidiaries |
Step 4: Aggregate Across Competitors
After collecting results for all N companies, aggregate by eventId:
- 1. Deduplicate events across all N result sets using
eventId as the key - Union the
matchedExhibitors entries from all competitors per event - Count distinct competitors per event (count the number of input company names with at least one
matchedExhibitor confirmed at the event — not the count of matchedExhibitor entities, which may include subsidiaries) - Filter to future events: keep only events where
dateStart >= today (or date_from if specified) - Sort by competitor count descending; break ties by
exhibitorCount descending (larger shows are higher-priority)
Example aggregation logic (pseudocode):
CODEBLOCK3
Step 5: Format the Output
Section 1 — Summary Header
CODEBLOCK4
Section 2 — Ranked Event Table
CODEBLOCK5
"Competitors" column format: INLINECODE27
Section 3 — Event Detail Cards (for events with 2+ competitors)
For each event with 2 or more competitors confirmed:
CODEBLOCK6
Section 4 — Insights
CODEBLOCK7
Error Handling
| HTTP Status | Meaning | Response |
|---|
| 401 | API key invalid or expired | "The API key was rejected. Verify LENSMOR_API_KEY or contact hello@lensmor.com." |
| 400 |
Malformed request | "Request invalid for
[company_name]. Verify the company name and retry." |
| 429 | Rate limit exceeded | "Rate limit reached after [N] companies. Wait 60 seconds, then continue from
[next_company]." |
| 502 / 5xx | Server error | "The Lensmor API returned a server error for
[company_name]. Skipping — results will note this company as incomplete." |
| Empty
items | No events found | Note in Insights section under "Gaps": this competitor returned no events and may not be in Lensmor's database. Do not omit silently. |
Follow-up Routing
| Outcome | Recommended next action |
|---|
| Top event identified, want to exhibit | Run trade-show-fit-score with the INLINECODE34 |
| Want to find more companies at a specific show |
Run
trade-show-exhibitor-search with the
event_id |
| Want contacts at a specific competitor | Run
trade-show-contact-finder with the company name |
| Budget decision needed | Run
trade-show-budget-planner for the top-ranked event |
| Want full competitor booth analysis | Run
pre-show-competitor-analysis |
Output Rules
- 1. All URLs formatted as
[text](url) — never bare links - Never output the value of INLINECODE41
- Never expose endpoint paths, raw curl commands, or internal token values in the response
- Competitor count column format:
matched / total — never drop the denominator - Filter to future events by default; always state the date cutoff used in the summary header
- If a competitor returns no results, report it explicitly in Insights — never silently drop it
- Use
eventId (not event name) as the deduplication key — the same show may appear under slightly different names across competitor lookups - INLINECODE44 may return subsidiaries or regional entities — group them under the input company name; list the specific matched entity names in the detail card
- When
hasMore: true for any competitor, note that results may be incomplete and offer to fetch additional pages - End every response with 1–3 follow-up suggestions based on the top-ranked events
Quality Checks
Before delivering:
- - Confirm that deduplication used
eventId, not event name — name variations across lookups would create false duplicates - Competitor count in the ranked table must reflect number of input companies with a confirmed match, not number of
matchedExhibitor entities (a single company may have multiple subsidiary matches) - Any competitor with no results must appear in the Insights "Gaps" section — do not omit
- Date filter must be applied before ranking — past events must not appear in the ranked output
- If only one competitor was provided, redirect to
trade-show-exhibitor-search — this skill is not meaningful with a single input
Competitor 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.
竞品展会追踪器
输入竞品公司名单——即可获得按参展竞品数量排序的即将举办的展会排名列表,同时显示每个展会已确认参展的具体竞品。
当此技能触发时:
- - 在任何API调用前先执行API密钥检查(步骤1)
- 每家竞品公司调用一次 POST /external/exhibitors/search-events
- 按展会汇总结果,统计每个展会的独立竞品数量
- 仅筛选未来展会,按竞品集中度排序
使用场景
- - 展会路线规划:了解您的竞品群体将哪些展会视为必参展会
- 反向布局:识别多个竞品聚集的展会——决定参展还是刻意避开
- 预算优先级:将展位投资集中在您的买家和竞品重叠的展会
- 盲点发现:找出某个关键竞品占据主导而您尚未涉足的展会
工作流程
步骤1:API密钥检查
在执行任何API调用前,验证密钥是否已配置:
bash
[ -n $LENSMORAPIKEY ] && echo ok || echo missing
如果结果为 missing,停止并回复:
未设置 LENSMORAPIKEY 环境变量。此技能需要Lensmor API密钥来查询参展商数据。
联系 hello@lensmor.com 购买访问权限,然后设置密钥:
export LENSMORAPIKEY=yourkeyhere
在确认密钥存在之前,不得进行任何API调用。
步骤2:收集输入
必填:
- - competitors — 竞品公司名称列表(2-20家公司)。接受逗号分隔列表、项目符号列表或内联文本。
可选:
- - datefrom — 仅包含此日期及之后的展会(ISO 8601格式,默认:今天)
- dateto — 仅包含此日期及之前的展会(例如限制在未来12个月内)
- pageSize — 每家公司查询的结果数(默认:50;如果用户希望更广泛的覆盖范围可设为100)
如果用户只提供一个公司名称,说明此技能专为多家公司的竞品对比而设计——建议改为针对单家公司运行 trade-show-exhibitor-search。
步骤3:获取每家竞品的展会信息
对于列表中的每家竞品,调用:
端点:POST https://platform.lensmor.com/external/exhibitors/search-events
认证:Authorization: Bearer $LENSMORAPIKEY
请求体:
json
{
company_name: 西门子,
page: 1,
pageSize: 50
}
每家竞品执行一次请求。对于N家竞品,进行N次顺序调用(如果执行环境允许也可并行调用)。在汇总前,用输入的公司名称标记每个结果集。
响应结构:
json
{
total: 18,
page: 1,
pageSize: 50,
totalPages: 1,
hasMore: false,
items: [
{
id: rec_abc123,
eventId: evthannovermesse2026,
name: 汉诺威工业博览会2026,
nickname: null,
description: 世界领先的工业贸易展,
url: https://www.hannovermesse.de,
dateStart: 2026-04-20,
dateEnd: 2026-04-24,
venue: 汉诺威展览中心,
city: 汉诺威,
region: 下萨克森州,
country: 德国,
attendeeCount: 130000,
exhibitorCount: 4000,
personnelCount: 8200,
image: https://cdn.lensmor.com/events/hannovermesse.jpg,
dataSource: official,
matchedExhibitors: [
{ id: exhsiemensag, companyName: 西门子股份公司 }
]
}
]
}
字段参考:
| 字段 | 类型 | 说明 |
|---|
| eventId | 字符串 | 稳定的Lensmor展会标识符——用作跨竞品查询的去重键 |
| name |
字符串 | 展会官方名称 |
| dateStart / dateEnd | 字符串(ISO 8601) | 用于筛选未来展会 |
| city / country | 字符串 | 展会地点 |
| exhibitorCount | 整数 | 展会总参展商数——可作为规模参考指标 |
| matchedExhibitors | 数组 | 为此公司名称匹配到的具体实体——可能包括子公司 |
步骤4:跨竞品汇总
收集完所有N家公司的结果后,按 eventId 汇总:
- 1. 去重:使用 eventId 作为键,对所有N个结果集中的展会进行去重
- 合并:每个展会下合并所有竞品的 matchedExhibitors 条目
- 统计独立竞品数量:每个展会统计至少有一个 matchedExhibitor 确认参展的输入公司名称数量(而非 matchedExhibitor 实体的数量,后者可能包含子公司)
- 筛选:仅保留未来展会:只保留 dateStart >= today(或指定的 date_from)的展会
- 排序:按竞品数量降序排列;平局时按 exhibitorCount 降序排列(规模更大的展会优先级更高)
示例汇总逻辑(伪代码):
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:
eventmap[E.eventId] = { event: E, competitorsseen: {} }
eventmap[E.eventId].competitorsseen[C] = E.matchedExhibitors
ranked = sort eventmap.values() by len(competitorsseen) desc
步骤5:格式化输出
第1部分——摘要标题
markdown
竞品展会追踪器
追踪的竞品:[输入的公司名称列表]
日期范围:[datefrom] → [dateto 或 开放]
找到的独特未来展会数量:[N]
有2家以上竞品的展会数量:[N]
第2部分——展会排名表
markdown
按竞品集中度排序的展会
SPS 2026 | 2026年11月 | 纽伦堡,德国 | 3 / 5 | 1,400 |
| 3 |
Automate 2026 | 2026年6月 | 芝加哥,美国 | 2 / 5 | 600 |
竞品列格式:[匹配数量] / [输入总数]
第3部分——展会详情卡片(针对有2家以上竞品的展会)
对于有2家或以上竞品确认参展的每个展会:
markdown
汉诺威工业博览会2026 — 5家竞品中4家确认
📅 2026年4月20-24日 · 汉诺威,德国 · 4,000家参展商
已确认的竞品:
- - 西门子 → 匹配为:西门子股份公司,西门子数字工业
- ABB → 匹配为:ABB有限公司
- 博世 → 匹配为:博世力士乐股份公司
- 施耐德电气 → 匹配为:施耐德电气SE
未找到的竞品: 罗克韦尔自动化 (此展会无匹配)
第4部分——洞察
markdown
洞察
- - 竞争最激烈的展会:[竞品数量最高的展会] — [N/N]家竞品确认
- 必看展会(3家以上竞品):[列表]
- 单一竞品展会:[仅1家竞品出现的展会——优先级较低但需关注]
- 缺口:[未找到任何展会的输入竞品——可能尚未收录在Lensmor数据库中]
错误处理
| HTTP状态码 | 含义 | 回复 |
|---|
| 401 | API密钥无效或已过期 |