OpenMerch People Search

Other

Search for people at a company by domain and role keywords. Returns names, titles, and company names. Powered by OpenMerch.

Install

openclaw skills install @kernel-gd/openmerch-people-search

People search (powered by OpenMerch)

Search for people at a company by domain and role keywords. Returns first name, obfuscated last name, job title, and company name for each match.

Last names are obfuscated in search results (e.g. "D."). To get the full profile, run a separate people-enrichment job using the id returned here. Use openmerch-contact-discovery only when you already have the full name and domain.

The exact price is confirmed by /v1/plan before anything runs — roughly $0.0059 at current pricing. The skill never charges more than the planned max_cost. ClawHub does not handle billing and takes no fee — the charge is between you and OpenMerch.

Get a key from the Developer page in the OpenMerch app:

export OPENMERCH_API_KEY="om_live_xxxxxxxx"
# Optional — defaults to https://api.openmerch.dev:
# export OPENMERCH_BASE_URL="https://api.openmerch.dev"

What this calls

No hidden network behavior. This skill makes only these OpenMerch HTTP calls, in order:

  1. POST {OPENMERCH_BASE_URL}/v1/plan — confirm the job is executable and get the price.
  2. POST {OPENMERCH_BASE_URL}/v1/execute — run the search (one job).
  3. GET {OPENMERCH_BASE_URL}/v1/jobs/{job_id}only if the job is still executing, to poll until it finishes. Most runs return completed immediately and no polling is needed.

Every request sends the header X-OpenMerch-Key: $OPENMERCH_API_KEY.

How to run

Option A — reference script (deterministic)

Requires Node 18+ (no npm install):

node people-search.mjs stripe.com "backend engineer"
node people-search.mjs amazon.com "site reliability engineer" 25 1

Prints a normalized JSON result to stdout and exits non-zero on error.

Option B — agent-driven (instructions)

1. Plan. POST /v1/plan:

{
  "job_type": "people_enrichment_v1",
  "input": {
    "operation": "people-search",
    "params": {
      "q_organization_domains": "amazon.com",
      "q_keywords": "site reliability engineer",
      "per_page": 25,
      "page": 1
    }
  }
}
  • If can_execute is not true, stop and report the reason. Do not execute.
  • Set max_cost = quoted_customer_price_microcents if present, otherwise estimated_cost.max_microcents. /v1/plan is the source of truth for the price — never hardcode one.

2. Execute. Generate one UUID v4 as idempotency_key. POST /v1/execute:

{
  "job_type": "people_enrichment_v1",
  "input": {
    "operation": "people-search",
    "params": {
      "q_organization_domains": "amazon.com",
      "q_keywords": "site reliability engineer",
      "per_page": 25,
      "page": 1
    }
  },
  "max_cost": "<max_cost from step 1>",
  "idempotency_key": "<uuid>"
}

Reuse the same idempotency_key on retry for the same search to prevent double charges. Generate a new key only for a genuinely new search.

3. Poll only if needed. If status is "executing", poll GET /v1/jobs/{job_id} every ~1s (cap ~8 tries / ~15s) until status is completed, failed, or cancelled.

4. Report. On completed, present the normalized result (below). On failed/cancelled, report error.code and error.message. Always report cost_usd and job_id.

curl equivalent

BASE="${OPENMERCH_BASE_URL:-https://api.openmerch.dev}"

curl -sS -X POST "$BASE/v1/plan" \
  -H "X-OpenMerch-Key: $OPENMERCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_type":"people_enrichment_v1","input":{"operation":"people-search","params":{"q_organization_domains":"amazon.com","q_keywords":"site reliability engineer","per_page":25,"page":1}}}'

Output

{
  "count": 3,
  "total_entries": 312,
  "people": [
    {
      "id": "abc123",
      "first_name": "Jane",
      "last_name_obfuscated": "D.",
      "title": "Senior Backend Engineer",
      "organization": "Stripe"
    }
  ],
  "raw": { "...": "verbatim OpenMerch job output" },
  "cost_usd": 0.0059,
  "job_id": "…"
}

total_entries is the provider's total match count across all pages (included when available). count is the number of records returned on this page. raw is the full unmodified OpenMerch job output and is the source of truth. cost_usd is derived from the actual cost.total_microcents charged.

Enriching a single person

Use the id from each search result to get the full profile — full last name, email, LinkedIn URL, and more. The id is an Apollo person ID and is the most reliable lookup key.

1. Plan. POST /v1/plan:

{
  "job_type": "people_enrichment_v1",
  "input": {
    "operation": "people-enrichment",
    "params": {
      "id": "abc123"
    }
  }
}
  • If can_execute is not true, stop and report the reason.
  • Set max_cost = quoted_customer_price_microcents if present, otherwise estimated_cost.max_microcents.

2. Execute. Generate a new UUID v4 as idempotency_key. POST /v1/execute:

{
  "job_type": "people_enrichment_v1",
  "input": {
    "operation": "people-enrichment",
    "params": {
      "id": "abc123"
    }
  },
  "max_cost": "<max_cost from step 1>",
  "idempotency_key": "<uuid>"
}

3. Poll / report. Same pattern as people-search — poll if executing, report error.code and error.message on failure.

Output: may return full name, email/email_status, title, seniority, LinkedIn URL, and organization fields when available. Not all fields are present for every person.

Alternative lookup methods: if you don't have an id, you can pass first_name + last_name + domain, email, or linkedin_url in params instead.

Notes & limits

  • One search per run. Returns up to per_page results (default 25); paginate with page.
  • Last names are obfuscated — the provider returns initials (e.g. "D."), not full last names. For the full profile, run a people-enrichment job using the returned id (see above).
  • No email addresses are returned by people-search. Use openmerch-contact-discovery only when you already have the full name and domain.
  • The skill executes a single atomic OpenMerch job — no multi-step orchestration.
  • All monetary values from OpenMerch are in microcents (1 cent = 100,000 µ¢; $1.00 = 10,000,000). cost_usd is cost.total_microcents / 10000000.