Skill: roger52027/ecommerce-lead-contacts (version 1.0.9)

--- name: Ecommerce-Lead-Contacts version: 1.0.9 description: > Free, instant access to verified LinkedIn Profiles and business emails for 14M+ e-commerce stores. Capabilities: Input the store URL to retrieve decision-maker LinkedIn profiles and business contact emails. Use when the user wants to find LinkedIn accounts and business emails for specific store domains. Triggers: "find contacts for ooni.com", "get LinkedIn profiles for allbirds.com", "who are the decision-makers at gymshark.com", "find LinkedIn and email for nike.com". author: eccompass.ai website: https://eccompass.ai license: Proprietary requires: bins: - python3 env: - APEX_TOKEN --- ## **Ecommerce Lead Contacts** Free, one-click access to verified LinkedIn profiles and business emails for 14M+ ecommerce stores. Input the store URL and instantly retrieve decision-maker contact information. ## **Data Coverage** Powered by [EcCompass AI](https://eccompass.ai) — one of the world's largest DTC databases — this skill delivers free, monthly-updated verified contacts for 14M+ global ecommerce stores. | Metric | Value | | :--- | :--- | | Total domains | 14,000,000+ | | Countries | 200+ | | Platforms | Shopify, WooCommerce, Wix, Squarespace, and more | | Lead Contacts | Verified LinkedIn profiles and business emails | | Update frequency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Monthly | ## **Part of EcCompass Skill Set** This Sub-skill is built by [ECcompass.ai](https://eccompass.ai). Focused Sub-skills let you use only what you need, combine flexibly, and get clean outputs. Prefer **all-in-one**? Install [Ecommerce Website Data](https://clawhub.ai/roger52027/ecommerce-website-data) — includes all Sub-Skills with the same free API token. ## *All features below are already available in [Ecommerce Website Data](https://clawhub.ai/roger52027/ecommerce-website-data). The "Status" column indicates standalone Sub-Skill availability.* | Section | Sub-Skill | Description | Status | |:---------|:-----------|:-------------|:--------| | Site Search | Supplier Lead Filter | Filter sites by category, traffic, tech stack — surface the most qualified leads. &nbsp;&nbsp;&nbsp;| In dev | | | Competitor Discovery | Find every player in your niche before they find you. | In dev | | | Merchant Discovery | Find top-rated merchants carrying what you're looking for. | In dev | | Site Analysis | **Lead Contacts (You are here)**&nbsp;&nbsp;&nbsp; | **Get LinkedIn profile and business email for any domain.** | ✅ **Live** | | | Historical GMV | Track GMV over time — spot growth trajectories and plateaus. | In dev | | | Tech Stack | Reveal plugins, themes, builders, and integrations. | In dev | | | Traffic Monitor | Understand visits, page views, and peer rankings. | In dev | | | Product Analysis | See categories, catalogue size, and pricing range. | In dev | | | Social Media | Gauge social footprint and audience growth. | In dev | | Market Analysis&nbsp;&nbsp; | Builder Platform Monitor | Track market share shifts between Shopify, WooCommerce, etc. | In dev | | | Plugin Install Trends | See which plugins are gaining traction. | In dev | | | Category Popularity | Spot which product categories are heating up. | In dev | ## **Usage Notes** - Contact verification — All emails and LinkedIn profiles are verified and updated monthly. - Single domain per request — Only one store URL can be queried at a time. For multiple domains, make separate requests. - Data only, no automation — This tool retrieves contact info only. It does not send emails or LinkedIn messages automatically. ## **Setup** **100% Free. One-minute setup.** 1. Sign up at [https://eccompass.ai](https://eccompass.ai) 2. Go to **Dashboard → API Access → Create Token** 3. Set the environment variable: ```bash export APEX_TOKEN="your_token_here" ``` ## **Quick Start** **IMPORTANT**: Always use the Python script for API calls. It has the correct base URL and authentication built in. ```bash # Get LinkedIn contacts python3 {baseDir}/scripts/query.py contacts ooni.com ``` ## **API Base URL** ``` https://api.eccompass.ai ``` **CRITICAL**: All API paths start with `/public/api/v1/`. The `/public` prefix is mandatory — without it, you will get an authentication error. Never omit `/public` from the path. ## **API Endpoints** `GET https://api.eccompass.ai/public/api/v1/contacts/{domain}` ```bash curl -H "APEX_TOKEN: $APEX_TOKEN" https://api.eccompass.ai/public/api/v1/contacts/ooni.com ``` Returns verified LinkedIn contacts for a domain's company: name, position, email, LinkedIn profile URL. Use for lead generation, decision-maker lookup, or outreach. ## **Requirements** - Python 3.6+ - Network access to `api.eccompass.ai` - `APEX_TOKEN` environment variable (get yours at [eccompass.ai](https://eccompass.ai)) ## **Documentation** - [AI Instructions](SKILL.md) — How the agent uses this skill - [API Schema](references/schema.md) — Full response format and field definitions - [Usage Examples](references/examples.md) — Real-world scenarios with sample output ## **License** Proprietary — [EcCompass AI](https://eccompass.ai) ## **Support** For questions, issues, or feature requests, visit [EcCompass AI](https://eccompass.ai).

path: CHANGELOG.md
content: # Changelog

All notable changes to this skill will be documented in this file.

## [1.0.9] - 2026-04-01

### Fixed

- Fixed description

## [1.0.8] - 2026-04-01

### Added

- Modular Toolkit section explaining Sub-Skill architecture
- Full Roadmap table showing all planned Sub-Skills across Site Search, Site Analysis, and Market Analysis

## [1.0.1] - 2026-03-31

### Fixed

- Corrected API endpoint path in curl examples
- Fixed typo in environment variable setup instructions

## [1.0.0] - 2026-03-31

### Added

- Verified LinkedIn profiles and business emails for 14M+ e-commerce stores
- `GET /public/api/v1/contacts/{domain}` — name, position, email, LinkedIn URL
- Python CLI tool (`scripts/query.py`) with `contacts` subcommand
- APEX_TOKEN authentication via ECcompass dashboard




path: README.md
content: # EcCompass Ecommerce Lead Contacts
> Free, one-click access to verified LinkedIn profiles and business emails for 14M+ ecommerce stores.
Input the store URL to retrieve decision-maker contact information instantly.

## Data Coverage

