Skill: weilun88313/lensmor-contact-finder (version 1.2.0)

--- name: lensmor-contact-finder version: 1.2.0 description: "Find decision-makers and key contacts at exhibitor companies using the Lensmor API. \"Who should I contact at this company?\" / \"找联系人\" / \"Entscheidungsträger finden\" / \"担当者を探す\" / \"encontrar responsables de compras\". find contacts, decision maker, key person, find buyers, 找联系人, 找决策人, 谁负责采购, 找负责人 Entscheidungsträger Einkäufer 意思決定者 responsable de compras" homepage: https://github.com/LensmorOfficial/trade-show-skills/tree/main/lensmor-contact-finder user-invocable: true metadata: {"openclaw":{"config":{"stage":"pre-show","category":"outreach","emoji":"👤"},"requires":{"env":["LENSMOR_API_KEY"]},"primaryEnv":"LENSMOR_API_KEY"}} --- # Lensmor Contact Finder Find decision-makers and key contacts at target exhibitor companies using the Lensmor API — then connect on LinkedIn with a personalized outreach sequence. When this skill triggers: - Run the API key check (Step 1) before any API call - Collect the target company name and optional role/function filter - Call the contacts search endpoint and return a prioritized contact table - Hand off to `trade-show-linkedin-templates` for outreach copy ## Use Cases - **Pre-show outreach**: Identify the right buyer or champion at a target exhibitor before the show - **Booth meeting scheduling**: Find titles to target for pre-scheduled booth meetings - **Account-based research**: Build a contact list for a shortlist of exhibitor companies ## Important: Email Not Available The Lensmor contacts API does not return email addresses. LinkedIn is the primary contact channel. All outreach recommendations in this skill assume LinkedIn messaging. ## Workflow ### Step 1: API Key Check Before 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_KEY` environment variable is not set. This skill requires a Lensmor API key to search contacts. > Contact [[REDACTED_SECRET]](mailto:[REDACTED_SECRET]) 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. ### Step 2: Collect Inputs **Required:** - `company_name` — Full or partial company name (1–200 characters), e.g. `OperaOps` **Optional:** - `role` — Role or function filter. Examples: `VP Sales`, `Marketing`, `Procurement`, `CTO`, `Head of Operations` - `page` — Page number (default: 1) - `pageSize` — Results per page (default: 20, max: 100) If the user provides a list of companies from a prior `lensmor-exhibitor-search` or `lensmor-recommendations` run, process each company sequentially and label sections clearly. Role filter guidance: use broad department terms (`Marketing`, `Operations`, `Engineering`) for wide coverage, or specific titles (`VP Sales`, `Head of Procurement`) for precision targeting. ### Step 3: Call the API **Endpoint**: `GET https://platform.lensmor.com/external/contacts/search` **Authentication**: `Authorization: Bearer $LENSMOR_API_KEY` Query parameters: | Parameter | Required | Description | |-----------|----------|-------------| | `company_name` | Yes | Company name to search | | `role` | No | Role or function filter | | `page` | No | Page number (default: 1) | | `pageSize` | No | Results per page (default: 20, max: 100) | ### Step 4: Interpret the Response **Response envelope:** ```json { "items": [...], "total": 18, "page": 1, "pageSize": 20, "totalPages": 1 } ``` **Item field reference:** | Field | Type | Description | |-------|------|-------------| | `id` | string | Lensmor internal contact ID | | `fullName` | string | Contact's full name | | `title` | string | Job title as listed on their profile | | `department` | string | Department or function (e.g. `Sales`, `Operations`, `Engineering`) | | `seniorityLevel` | string | `Executive`, `Director`, `Manager`, or `Individual Contributor` | | `linkedinUrl` | string | LinkedIn profile URL — primary outreach channel | | `companyName` | string | Company they work at (confirms match to queried company) | | `sourceType` | string | Data provenance: `linkedin`, `company_website`, `event_registration`, etc. | **Outreach priority signals:** | Signal | Priority Implication | |--------|---------------------| | `seniorityLevel: Executive` | Decision-maker — concise, high-value pitch | | `seniorityLevel: Director` | Budget holder or strong influencer — primary target | | `seniorityLevel: Manager` | Champion or evaluator — good for discovery conversations | | `seniorityLevel: Individual Contributor` | Use for introductions or referrals | | `department` matches buyer function | Higher-priority than cross-functional contacts | | `linkedinUrl` present | Ready for direct LinkedIn outreach | Sort order: `Executive` > `Director` > `Manager` > `Individual Contributor` within the same department. Within the same seniority, prioritize by `department` match to the user's target buyer function. ### Step 5: Format the Output Open with a result count summary, then deliver a prioritized table and outreach notes. ```markdown ## Contacts at [Company Name] Found [total] contacts. Showing [pageSize] on page [page] of [totalPages]. Role filter: [role or "all"] | Note: email addresses are not available — LinkedIn is the primary outreach channel. | Priority | Name | Title | Department | Seniority | LinkedIn | |----------|------|-------|------------|-----------|----------| | 1 | Sarah Chen | VP Procurement | Procurement | Director | [LinkedIn](https://linkedin.com/in/sarahchen) | | 2 | Marcus Webb | Head of Operations | Operations | Director | [LinkedIn](https://linkedin.com/in/marcuswebb) | | 3 | Priya Rao | Procurement Manager | Procurement | Manager | [LinkedIn](https://linkedin.com/in/priyarao) | ### Outreach Priority Notes - **Sarah Chen (VP Procurement)**: Primary target — decision-maker authority, department match - **Marcus Webb (Head of Operations)**: Secondary target — strong influencer in operations-adjacent procurement - **Priya Rao (Procurement Manager)**: Champion candidate — hands-on evaluator, good for discovery **Suggested next step**: Use `trade-show-linkedin-templates` to draft personalized outreach for each seniority tier. ``` ### Error Handling | HTTP Status | Meaning | Response | |-------------|---------|----------| | 401 | API key invalid or expired | "The API key was rejected. Verify `LENSMOR_API_KEY` or contact [REDACTED_SECRET]." | | 400 | Missing required parameter | "The request is missing `company_name`. Provide a company name to search." | | 429 | Rate limit exceeded | "Rate limit reached. Wait 60 seconds and retry." | | 502 / 5xx | Server error | "The Lensmor API returned a server error. Try again in a moment." | | `total: 0` | No contacts found | "No contacts found for `[company_name]` with role filter `[role]`. Try broadening the role filter (e.g. use 'Marketing' instead of 'VP Marketing') or check the company name spelling." | ### Follow-up Routing | User says | Recommended action | |-----------|--------------------| | "draft a message for [contact]" | Run `trade-show-linkedin-templates` | | "find more companies like this" | Run `lensmor-recommendations` or `lensmor-exhibitor-search` | | "find contacts at multiple companies" | Process each company sequentially with this skill | | "show me more" / "next page" | Re-call with `page` incremented by 1 | ### Skill Coordination **Upstream — who feeds this skill:** - `lensmor-exhibitor-search` — produces the list of target companies - `lensmor-recommendations` — produces AI-ranked companies for ICP match **Downstream — where contacts go next:** - `trade-show-linkedin-templates` — generates personalized LinkedIn outreach messages for each contact tier Typical pre-show workflow: 1. `lensmor-recommendations` → find matching exhibitors 2. `lensmor-contact-finder` (this skill) → find decision-makers at each company 3. `trade-show-linkedin-templates` → draft personalized messages per seniority tier ## Output Rules 1. All URLs formatted as `[text](url)` — never bare links 2. Never output the value of `LENSMOR_API_KEY` 3. Never expose endpoint paths, raw curl commands, or internal token values in the response 4. Employee counts above 1,000 shown as "1.2K"; above 1,000,000 as "1.2M" 5. Empty results: report honestly, suggest broadening role filter — never fabricate contacts 6. End every response with 1–3 contextual follow-up suggestions 7. Never imply email availability — explicitly note that only LinkedIn profiles are returned 8. When `totalPages > 1`, prompt: "There are more contacts — say 'next page' to continue." 9. If API key is missing, direct user to [REDACTED_SECRET] — do not just say "please configure" 10. Open every response with "Found X contacts, showing Y." ## Quality Checks Before delivering: - Do not invent contacts or titles; use only what the API returns - If `linkedinUrl` is null, note that no LinkedIn profile is available and recommend manual search via LinkedIn Sales Navigator - If user asks for email addresses, explicitly state the API does not provide them - Seniority priority is a guideline; surface the closest available match if target title differs - For multi-company batch requests, process each company separately and label sections clearly --- *Contact data sourced from the Lensmor platform. For AI-powered exhibitor discovery, decision-maker identification, and pre-show outreach sequencing, see [Lensmor](https://www.lensmor.com/?utm_source=github&utm_medium=skill&utm_campaign=trade-show-skills).*

path: README.md
content: # Lensmor Contact Finder — OpenClaw Skill

> Find decision-makers and key contacts at target exhibitor companies for pre-show LinkedIn outreach.

**Best for**: B2B sales and marketing teams running account-based outreach before a trade show.

## What It Does

Provide a company name and optional role filter. The agent calls the Lensmor contacts API and returns a prioritized table of decision-makers and influencers with their titles, departments, seniority levels, and LinkedIn profile links.

Note: the API does not return email addresses. LinkedIn is the primary outreach channel.

## Usage

```
Who are the decision-makers at OperaOps I should reach out to before Dreamforce?
```

```
Find the procurement contacts at Spendly, VendorVault, and OperaOps.
```

```
Who runs marketing at Acme Corp? I want to schedule a meeting before Hannover Messe.
```

```
Find C-suite contacts at the top 5 companies from my exhibitor shortlist.
```

## Outreach Priority

Contacts are ranked by seniority and buyer function alignment:

| Seniority | Role in Outreach |
|-----------|-----------------|
| Executive | Decision-maker — concise, high-value pitch |
| Director | Budget holder or influencer — primary target |
| Manager | Champion or evaluator — discovery conversations |
| Individual Contributor | Referral path to above |

## Requirements

- Lensmor API key (`uak_your_api_key`) — contact [[REDACTED_SECRET]](mailto:[REDACTED_SECRET]) to purchase
- Base URL: `https://platform.lensmor.com`
- Full API docs: [https://api.lensmor.com/](https://api.lensmor.com/)

## Install

```bash
# Workspace-local
cp -r /path/to/trade-show-skills/lensmor-contact-finder <your-workspace>/skills/

# Shared (all workspaces)
cp -r /path/to/trade-show-skills/lensmor-contact-finder ~/.openclaw/skills/
```

## Pre-Show Workflow

1. `lensmor-recommendations` — find ICP-matching exhibitors at a specific event
2. `lensmor-contact-finder` (this skill) — find decision-makers at each matched company
3. `trade-show-linkedin-templates` — draft personalized outreach per seniority tier

## Related Skills

- [lensmor-exhibitor-search](../lensmor-exhibitor-search/) — Find ICP-matching exhibitors (feeds company names into this skill)
- [lensmor-recommendations](../lensmor-recommendations/) — AI-ranked exhibitor matches for a specific event
- [booth-invitation-writer](../booth-invitation-writer/) — Draft booth invitation emails for confirmed targets
- [trade-show-linkedin-templates](../trade-show-linkedin-templates/) — Generate personalized LinkedIn messages per contact tier

---

> Built by [Lensmor](https://www.lensmor.com/?utm_source=github&utm_medium=skill&utm_campaign=trade-show-skills) — AI-powered event intelligence platform for exhibitor discovery and pre-show lead generation.


path: examples/procurement-contacts-at-operaops.md
content: # Example: Finding Procurement Contacts at OperaOps Before Dreamforce

## Scenario

Following a `lensmor-exhibitor-search` run, OperaOps was identified as a high-priority target at Dreamforce 2026. You sell procurement automation software and want to find the right decision-makers for a pre-show LinkedIn outreach campaign and booth meeting request.

## Input

- **company_name**: `OperaOps`
- **role**: `Procurement` (first pass) + `VP Sales` (second pass)
- **pageSize**: 20

## API Call 1: Procurement Function

```bash
curl -X GET "https://platform.lensmor.com/external/contacts/search?company_name=OperaOps&role=Procurement&page=1&pageSize=20" \
  -H "[REDACTED_SECRET]"
```

## API Response 1

```json
{
  "items": [
    {
      "id": "ct_001",
      "fullName": "Sarah Chen",
      "title": "VP Procurement & Supply Chain",
      "department": "Procurement",
      "seniorityLevel": "Director",
      "linkedinUrl": "https://linkedin.com/in/sarahchen-operaops",
      "companyName": "OperaOps",
      "sourceType": "linkedin"
    },
    {
      "id": "ct_002",
      "fullName": "Priya Rao",
      "title": "Procurement Manager",
      "department": "Procurement",
      "seniorityLevel": "Manager",
      "linkedinUrl": "https://linkedin.com/in/priyarao",
      "companyName": "OperaOps",
      "sourceType": "linkedin"
    },
    {
      "id": "ct_003",
      "fullName": "Daniel Torres",
      "title": "Senior Procurement Analyst",
      "department": "Procurement",
      "seniorityLevel": "Individual Contributor",
      "linkedinUrl": "https://linkedin.com/in/danieltorres-ops",
      "companyName": "OperaOps",
      "sourceType": "company_website"
    }
  ],
  "total": 3,
  "page": 1,
  "pageSize": 20,
  "totalPages": 1
}
```

## API Call 2: VP Sales (for executive sponsorship path)

```bash
curl -X GET "https://platform.lensmor.com/external/contacts/search?company_name=OperaOps&role=VP+Sales&page=1&pageSize=20" \
  -H "[REDACTED_SECRET]"
```

## API Response 2

```json
{
  "items": [
    {
      "id": "ct_004",
      "fullName": "Marcus Webb",
      "title": "VP Sales, Americas",
      "department": "Sales",
      "seniorityLevel": "Director",
      "linkedinUrl": "https://linkedin.com/in/marcuswebb",
      "companyName": "OperaOps",
      "sourceType": "linkedin"
    }
  ],
  "total": 1,
  "page": 1,
  "pageSize": 20,
  "totalPages": 1
}
```

## Formatted Output

```markdown
## Contacts at OperaOps — Dreamforce 2026 Pre-Show Outreach

### Procurement Function (primary target)

| Priority | Name | Title | Department | Seniority | LinkedIn |
|----------|------|-------|------------|-----------|----------|
| 1 | Sarah Chen | VP Procurement & Supply Chain | Procurement | Director | [LinkedIn](https://linkedin.com/in/sarahchen-operaops) |
| 2 | Priya Rao | Procurement Manager | Procurement | Manager | [LinkedIn](https://linkedin.com/in/priyarao) |
| 3 | Daniel Torres | Senior Procurement Analyst | Procurement | Individual Contributor | [LinkedIn](https://linkedin.com/in/danieltorres-ops) |

### Sales Leadership (executive sponsorship path)

| Priority | Name | Title | Department | Seniority | LinkedIn |
|----------|------|-------|------------|-----------|----------|
| 1 | Marcus Webb | VP Sales, Americas | Sales | Director | [LinkedIn](https://linkedin.com/in/marcuswebb) |

### Outreach Priority Notes
- **Sarah Chen (VP Procurement)**: Primary target — decision-maker authority, department match; lead with ROI and workflow integration angle
- **Priya Rao (Procurement Manager)**: Champion candidate — likely hands-on evaluator; good for discovery conversation at or before the show
- **Marcus Webb (VP Sales)**: Alternative entry — if procurement channel is unresponsive, VP Sales may facilitate an intro to Sarah Chen
- **Daniel Torres**: Do not cold-message initially; may be useful for referral if Priya Rao asks for more detail

### Next Steps
- No email addresses returned — all outreach via LinkedIn
- Use `trade-show-linkedin-templates` to draft:
  - A Director-tier message for Sarah Chen (decision-maker template)
  - A Manager-tier message for Priya Rao (champion/evaluator template)
  - A booth meeting invite for both before Dreamforce
```

## Notes

- Two API calls were used: one for `Procurement` and one for `VP Sales` to cover both the buyer function and the executive sponsorship path
- `sourceType: company_website` on Daniel Torres means his profile was sourced from the OperaOps website, not LinkedIn — `linkedinUrl` may be a best-effort match; verify before messaging
- No email addresses were returned — this is expected behavior of the Lensmor contacts API


Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)