Powered by [EcCompass AI](https://eccompass.ai) — one of the world's largest DTC databases — this skill delivers free, monthly-updated verified contacts for 14M+ global ecommerce stores.

| Metric | Value |
| :--- | :--- |
| Total domains | 14,000,000+ |
| Countries | 200+ |
| Platforms | Shopify, WooCommerce, Wix, Squarespace, and more |
| Lead Contacts | Verified LinkedIn profiles and business emails |
| Update frequency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Monthly |

## **Part of EcCompass Skill Set**

This Sub-skill is built by [ECcompass.ai](https://eccompass.ai). Focused Sub-skills let you use only what you need, combine flexibly, and get clean outputs.

Prefer **all-in-one**? Install [Ecommerce Website Data](https://clawhub.ai/roger52027/ecommerce-website-data) — includes all Sub-Skills with the same free API token.

##
*All features below are already available in [Ecommerce Website Data](https://clawhub.ai/roger52027/ecommerce-website-data). The "Status" column indicates standalone Sub-Skill availability.*
 
| Section | Sub-Skill | Description | Status |
|:---------|:-----------|:-------------|:--------|
| Site Search | Supplier Lead Filter | Filter sites by category, traffic, tech stack — surface the most qualified leads. &nbsp;&nbsp;&nbsp;| In dev |
| | Competitor Discovery | Find every player in your niche before they find you. | In dev |
| | Merchant Discovery | Find top-rated merchants carrying what you're looking for. | In dev |
| Site Analysis | **Lead Contacts (You are here)**&nbsp;&nbsp;&nbsp; | **Get LinkedIn profile and business email for any domain.** | ✅ **Live** |
| | Historical GMV | Track GMV over time — spot growth trajectories and plateaus. | In dev |
| | Tech Stack | Reveal plugins, themes, builders, and integrations. | In dev |
| | Traffic Monitor | Understand visits, page views, and peer rankings. | In dev |
| | Product Analysis | See categories, catalogue size, and pricing range. | In dev |
| | Social Media | Gauge social footprint and audience growth. | In dev |
| Market Analysis&nbsp;&nbsp; | Builder Platform Monitor | Track market share shifts between Shopify, WooCommerce, etc. | In dev |
| | Plugin Install Trends | See which plugins are gaining traction. | In dev |
| | Category Popularity | Spot which product categories are heating up. | In dev |

## Setup

**100% Free. One-minute setup.**
1. Sign up at [https://eccompass.ai](https://eccompass.ai)
2. Go to **Dashboard → API Access → Create Token**
3. Set the environment variable:

```bash
export APEX_TOKEN="your_token_here"
```

## Quick Start

```bash
# LinkedIn contacts
python3 scripts/query.py contacts ooni.com
```

## Data Coverage

Powered by ECcompass.ai — one of the world's largest DTC databases — this skill delivers free, monthly-updated live data on 14M+ global ecommerce stores.
| Metric | Value |
|--------|-------|
| Total domains | 14,000,000+ |
| Countries | 200+ |
| Platforms | Shopify, WooCommerce, Magento, BigCommerce, Wix, Squarespace, and more |
| Update frequency | Monthly |

## Requirements

- Python 3.6+
- Network access to `api.eccompass.ai`
- `APEX_TOKEN` environment variable (get yours at [eccompass.ai](https://eccompass.ai))

## API Endpoints

| Endpoint | Method | Description |
|----------|--------|-------------|
| `/public/api/v1/contacts/{domain}` | GET | LinkedIn contacts (name, position, email) |

## Documentation

- [AI Instructions](SKILL.md) — How the agent uses this skill
- [API Schema](references/schema.md) — Full response format and field definitions
- [Usage Examples](references/examples.md) — Real-world scenarios with sample output

## License

Proprietary — [ECcompass](https://eccompass.ai)

## Support

For questions, issues, or feature requests, visit [https://eccompass.ai](https://eccompass.ai).


path: claw.json
content: {
  "name": "ecommerce-lead-contacts",
  "version": "1.0.9",
  "description": "Free, one-click access to verified LinkedIn profiles and business emails for 14M+ ecommerce stores. Input the store URL and instantly retrieve decision-maker contact information — powered by ECcompass REST API.",
  "author": "eccompass.ai",
  "license": "Proprietary",
  "permissions": [
    "network"
  ],
  "credentials": {
    "APEX_TOKEN": {
      "description": "ECcompass API access token. Sign up at https://eccompass.ai, then go to Dashboard → API Access → Create Token.",
      "required": true
    }
  },
  "requires": {
    "bins": [
      "python3"
    ],
    "env": [
      "APEX_TOKEN"
    ]
  },
  "entry": "SKILL.md",
  "tags": [
    "ecommerce",
    "analytics",
    "market-intelligence",
    "domain-research",
    "shopify",
    "dtc"
  ],
  "models": [
    "claude-*",
    "gpt-*",
    "gemini-*"
  ],
  "pricing": "free",
  "support_url": "https://eccompass.ai",
  "homepage": "https://eccompass.ai"
}

path: scripts/query.py
content: #!/usr/bin/env python3
"""
ECcompass E-Commerce Intelligence CLI

Usage:
  python3 query.py search "pet food"
  python3 query.py search "coffee" --country CN --platform shopify
  python3 query.py search --country US --platform shopify --sort gmvLast12month
  python3 query.py domain ooni.com
  python3 query.py historical ooni.com
  python3 query.py apps ooni.com
  python3 query.py contacts ooni.com
"""

__version__ = "1.0.9"

import os
import sys
import json
import argparse
import urllib.request
import urllib.error
import urllib.parse

[REDACTED_SECRET]"APEX_TOKEN", "")
API_BASE = "https://api.eccompass.ai"


def api_request(method, path, body=None):
    url = f"{API_BASE}{path}"
    data = json.dumps(body).encode("utf-8") if body else None
    req = urllib.request.Request(url, data=data, method=method, headers={
        "APEX_TOKEN": TOKEN,
        "Content-Type": "application/json",
    })
    try:
        with urllib.request.urlopen(req, timeout=30) as resp:
            return json.loads(resp.read().decode())
    except urllib.error.HTTPError as e:
        raw = e.read().decode() if e.fp else ""
        try:
            msg = json.loads(raw).get("message", raw)
        except Exception:
            msg = raw or str(e)
        print(f"Error {e.code}: {msg}", file=sys.stderr)
        sys.exit(1)
    except urllib.error.URLError as e:
        print(f"Connection failed: {e}", file=sys.stderr)
        sys.exit(1)


def fmt_money(n):
    if n is None:
        return "N/A"
    try:
        n = float(n)
        if n >= 1e9:
            return f"${n / 1e9:.1f}B"
        if n >= 1e6:
            return f"${n / 1e6:.1f}M"
        if n >= 1e3:
            return f"${n / 1e3:.0f}K"
        return f"${n:.0f}"
    except (ValueError, TypeError):
        return str(n) if n else "N/A"


def fmt_num(n):
    if n is None:
        return "0"
    try:
        n = float(n)
        if n >= 1e6:
            return f"{n / 1e6:.1f}M"
        if n >= 1e3:
            return f"{n / 1e3:.0f}K"
        return str(int(n))
    except (ValueError, TypeError):
        return "0"


def fmt_growth(g):
    if g is None:
        return "N/A"
    try:
        return f"{float(g):+.1f}%"
    except (ValueError, TypeError):
        return "N/A"


def build_search_body(args):
    body = {"page": args.page, "size": args.size}

    if args.keyword:
        body["keyword"] = args.keyword

    filters = {}
    if args.country:
        vals = [c.strip().upper() for c in args.country.split(",")]
        filters["countryCode4"] = vals if len(vals) > 1 else vals[0]
    if args.platform:
        vals = [p.strip().lower() for p in args.platform.split(",")]
        filters["platform"] = vals if len(vals) > 1 else vals[0]
    if args.region:
        vals = [r.strip() for r in args.region.split(",")]
        filters["region"] = vals if len(vals) > 1 else vals[0]
    if args.status:
        filters["status"] = args.status
    if args.language:
        filters["languageCode"] = args.language
    if filters:
        body["filters"] = filters

    ranges = {}
    if args.min_gmv is not None:
        ranges["gmvLast12month"] = {"min": args.min_gmv}
    if args.min_growth is not None:
        ranges["growth"] = {"min": args.min_growth}
    if args.min_employees is not None:
        ranges["employeeCount"] = {"min": args.min_employees}
    if args.min_instagram is not None:
        ranges["instagramFollowers"] = {"min": args.min_instagram}
    if args.min_tiktok is not None:
        ranges["tiktokFollowers"] = {"min": args.min_tiktok}
    if args.min_visits is not None:
        ranges["estimatedVisits"] = {"min": args.min_visits}
    if ranges:
        body["ranges"] = ranges

    if args.exists:
        body["exists"] = [f.strip() for f in args.exists.split(",")]

    if args.sort:
        body["sortField"] = args.sort
        body["sortOrder"] = args.order or "desc"

    return body


def cmd_search(args):
    body = build_search_body(args)
    resp = api_request("POST", "/public/api/v1/search", body)

    if not resp.get("success"):
        print(f"API error: {resp.get('message', 'Unknown error')}", file=sys.stderr)
        sys.exit(1)

    data = resp["data"]
    records = data.get("records", [])
    total = data.get("total", 0)
    page = data.get("page", 1)
    total_pages = data.get("totalPages", 1)

    if args.json:
        print(json.dumps(resp, indent=2, ensure_ascii=False, default=str))
        return

    label_parts = []
    if args.keyword:
        label_parts.append(f"keyword='{args.keyword}'")
    if args.country:
        label_parts.append(f"country={args.country.upper()}")
    if args.region:
        label_parts.append(f"region={args.region}")
    if args.platform:
        label_parts.append(f"platform={args.platform}")
    label = " | ".join(label_parts) if label_parts else "all"

    print(f"\nSearch: {label} | {total} results | page {page}/{total_pages}\n")
    print(f"{'#':<4} {'Domain':<30} {'Platform':<12} {'Country':<8} {'GMV(12m)':<12} {'Growth':<8}")
    print("-" * 78)

    for i, r in enumerate(records, (page - 1) * args.size + 1):
        domain = r.get("domain", "N/A")
        platform = r.get("platform", "")
        country = r.get("countryCode4", "")
        gmv = fmt_money(r.get("gmvLast12month"))
        growth = fmt_growth(r.get("growth"))
        print(f"{i:<4} {domain:<30} {platform:<12} {country:<8} {gmv:<12} {growth:<8}")
        title = r.get("title") or r.get("merchantName") or ""
        if title:
            print(f"     {title[:70]}")
        desc = (r.get("description") or "")[:90]
        if desc:
            print(f"     {desc}")
        print()

    if not records:
        print("  No results found.")
    print()


def cmd_historical(args):
    resp = api_request("GET", f"/public/api/v1/historical/{urllib.parse.quote(args.domain, safe='.')}")

    if not resp.get("success"):
        print(f"API error: {resp.get('message', 'Unknown error')}", file=sys.stderr)
        sys.exit(1)

    data = resp["data"]

    if args.json:
        print(json.dumps(resp, indent=2, ensure_ascii=False, default=str))
        return

    records = data.get("records", [])
    months = data.get("months", [])
    total = data.get("total", 0)

    print(f"\nHistorical Data: {args.domain} | {total} months\n")
    print(f"{'Month':<12} {'Monthly GMV':<14} {'Yearly GMV':<14} {'UV':<12} {'PV':<12} {'Avg Price':<10}")
    print("-" * 76)

    for r in records:
        month = r.get("dataMonth", "")
        mgmv = fmt_money(r.get("monthlyGmv"))
        ygmv = fmt_money(r.get("yearlyGmv"))
        uv = fmt_num(r.get("uv"))
        pv = fmt_num(r.get("pv"))
        avg = f"${r.get('avgPriceUsd', 0)}" if r.get("avgPriceUsd") else "N/A"
        print(f"{month:<12} {mgmv:<14} {ygmv:<14} {uv:<12} {pv:<12} {avg:<10}")

    if not records:
        print("  No historical data found.")
    print()


def cmd_installed_apps(args):
    resp = api_request("GET", f"/public/api/v1/installed-apps/{urllib.parse.quote(args.domain, safe='.')}")

    if not resp.get("success"):
        print(f"API error: {resp.get('message', 'Unknown error')}", file=sys.stderr)
        sys.exit(1)

    if args.json:
        print(json.dumps(resp, indent=2, ensure_ascii=False, default=str))
        return

    apps = resp.get("data", [])
    total = resp.get("total", len(apps))

    print(f"\nInstalled Apps: {args.domain} | {total} apps\n")
    print(f"{'#':<4} {'App Name':<35} {'Rating':<8} {'Installs':<10} {'State':<8}")
    print("-" * 70)

    for i, app in enumerate(apps, 1):
        name = (app.get("name") or "")[:34]
        rating = app.get("averageRating") or "N/A"
        installs = fmt_num(app.get("installs"))
        state = app.get("state") or ""
        print(f"{i:<4} {name:<35} {rating:<8} {installs:<10} {state:<8}")
        vendor = app.get("vendorName") or ""
        if vendor:
            print(f"     Vendor: {vendor}")

    if not apps:
        print("  No installed apps found.")
    print()


def cmd_contacts(args):
    resp = api_request("GET", f"/public/api/v1/contacts/{urllib.parse.quote(args.domain, safe='.')}")

    if not resp.get("success"):
        print(f"API error: {resp.get('message', 'Unknown error')}", file=sys.stderr)
        sys.exit(1)

    if args.json:
        print(json.dumps(resp, indent=2, ensure_ascii=False, default=str))
        return

    data = resp.get("data", {})
    contacts = data.get("contacts", [])
    total = data.get("total", 0)

    print(f"\nLinkedIn Contacts: {args.domain} | {total} contacts\n")
    print(f"{'#':<4} {'Name':<25} {'Position':<40} {'Email':<30}")
    print("-" * 100)

    for i, c in enumerate(contacts, 1):
        name = f"{c.get('firstName', '')} {c.get('lastName', '')}".strip()
        position = (c.get("position") or "")[:39]
        email = c.get("email") or ""
        print(f"{i:<4} {name:<25} {position:<40} {email:<30}")

    if not contacts:
        print("  No LinkedIn contacts found.")
    print()


def cmd_domain(args):
    resp = api_request("GET", f"/public/api/v1/domain/{urllib.parse.quote(args.domain, safe='.')}")

    if not resp.get("success"):
        print(f"API error: {resp.get('message', 'Unknown error')}", file=sys.stderr)
        sys.exit(1)

    s = resp["data"]

    if args.json:
        print(json.dumps(resp, indent=2, ensure_ascii=False, default=str))
        return

    print(f"\n{'=' * 64}")
    print(f"  Domain:    {s.get('domain', 'N/A')}")
    print(f"  Brand:     {s.get('merchantName') or s.get('title') or 'N/A'}")
    print(f"  Platform:  {s.get('platform', 'N/A')}  |  Plan: {s.get('plan', 'N/A')}")
    print(f"  Country:   {s.get('countryCode4', 'N/A')}  |  City: {s.get('city', 'N/A')}  |  State: {s.get('state', 'N/A')}")
    print(f"  Status:    {s.get('status', 'N/A')}  |  Created: {str(s.get('created', ''))[:10]}")
    print(f"  Employees: {s.get('employeeCount', 'N/A')}")
    print(f"{'=' * 64}")

    print(f"\n  Revenue (GMV)")
    print(f"  {'2023:':<10} {fmt_money(s.get('gmv2023'))}")
    print(f"  {'2024:':<10} {fmt_money(s.get('gmv2024'))}")
    print(f"  {'2025:':<10} {fmt_money(s.get('gmv2025'))}")
    print(f"  {'2026:':<10} {fmt_money(s.get('gmv2026'))}")
    print(f"  {'Last 12m:':<10} {fmt_money(s.get('gmvLast12month'))}")
    print(f"  {'Growth:':<10} {fmt_growth(s.get('growth'))}")
    print(f"  {'Monthly:':<10} {s.get('estimatedMonthlySales', 'N/A')}")

    print(f"\n  Products")
    print(f"  Count: {s.get('productCount', 'N/A')}  |  Avg Price: {s.get('avgPriceFormatted') or s.get('avgPriceUsd') or 'N/A'}")

    print(f"\n  Traffic")
    print(f"  Monthly Visits: {fmt_num(s.get('estimatedVisits'))}  |  Page Views: {fmt_num(s.get('estimatedPageViews'))}")
    print(f"  Alexa Rank: #{s.get('alexaRank', 'N/A')}  |  Platform Rank: #{s.get('platformRank', 'N/A')}")

    print(f"\n  Social Media")
    socials = [
        ("Instagram", "instagramFollowers", "instagramFollowers30d"),
        ("TikTok", "tiktokFollowers", "tiktokFollowers30d"),
        ("Twitter/X", "twitterFollowers", "twitterFollowers30d"),
        ("YouTube", "youtubeFollowers", "youtubeFollowers30d"),
        ("Facebook", "facebookFollowers", "facebookFollowers30d"),
        ("Pinterest", "pinterestFollowers", "pinterestFollowers30d"),
    ]
    for name, fld, fld_30d in socials:
        val = s.get(fld)
        d30 = s.get(fld_30d)
        if val:
            d30_str = f"  (30d: {d30:+,})" if d30 else ""
            print(f"  {name:<12} {fmt_num(val)}{d30_str}")

    desc = s.get("description", "")
    if desc:
        print(f"\n  Description")
        print(f"  {desc[:200]}")

    tags = s.get("tagsV5") or s.get("tagsFirst") or ""
    if tags:
        print(f"\n  Tags: {tags[:120]}")

    cats = s.get("categoriesV1") or s.get("categories") or ""
    if cats:
        print(f"  Categories: {cats[:120]}")

    emails = s.get("emails", "")
    phones = s.get("phones", "")
    if emails or phones:
        print(f"\n  Contact")
        if emails:
            print(f"  Email: {emails[:100]}")
        if phones:
            print(f"  Phone: {phones[:60]}")

    print()


def main():
    parser = argparse.ArgumentParser(
        description="ECcompass E-Commerce Intelligence CLI"
    )
    parser.add_argument(
        "--version", action="version",
        version=f"%(prog)s {__version__}"
    )
    sub = parser.add_subparsers(dest="cmd", required=True)

    p_search = sub.add_parser("search", help="Search e-commerce domains")
    p_search.add_argument("keyword", nargs="?", default=None, help="Search keyword (optional if filters provided)")
    p_search.add_argument("--country", help="Country code(s), comma-separated for OR, e.g. US,GB,DE")
    p_search.add_argument("--platform", help="Platform(s), comma-separated for OR, e.g. shopify,woocommerce")
    p_search.add_argument("--region", help="Region(s), comma-separated for OR, e.g. Europe,Africa")
    p_search.add_argument("--status", help="Site status filter")
    p_search.add_argument("--language", help="Language code filter")
    p_search.add_argument("--min-gmv", type=float, help="Minimum GMV last 12 months (USD)")
    p_search.add_argument("--min-growth", type=float, help="Minimum YoY growth rate (decimal)")
    p_search.add_argument("--min-employees", type=float, help="Minimum employee count")
    p_search.add_argument("--min-instagram", type=float, help="Minimum Instagram followers")
    p_search.add_argument("--min-tiktok", type=float, help="Minimum TikTok followers")
    p_search.add_argument("--min-visits", type=float, help="Minimum monthly visits")
    p_search.add_argument("--exists", help="Fields that must exist, comma-separated, e.g. tiktokUrl,emails")
    p_search.add_argument("--sort", help="Sort field (camelCase), e.g. gmvLast12month, growth")
    p_search.add_argument("--order", choices=["asc", "desc"], default="desc", help="Sort order (default: desc)")
    p_search.add_argument("--page", type=int, default=1, help="Page number (default: 1)")
    p_search.add_argument("--size", type=int, default=20, help="Results per page (max 100, default: 20)")
    p_search.add_argument("--json", action="store_true", help="Output raw JSON response")

    p_domain = sub.add_parser("domain", help="Get full analytics for a domain")
    p_domain.add_argument("domain", help="Domain name, e.g. ooni.com")
    p_domain.add_argument("--json", action="store_true", help="Output raw JSON response")

    p_hist = sub.add_parser("historical", help="Get historical GMV and traffic data")
    p_hist.add_argument("domain", help="Domain name, e.g. ooni.com")
    p_hist.add_argument("--json", action="store_true", help="Output raw JSON response")

    p_apps = sub.add_parser("apps", help="Get installed apps/plugins for a domain")
    p_apps.add_argument("domain", help="Domain name, e.g. ooni.com")
    p_apps.add_argument("--json", action="store_true", help="Output raw JSON response")

    p_contacts = sub.add_parser("contacts", help="Get LinkedIn contacts for a domain")
    p_contacts.add_argument("domain", help="Domain name, e.g. ooni.com")
    p_contacts.add_argument("--json", action="store_true", help="Output raw JSON response")

    args = parser.parse_args()

    if not [REDACTED_SECRET]"Error: APEX_TOKEN environment variable is required.", file=sys.stderr)
        print("", file=sys.stderr)
        print("  1. Sign up at https://eccompass.ai", file=sys.stderr)
        print("  2. Go to Dashboard → API Access → Create Token", file=sys.stderr)
        print("  3. Run: export APEX_TOKEN='your_token_here'", file=sys.stderr)
        sys.exit(1)

    if args.cmd == "search":
        cmd_search(args)
    elif args.cmd == "domain":
        cmd_domain(args)
    elif args.cmd == "historical":
        cmd_historical(args)
    elif args.cmd == "apps":
        cmd_installed_apps(args)
    elif args.cmd == "contacts":
        cmd_contacts(args)


if __name__ == "__main__":
    main()


path: references/examples.md
content: # Usage Examples

## Example 1: Search by Keyword

Find e-commerce sites related to "pizza oven":

```bash
python3 scripts/query.py search "pizza oven" --size 5
```

Expected output:

```
Search: keyword='pizza oven' | 42 results | page 1/9

#    Domain                         Platform     Country  GMV(12m)     Growth
------------------------------------------------------------------------------
1    ooni.com                       shopify      GB       $56.0M       +13.3%
     Ooni Pizza Ovens
     Make great pizza at home with Ooni portable pizza ovens...

2    pizzaovens.com                 woocommerce  US       $2.1M        +8.5%
     Pizza Ovens - Wood Fired & Gas
     Shop wood fired and gas pizza ovens for home and commercial use...
```

## Example 2: Search with Filters

Find Shopify stores selling coffee in China:

```bash
python3 scripts/query.py search "coffee" --country CN --platform shopify
```

Expected output:

```
Search: keyword='coffee' | country=CN | platform=shopify | 8 results | page 1/1

#    Domain                         Platform     Country  GMV(12m)     Growth
------------------------------------------------------------------------------
1    example-coffee.cn              shopify      CN       $5.6M        +11.5%
     Example Coffee Shop
     Premium coffee beans...
```

## Example 3: Filter-Only Search (No Keyword)

Find all US Shopify stores with GMV > $1M:

```bash
python3 scripts/query.py search --country US --platform shopify --min-gmv 1000000 --sort gmvLast12month
```

## Example 4: Range Filters

Find stores with significant social media presence and high growth:

```bash
python3 scripts/query.py search "fashion" --min-instagram 10000 --min-growth 0.2 --sort growth
```

## Example 5: Get Domain Analytics

Look up full analytics for a specific domain:

```bash
python3 scripts/query.py domain ooni.com
```

Expected output:

```
================================================================
  Domain:    ooni.com
  Brand:     Ooni
  Platform:  shopify  |  Plan: Shopify Plus
  Country:   GB  |  City: Edinburgh  |  State: Scotland
  Status:    active  |  Created: 2018-03-15
  Employees: 250
================================================================

  Revenue (GMV)
  2023:      $45.0M
  2024:      $52.0M
  2025:      $58.0M
  2026:      N/A
  Last 12m:  $56.0M
  Growth:    +13.3%
  Monthly:   5000000

  Products
  Count: 85  |  Avg Price: $349.00

  Traffic
  Monthly Visits: 2.5M  |  Page Views: 8.1M
  Alexa Rank: #45230  |  Platform Rank: #312

  Social Media
  Instagram    520K  (30d: +3,200)
  TikTok       180K  (30d: +8,500)
  Facebook     290K  (30d: +1,100)
  YouTube      45K

  Description
  Make great pizza at home with Ooni portable outdoor pizza ovens...

  Tags: pizza oven, outdoor cooking, wood fired, gas oven
  Categories: Food & Drink > Kitchen Appliances
```

## Example 6: Export Raw JSON

Get machine-readable output for further processing:

```bash
python3 scripts/query.py domain ooni.com --json
```

Returns the full API response as formatted JSON — useful for piping into `jq` or other tools.

## Example 7: Paginated Search with Filters

```bash
# Page 1
python3 scripts/query.py search "coffee" --country US --page 1 --size 10

# Page 2
python3 scripts/query.py search "coffee" --country US --page 2 --size 10
```

## Example 8: Competitor Analysis Workflow

Step 1 — Discover competitors by keyword + country:

```bash
python3 scripts/query.py search "sustainable fashion" --country US --min-gmv 500000 --size 10
```

Step 2 — Get detailed analytics for each competitor:

```bash
python3 scripts/query.py domain everlane.com
python3 scripts/query.py domain reformation.com
python3 scripts/query.py domain patagonia.com
```

Step 3 — Export JSON for comparison:

```bash
python3 scripts/query.py domain everlane.com --json > everlane.json
python3 scripts/query.py domain reformation.com --json > reformation.json
```

## Example 9: Direct API Call (curl)

```bash
curl -X POST https://api.eccompass.ai/public/api/v1/search \
  -H "APEX_TOKEN: $APEX_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "keyword": "coffee",
    "filters": {"countryCode4": "CN", "platform": "shopify"},
    "ranges": {"gmvLast12month": {"min": 100000}},
    "sortField": "gmvLast12month",
    "sortOrder": "desc",
    "page": 1,
    "size": 20
  }'
```


path: references/schema.md
content: # ECcompass API Response Schema

## API Base URL

```
https://api.eccompass.ai
```

**CRITICAL: All paths include `/public/api/v1/` prefix. The `/public` part is mandatory — omitting it will cause authentication errors.**

Authentication: Pass your API token via the `APEX_TOKEN` HTTP header (NOT the `Authorization` header).

## Common Response Envelope

All endpoints return:

```json
{
  "success": true,
  "message": "...",
  "data": { ... }
}
```

Error response:

```json
{
  "success": false,
  "code": 400,
  "message": "Domain not found"
}
```

---

## 1. Search — `POST https://api.eccompass.ai/public/api/v1/search`

### Request

```
POST https://api.eccompass.ai/public/api/v1/search
APEX_TOKEN: <your_token>
Content-Type: application/json
```

### Request Body

| Field | Type | Required | Description |
|-------|------|----------|-------------|
| `keyword` | string | No | Text search across domain, title, description, tags, categories, **platform**, merchant name, technologies, **installed apps** (case-insensitive, partial match) |
| `filters` | object | No | Match filters. Key = field name (camelCase), Value = string or array of strings (array = OR logic) |
| `ranges` | object | No | Numeric range filters. Key = field name, Value = `{ "min": N, "max": N }` |
| `exists` | array | No | Fields that must exist (not null/empty). Use camelCase names. E.g. `["tiktokUrl", "emails"]` |
| `sortField` | string | No | Field name to sort by (camelCase) |
| `sortOrder` | string | No | `asc` or `desc` (default: desc) |
| `page` | int | No | Page number, starts from 1 (default: 1) |
| `size` | int | No | Results per page, max 100 (default: 20) |

### All Available Fields

All fields below can be used in `filters`, `ranges` (numeric only), or `exists`. Filters are **case-insensitive**. Use an array for OR logic: `"region": ["Europe", "Africa"]`.

#### Geography (Keyword — exact match filters)

| Field | Description |
|-------|-------------|
| `countryCode4` | Primary country code (US, CN, GB, etc.) — **most commonly used** |
| `countryCode` | Country code (alternative) |
| `countryCode2` | 2-letter country code |
| `countryCode3` | 3-letter country code |
| `region` | Continent (Europe, Africa, Asia, Americas, Oceania) |
| `subregion` | Subregion (Northern Europe, Southeast Asia, etc.) |
| `city` | City name |
| `state` | State / province |
| `zip` | ZIP / postal code |
| `streetAddress` | Street address |
| `latitude` | Latitude |
| `longitude` | Longitude |

#### Platform & Store (Keyword — exact match filters)

| Field | Description |
|-------|-------------|
| `platform` | E-commerce platform (shopify, woocommerce, magento, shopline, etc.) |
| `plan` | Platform plan (e.g. Shopify Plus) |
| `status` | Site status (active, etc.) |
| `platformDomain` | Platform domain |
| `lastPlatform` | Last known platform |
| `lastPlan` | Last known plan |
| `lastPlatformChanged` | Date of last platform change |
| `lastPlanChanged` | Date of last plan change |
| `created` | Store creation date |
| `languageCode` | Primary language code |
| `currency` | Currency code |
| `salesChannels` | Sales channels |

#### Content (Text — partial match filters)

| Field | Description |
|-------|-------------|
| `title` | Website title |
| `description` | Website description |
| `merchantName` | Store / brand name |
| `categories` | Product categories |
| `categoriesV1` | Standardized categories (Keyword) |
| `tags` | Tags |
| `tagsV5` | AI-generated tags (best for search) |
| `tagsFirst` | Primary tag (Keyword) |
| `metaDescription` | HTML meta description |
| `metaKeywords` | HTML meta keywords |
| `features` | Store features |

#### Tech Stack (Text — partial match filters)

| Field | Description |
|-------|-------------|
| `technologies` | Detected technologies (JSON) |
| `installedApps` | Installed apps / plugins (comma-separated) — use for app queries like "klaviyo" |
| `theme` | Theme name |
| `themeVendor` | Theme vendor |
| `themeSpend` | Theme price |
| `themeVersion` | Theme version (Keyword) |

#### Contact (Text — best used with `exists`)

| Field | Description |
|-------|-------------|
| `emails` | Business email addresses |
| `phones` | Phone numbers |
| `contactPageUrl` | Contact page URL |

#### Social URLs (Text/Keyword — best used with `exists`)

| Field | Description |
|-------|-------------|
| `tiktokUrl` | TikTok profile URL |
| `instagramUrl` | Instagram profile URL (Keyword) |
| `facebookUrl` | Facebook page URL (Keyword) |
| `youtubeUrl` | YouTube channel URL |
| `twitterUrl` | Twitter/X profile URL |
| `linkedinUrl` | LinkedIn page URL (Keyword) |
| `pinterestUrl` | Pinterest profile URL |
| `linkedinAccount` | LinkedIn account (Keyword) |

#### Revenue (Long — for `ranges`, all in USD)

| Field | Description |
|-------|-------------|
| `gmvLast12month` | Last 12 months GMV — **most commonly used** |
| `gmv2023` | 2023 annual GMV |
| `gmv2024` | 2024 annual GMV |
| `gmv2025` | 2025 annual GMV |
| `gmv2026` | 2026 annual GMV |
| `estimatedMonthlySales` | Estimated monthly GMV |
| `estimatedSalesYearly` | Estimated yearly GMV |

#### Traffic & Ranking (Integer/Long — for `ranges`)

| Field | Description |
|-------|-------------|
| `estimatedVisits` | Estimated monthly visits (Long) |
| `estimatedPageViews` | Estimated monthly page views (Long) |
| `alexaRank` | Alexa global rank |
| `rank` | Overall rank |
| `platformRank` | Rank within platform |
| `rankPercentile` | Rank percentile (Float) |
| `platformRankPercentile` | Platform rank percentile (Float) |

#### Products (Integer/Long — for `ranges`)

| Field | Description |
|-------|-------------|
| `productCount` | Number of products (Long) |
| `avgPriceUsd` | Average price in USD |
| `maxPrice` | Highest product price |
| `minPrice` | Lowest product price |
| `variantCount` | Number of variants |
| `productImages` | Total product images (Long) |
| `productsSold` | Products sold |
| `vendorCount` | Number of vendors (Long) |
| `monthlyAppSpend` | Monthly app spend |

#### Employees (Integer — for `ranges`)

| Field | Description |
|-------|-------------|
| `employeeCount` | Number of employees |

#### Social Followers (Integer — for `ranges`)

| Platform | Followers | 30d Change | 90d Change |
|----------|-----------|------------|------------|
| Instagram | `instagramFollowers` | `instagramFollowers30d` | `instagramFollowers90d` |
| TikTok | `tiktokFollowers` | `tiktokFollowers30d` | `tiktokFollowers90d` |
| Twitter/X | `twitterFollowers` | `twitterFollowers30d` | `twitterFollowers90d` |
| YouTube | `youtubeFollowers` | `youtubeFollowers30d` | `youtubeFollowers90d` |
| Facebook | `facebookFollowers` | `facebookFollowers30d` | `facebookFollowers90d` |
| Pinterest | `pinterestFollowers`(Long) | `pinterestFollowers30d`(Long) | `pinterestFollowers90d`(Long) |

Additional: `facebookLikes`, `instagramPosts`, `twitterPosts`, `pinterestPosts`

#### Growth (Double — for `ranges`)

| Field | Description |
|-------|-------------|
| `growth` | Year-over-year growth rate (decimal, 0.25 = 25%) |

### Example Requests

Single-value filter:

```json
{
  "keyword": "coffee",
  "filters": {
    "countryCode4": "CN",
    "platform": "shopify"
  },
  "ranges": { "gmvLast12month": { "min": 100000 } },
  "sortField": "gmvLast12month",
  "sortOrder": "desc",
  "page": 1,
  "size": 20
}
```

Array filter (OR logic):

```json
{
  "keyword": "energy drink",
  "filters": {
    "region": ["Europe", "Africa"]
  }
}
```

Exists filter (field must be present):

```json
{
  "filters": {"platform": "shopline"},
  "exists": ["tiktokUrl"]
}
```

### `data` Structure

| Field | Type | Description |
|-------|------|-------------|
| `records` | array | List of matching domains |
| `total` | long | Total number of matches |
| `page` | int | Current page number |
| `size` | int | Results per page |
| `totalPages` | long | Total pages |

### Fields in Each Record

| Field | Type | Description |
|-------|------|-------------|
| `domain` | string | Domain name |
| `merchantName` | string | Store / brand name |
| `title` | string | Website title |
| `description` | string | Website description |
| `categories` | string | Product categories |
| `countryCode4` | string | Country code (US / CN / GB, etc.) |
| `platform` | string | E-commerce platform (shopify / woocommerce, etc.) |
| `estimatedMonthlySales` | long | Estimated monthly GMV (USD) |
| `gmv2023` | long | 2023 GMV (USD) |
| `gmv2024` | long | 2024 GMV |
| `gmv2025` | long | 2025 GMV |
| `gmv2026` | long | 2026 GMV |
| `gmvLast12month` | long | Last 12 months GMV |
| `growth` | double | YoY growth rate (decimal, 0.25 = 25%) |

### Example Response

```json
{
  "success": true,
  "message": "Search completed successfully",
  "data": {
    "records": [
      {
        "domain": "example-coffee.cn",
        "merchantName": "Example Coffee",
        "title": "Example Coffee Shop",
        "description": "Premium coffee beans...",
        "categories": "Food & Drink",
        "countryCode4": "CN",
        "platform": "shopify",
        "estimatedMonthlySales": "500000",
        "gmv2023": 4500000,
        "gmv2024": 5200000,
        "gmv2025": 5800000,
        "gmv2026": null,
        "gmvLast12month": 5600000,
        "growth": 11.5
      }
    ],
    "total": 8,
    "page": 1,
    "size": 20,
    "totalPages": 1
  }
}
```

---

## 2. Domain Analytics — `GET https://api.eccompass.ai/public/api/v1/domain/{domain}`

### Request

```
GET https://api.eccompass.ai/public/api/v1/domain/ooni.com
APEX_TOKEN: <your_token>
```

### `data` Fields (PublicDomainDto, 100+ fields)

#### Basic Info

| Field | Type | Description |
|-------|------|-------------|
| `id` | long | Record ID |
| `domain` | string | Domain name |
| `merchantName` | string | Brand / store name |
| `title` | string | Website title |
| `description` | string | Website description |
| `platform` | string | E-commerce platform |
| `plan` | string | Platform plan (e.g. Shopify Plus) |
| `status` | string | Site status |
| `created` | string | Store creation date |
| `languageCode` | string | Primary language |

#### Geography

| Field | Type | Description |
|-------|------|-------------|
| `countryCode4` | string | Primary country code (US / CN / GB) |
| `countryCode` | string | Country code |
| `city` | string | City |
| `state` | string | State / province |
| `region` | string | Region |
| `subregion` | string | Subregion |
| `streetAddress` | string | Street address |
| `zip` | string | ZIP / postal code |
| `latitude` | string | Latitude |
| `longitude` | string | Longitude |
| `companyLocation` | string | Company location |

#### Revenue (GMV, USD)

| Field | Type | Description |
|-------|------|-------------|
| `gmv2023` | long | 2023 GMV |
| `gmv2024` | long | 2024 GMV |
| `gmv2025` | long | 2025 GMV |
| `gmv2026` | long | 2026 GMV |
| `gmvLast12month` | long | Last 12 months GMV (most commonly used) |
| `growth` | double | YoY growth rate (decimal) |
| `estimatedMonthlySales` | long | Estimated monthly GMV (USD) |
| `estimatedSalesYearly` | long | Estimated yearly GMV (USD) |

#### Products

| Field | Type | Description |
|-------|------|-------------|
| `productCount` | long | Number of products |
| `avgPriceUsd` | int | Average price (USD, integer) |
| `avgPriceFormatted` | string | Formatted average price (e.g. $58.30) |
| `averageProductPrice` | string | Average product price |
| `currency` | string | Currency |
| `maxPrice` | int | Highest price |
| `minPrice` | int | Lowest price |
| `variantCount` | int | Number of variants |
| `productImages` | long | Total product images |
| `productsSold` | int | Products sold |

#### Traffic & Ranking

| Field | Type | Description |
|-------|------|-------------|
| `estimatedVisits` | long | Estimated monthly visits |
| `estimatedPageViews` | long | Estimated monthly page views |
| `alexaRank` | int | Alexa global rank |
| `platformRank` | int | Rank within platform |
| `rank` | int | Overall rank |
| `employeeCount` | int | Number of employees |

#### Social Media

Each platform includes: followers / 30-day change / 90-day change / profile URL

| Platform | Followers | 30d Change | 90d Change |
|----------|-----------|------------|------------|
| Instagram | `instagramFollowers` | `instagramFollowers30d` | `instagramFollowers90d` |
| TikTok | `tiktokFollowers` | `tiktokFollowers30d` | `tiktokFollowers90d` |
| Twitter/X | `twitterFollowers` | `twitterFollowers30d` | `twitterFollowers90d` |
| YouTube | `youtubeFollowers` | `youtubeFollowers30d` | `youtubeFollowers90d` |
| Facebook | `facebookFollowers` | `facebookFollowers30d` | `facebookFollowers90d` |
| Pinterest | `pinterestFollowers` | `pinterestFollowers30d` | `pinterestFollowers90d` |

URL fields: `instagramUrl`, `tiktokUrl`, `twitterUrl`, `youtubeUrl`, `facebookUrl`, `pinterestUrl`, `linkedinUrl`

#### Tags & Categories

| Field | Type | Description |
|-------|------|-------------|
| `tagsV5` | string | AI-generated product tags (best for search) |
| `tagsFirst` | string | Primary category tag |
| `tags` | string | Tags |
| `categories` | string | Categories |
| `categoriesV1` | string | Standardized categories |

#### Technology Stack

| Field | Type | Description |
|-------|------|-------------|
| `technologies` | string | Detected technologies (JSON) |
| `installedApps` | string | Installed apps (comma-separated) |
| `theme` | string | Theme name |
| `themeVendor` | string | Theme vendor |
| `themeVersion` | string | Theme version |
| `monthlyAppSpend` | int | Monthly app spend |
| `features` | string | Features |

#### Contact

| Field | Type | Description |
|-------|------|-------------|
| `emails` | string | Email addresses |
| `phones` | string | Phone numbers |
| `contactPageUrl` | string | Contact page URL |

#### Reviews

| Field | Type | Description |
|-------|------|-------------|
| `trustpilot` | string | Trustpilot rating / info |
| `yotpo` | string | Yotpo rating / review count |

---

## 3. Historical Data — `GET https://api.eccompass.ai/public/api/v1/historical/{domain}`

### Request

```
GET https://api.eccompass.ai/public/api/v1/historical/ooni.com
APEX_TOKEN: <your_token>
```

### `data` Structure

| Field | Type | Description |
|-------|------|-------------|
| `records` | array | Monthly records |
| `total` | int | Total number of months |
| `months` | array | List of available months (YYYY-MM) |

### Fields in Each Monthly Record

| Field | Type | Description |
|-------|------|-------------|
| `dataMonth` | string | Month (YYYY-MM) |
| `domain` | string | Domain name |
| `category` | string | Product category |
| `monthlyGmv` | long | Monthly GMV (USD) |
| `yearlyGmv` | long | Yearly GMV (USD, available from 2025+) |
| `pv` | long | Page views |
| `uv` | long | Unique visitors |
| `avgPriceUsd` | int | Average product price (USD) |

---

## 4. Installed Apps — `GET https://api.eccompass.ai/public/api/v1/installed-apps/{domain}`

### Request

```
GET https://api.eccompass.ai/public/api/v1/installed-apps/ooni.com
APEX_TOKEN: <your_token>
```

### Response

`data` is an array of installed app objects. `total` is the count.

### Fields in Each App

| Field | Type | Description |
|-------|------|-------------|
| `token` | string | App unique identifier |
| `name` | string | App name |
| `description` | string | App description |
| `categories` | string | App categories (JSON array string) |
| `platform` | string | Platform (shopify, etc.) |
| `state` | string | Install state (Active, etc.) |
| `installedAt` | string | Installation date (ISO 8601) |
| `averageRating` | string | Average rating |
| `reviewCount` | int | Number of reviews |
| `installs` | int | Total installs across all stores |
| `installs30d` | int | Install count change (30 days) |
| `installs90d` | int | Install count change (90 days) |
| `appStoreUrl` | string | App store listing URL |
| `vendorName` | string | Vendor / developer name |
| `vendorEmail` | string | Vendor contact email |
| `vendorUrl` | string | Vendor profile URL |
| `plans` | string | Pricing plans (JSON array string) |
| `freeTrialDuration` | string | Free trial duration |

---

## 5. LinkedIn Contacts — `GET https://api.eccompass.ai/public/api/v1/contacts/{domain}`

### Request

```
GET https://api.eccompass.ai/public/api/v1/contacts/ooni.com
APEX_TOKEN: <your_token>
```

### `data` Structure

| Field | Type | Description |
|-------|------|-------------|
| `domain` | string | Domain name |
| `contacts` | array | List of LinkedIn contacts |
| `total` | int | Number of contacts |

### Fields in Each Contact

| Field | Type | Description |
|-------|------|-------------|
| `firstName` | string | First name |
| `lastName` | string | Last name |
| `position` | string | Job title / position |
| `email` | string | Verified email address |
| `companyName` | string | Company name |
| `status` | string | Email verification status |
| `sourcePage` | string | LinkedIn profile URL |

---

## Common Platform Values

`shopify` / `woocommerce` / `magento` / `bigcommerce` / `wix` / `squarespace` / `shopline` / `shoplazza` / `custom`

## Common Country Codes (countryCode4)

| Code | Country |
|------|---------|
| `US` | United States |
| `CN` | China |
| `GB` | United Kingdom |
| `CA` | Canada |
| `DE` | Germany |
| `AU` | Australia |
| `FR` | France |
| `JP` | Japan |


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