{"id":"94f03650-bf4d-495d-9718-b66ba4c1386f","shortId":"QYzfYe","kind":"skill","title":"domain-expired-opportunity-finder","tagline":"Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.","description":"# Expired Domain Opportunity Finder\n\nEvaluate expired domain candidates for a specific niche. Score them on topical\nfit, historical activity level, history cleanliness, and redirect suitability. Output a\nconservative, explainable shortlist for human review.\n\n---\n\n**Critical rule:** Every recommendation must include BOTH a positive rationale\n(`why_selected`) AND a caution rationale (`why_risky`). Never output a bare\nscore without explanation.\n\n**Conservative-by-default rule:** When signals are incomplete or contradictory,\nlower the confidence level. Do not surface ambiguous candidates as strong\nopportunities. Missing data reduces confidence, never inflates it.\n\n**Anti-abuse rule:** Never encourage unrelated redirects, PBN construction, or\ndomain repurposing where the historical topic does not match the target niche.\nRead `references/guardrails.md` for the full anti-abuse policy.\n\n---\n\n## Step 1: Setup Check\n\nCheck the environment before doing anything else.\n\nVerify that `curl` and `python3` (or `python`) are available:\n```bash\ncurl --version > /dev/null 2>&1 && echo \"curl: available\" || echo \"curl: MISSING\"\npython3 --version 2>/dev/null || python --version 2>/dev/null || echo \"python: MISSING\"\n```\n\nCheck for an optional LLM API key for enhanced niche-relevance scoring:\n```bash\necho \"LLM_API_KEY: ${LLM_API_KEY:+set}\"\n```\n\n**If `curl` or `python` is missing:**\nStop. Tell the user: \"This skill requires curl and Python 3.10+. Please install them and try again.\"\n\n**If `LLM_API_KEY` is not set:**\nContinue. The skill will use rule-based scoring only (domain string matching,\nWayback title analysis, keyword overlap). Note to the user: \"Running in\nrule-based-only mode. Set LLM_API_KEY for enhanced niche-relevance scoring.\"\n\n**If `LLM_API_KEY` is set:**\nThe skill will use LLM-enhanced scoring for topical relevance analysis.\nThis provides deeper contextual assessment of niche fit.\n\nQA: State the scoring mode (llm-enhanced or rule-based-only) and confirm tools are available.\n\n---\n\n## Step 2: Input Collection\n\nCollect the required and optional inputs from the user.\n\n**Required:**\n- `target_niche` (string): The core niche to evaluate against. Examples: \"developer tools\", \"AI SaaS\", \"cybersecurity\", \"fintech\".\n\n**Optional (ask only if not provided):**\n- `seed_keywords` (array): Keywords to refine topical matching. If not provided, extract 3–5 keywords from the niche name automatically.\n- `candidate_domains` (array): Specific domains to evaluate. If not provided, prompt the user.\n- `discovery_source` (string): Where candidates came from — `manual`, `expireddomains-net`, `external-feed`.\n- `min_snapshots` (integer): Minimum historical snapshot threshold. Default: 10.\n- `max_risk_level` (string): `low`, `medium`, or `high`. Controls how aggressively risky candidates are filtered. Default: `medium`.\n- `intended_use` (string): `rebuild`, `redirect`, or `either`. Default: `either`.\n\n**If no `candidate_domains` are provided:**\nAsk: \"Please provide a list of expired domain candidates to evaluate. You can:\n1. Paste domain names (one per line or comma-separated)\n2. Provide a file path to a text file with one domain per line\n3. Say 'example' to run with a built-in demo set for the 'developer tools' niche\"\n\n**If the user says 'example':**\nUse this demo set:\n```\ndevtoolsweekly.com\ncodeshipnews.io\nstackforgeapp.com\nquickseorank.net\nbestcheaphosting247.com\ncloudbuildpro.dev\nreactwidgetlib.com\nmegadealsshop.xyz\n```\n\nAfter collecting all inputs, confirm:\n\"Target niche: [niche]. Evaluating [N] candidate domains. Scoring mode: [mode]. Intended use: [use].\"\n\n---\n\n## Step 3: Candidate Normalization\n\nClean and validate the candidate list before scoring.\n\n```bash\npython3 -c \"\nimport sys, re\n\ndomains = '''CANDIDATE_LIST_HERE'''.strip().split('\\n')\nseen = set()\nvalid = []\ninvalid = []\n\nfor d in domains:\n    d = d.strip().lower()\n    # Strip protocols and paths\n    d = re.sub(r'^https?://', '', d)\n    d = d.split('/')[0]\n    d = d.strip('.')\n\n    if not d:\n        continue\n\n    # Basic TLD validation\n    if '.' not in d or len(d) < 4:\n        invalid.append(d)\n        continue\n\n    # Deduplicate\n    if d in seen:\n        continue\n    seen.add(d)\n    valid.append(d)\n\nprint(f'Valid candidates: {len(valid)}')\nprint(f'Removed (invalid/duplicate): {len(invalid)}')\nfor v in valid:\n    print(f'  ✓ {v}')\nfor i in invalid:\n    print(f'  ✗ {i} (invalid format)')\n\"\n```\n\nReplace `CANDIDATE_LIST_HERE` with the actual domain list from Step 2.\n\nState: \"[N] valid candidates after normalization. [M] removed (invalid/duplicate).\"\n\nIf 0 valid candidates remain, stop and tell the user: \"No valid domain candidates found. Please provide domain names in the format 'example.com'.\"\n\n---\n\n## Step 4: Signal Collection\n\nFor each valid candidate, collect signals from free public sources.\nRun these checks sequentially per domain.\n\n### 4a: Wayback CDX API — History Snapshots\n\nQuery the Wayback Machine for all historical snapshots. We use `limit=100000`\nand explicit `from`/`to` parameters are intentionally omitted so that CDX\nreturns snapshots from the full lifetime of the domain. The results are sorted\nascending by timestamp (oldest first) so `first_capture` and `last_capture`\nare accurate:\n\n```bash\ncurl -s \"https://web.archive.org/cdx/search/cdx?url=DOMAIN_HERE&output=json&fl=timestamp,statuscode&collapse=timestamp:6&limit=100000\" \\\n  | python3 -c \"\nimport sys, json\n\ntry:\n    data = json.load(sys.stdin)\n    if len(data) <= 1:\n        print(json.dumps({'domain': 'DOMAIN_HERE', 'snapshots': 0, 'first_capture': None, 'last_capture': None, 'status_codes': {}, 'years_active': 0}))\n    else:\n        rows = data[1:]  # skip header row\n        timestamps = [r[0] for r in rows]  # already ascending (oldest first)\n        statuses = [r[1] for r in rows]\n        status_counts = {}\n        for s in statuses:\n            status_counts[s] = status_counts.get(s, 0) + 1\n        first_year = int(timestamps[0][:4])\n        last_year = int(timestamps[-1][:4])\n        print(json.dumps({\n            'domain': 'DOMAIN_HERE',\n            'snapshots': len(rows),\n            'first_capture': timestamps[0],\n            'last_capture': timestamps[-1],\n            'status_codes': status_counts,\n            'years_active': last_year - first_year + 1\n        }))\nexcept:\n    print(json.dumps({'domain': 'DOMAIN_HERE', 'snapshots': 0, 'error': 'wayback_api_failed'}))\n\"\n```\n\n**Rate limiting:** Wait 2 seconds between Wayback API calls to be polite to the service.\n\n### 4b: Wayback Content Sampling — Historical Page Titles\n\nFor candidates with > 0 snapshots, fetch the most recent snapshot to extract\nthe page title (used for topical relevance scoring):\n\n```bash\ncurl -s -L \"https://web.archive.org/web/LATEST_TIMESTAMP/http://DOMAIN_HERE\" \\\n  | python3 -c \"\nimport sys, re\nhtml = sys.stdin.read()[:50000]\ntitle_match = re.search(r'<title[^>]*>(.*?)</title>', html, re.IGNORECASE | re.DOTALL)\ntitle = title_match.group(1).strip() if title_match else 'no title found'\n# Extract meta description too\nmeta_match = re.search(r'<meta[^>]*name=[\\\"']description[\\\"'][^>]*content=[\\\"'](.*?)[\\\"']', html, re.IGNORECASE)\ndesc = meta_match.group(1).strip() if meta_match else 'no description found'\nprint(f'Title: {title}')\nprint(f'Description: {desc}')\n\"\n```\n\nReplace `LATEST_TIMESTAMP` with the most recent timestamp from Step 4a.\n\n### 4c: RDAP Lookup — Registration Status\n\nUse the cross-platform HTTP-based RDAP standard (replaces OS-dependent WHOIS).\nAn HTTP 404 from RDAP means the domain is not registered (i.e. it is genuinely\navailable or untracked) — that is distinct from a network failure. Handle both\ncases explicitly:\n\n```bash\npython3 -c \"\nimport urllib.request, urllib.error, json\n\ndomain = 'DOMAIN_HERE'\ntry:\n    req = urllib.request.Request(\n        f'https://rdap.org/domain/{domain}',\n        headers={'User-Agent': 'Mozilla/5.0'}\n    )\n    with urllib.request.urlopen(req, timeout=10) as response:\n        data = json.loads(response.read().decode())\n\n    registrar = 'unknown'\n    created = 'unknown'\n\n    for entity in data.get('entities', []):\n        if 'registrar' in entity.get('roles', []):\n            try:\n                registrar = entity.get('vcardArray', [[]])[1][0][3]\n            except Exception:\n                pass\n\n    for event in data.get('events', []):\n        if event.get('eventAction') == 'registration':\n            created = event.get('eventDate', 'unknown')\n\n    print(json.dumps({\n        'domain': domain,\n        'status': 'registered',\n        'registrar': registrar,\n        'created': created\n    }))\nexcept urllib.error.HTTPError as e:\n    if e.code == 404:\n        # Domain has no RDAP object — likely unregistered or not in RDAP coverage\n        print(json.dumps({'domain': domain, 'status': 'unregistered_or_no_rdap_object'}))\n    else:\n        print(json.dumps({'domain': domain, 'error': f'rdap_http_error_{e.code}'}))\nexcept Exception:\n    print(json.dumps({'domain': domain, 'error': 'rdap_lookup_failed'}))\n\"\n```\n\n### 4d: Domain String Analysis — Keyword Matching\n\nScore keyword overlap between the domain name and the target niche / seed keywords:\n\n```bash\npython3 -c \"\nimport re, json\n\ndomain = 'DOMAIN_HERE'\nniche = 'NICHE_HERE'\nseeds = SEEDS_JSON_HERE  # e.g., ['devops', 'ci/cd', 'code editor']\n\n# Extract words from domain\ndomain_base = domain.rsplit('.', 1)[0]  # remove TLD\ndomain_words = re.split(r'[-_.]', domain_base.lower())\n\n# Check niche words\nniche_words = niche.lower().split()\nall_keywords = set(niche_words + [s.lower() for s in seeds])\n\nmatches = [w for w in domain_words if any(kw in w or w in kw for kw in all_keywords)]\nmatch_ratio = len(matches) / max(len(domain_words), 1)\n\nprint(json.dumps({\n    'domain': domain,\n    'domain_words': domain_words,\n    'keyword_matches': matches,\n    'match_ratio': round(match_ratio, 2)\n}))\n\"\n```\n\n### 4e: Gemini LLM Niche-Relevance Assessment (if LLM_API_KEY is set)\n\nIf the LLM API key is configured, batch all candidates with their collected\nsignals and ask for a contextual niche-relevance assessment.\n\n**Note:** The request/response format below uses the **Gemini API** (`generateContent`\nformat). It is not compatible with OpenAI-style endpoints without modification.\nIf you use a different provider, you must adapt the JSON body and response parsing.\n\n```bash\ncat > /tmp/domain-relevance-request.json << 'ENDJSON'\n{\n  \"system_instruction\": {\n    \"parts\": [{\n      \"text\": \"You are an SEO research analyst. For each expired domain candidate provided, assess its topical relevance to the specified target niche. Consider the domain name, historical page title, and meta description. For each domain, output a JSON object with: domain (string), relevance_score (integer 1-10), relevance_rationale (one sentence explaining the score), redirect_plausibility (integer 1-10), redirect_rationale (one sentence). Output only a JSON array. No commentary before or after.\"\n    }]\n  },\n  \"contents\": [{\n    \"parts\": [{\n      \"text\": \"DOMAIN_SIGNALS_AND_NICHE_CONTEXT_HERE\"\n    }]\n  }],\n  \"generationConfig\": {\n    \"temperature\": 0.2,\n    \"maxOutputTokens\": 2048\n  }\n}\nENDJSON\n```\n\nReplace `DOMAIN_SIGNALS_AND_NICHE_CONTEXT_HERE` with:\n- The target niche and seed keywords\n- For each candidate: domain name, historical title, description, keyword match data\n\nSend the request to the Gemini API:\n\n```bash\ncurl -s -X POST \\\n  \"${LLM_API_ENDPOINT:-https://generativelanguage.googleapis.com/v1beta}/models/${LLM_MODEL:-gemini-2.0-flash}:generateContent?key=$LLM_API_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d @/tmp/domain-relevance-request.json \\\n  | python3 -c \"\nimport sys, json\ntry:\n    d = json.load(sys.stdin)\n    text = d['candidates'][0]['content']['parts'][0]['text']\n    print(text)\nexcept (KeyError, IndexError, json.JSONDecodeError) as e:\n    print(json.dumps({'error': 'llm_response_parse_failed', 'detail': str(e)}))\n\"\n```\n\nIf the LLM call or response parsing fails, log the error and continue with\nrule-based scoring only. Do not stop the workflow.\n\nAfter all signal collection, state:\n\"Signal collection complete for [N] candidates. [M] Wayback hits, [K] RDAP lookups succeeded.\"\n\n---\n\n## Step 5: Scoring & Classification\n\nRead `references/scoring-model.md` for the full scoring framework.\n\nFor each candidate, compute scores across the 6 dimensions:\n\n1. **Topical Relevance (0–30):** Combine domain keyword match ratio, historical\n   title/description analysis, and LLM relevance score (if available). Without\n   LLM: use keyword match ratio × 15 + title keyword overlap × 15. With LLM:\n   use LLM relevance_score × 3.\n\n2. **Historical Activity Level (0–25):** Based on Wayback snapshot diversity and\n   frequency. More snapshots consistently captured across multiple years indicates\n   higher sustained activity and inferred legitimacy.\n\n3. **Historical Content Quality (0–15):** Derived from historical page title and\n   meta description analysis, checking for natural phrasing versus keyword\n   stuffing. Without LLM: base score of 8/15 adjusted by exact-match density.\n\n4. **History Cleanliness (0–15):** Based on Wayback snapshot count, years active,\n   status code consistency, and absence of parking page indicators.\n\n5. **Redirect Suitability (0–10):** Based on topic continuity between historical\n   content and target niche. Use LLM redirect_plausibility score if available;\n   otherwise use keyword overlap ratio.\n\n6. **Signal Completeness (0–5):** Count how many data sources returned usable\n   data (Wayback, RDAP, domain analysis, LLM if configured).\n\n**Compute:**\n- `opportunity_score` = sum of all dimension scores (0–100)\n- `confidence` = based on how many dimensions have strong data (see scoring-model.md)\n- `recommended_action` = based on score + confidence + risk flags (see Step 6)\n\n---\n\n## Step 6: Risk Flagging & Filtering\n\nRead `references/risk-flags.md` for the complete flag definitions.\n\nApply risk flags to each candidate:\n\n| Check | Flag Applied |\n|---|---|\n| Historical topic overlap < 30% with target niche | `topic_mismatch` |\n| Domain active < 1 year before expiry | `short_history` |\n| < 3 Wayback snapshots or all parking pages | `unclear_history` |\n| Sudden Wayback drop-off after years of activity | `possible_deindex` |\n| Snapshot count below `min_snapshots` | `weak_historical_activity` |\n| Redirect suitability < 4/10 | `redirect_mismatch` |\n\n**Apply recommendation logic:**\n\n| Score + Flags | Recommendation |\n|---|---|\n| Score ≥ 75 AND confidence `high` AND no High-severity flags | `high-priority-review` |\n| Score ≥ 55 AND confidence ≥ `medium` | `review` |\n| Score ≥ 55 BUT redirect_suitability < 4/10 | `rebuild-only-review` |\n| Score < 55 OR any critical High-severity flag | `reject` |\n\n**Apply `max_risk_level` filter:**\n- If `max_risk_level` = `low`: exclude any candidate with Medium or High flags\n- If `max_risk_level` = `medium`: exclude candidates with High flags only\n- If `max_risk_level` = `high`: include all candidates (no filter)\n\n---\n\n## Step 7: Output & Save\n\nRead `references/output-format.md` for the exact JSON schema.\nRead `references/guardrails.md` for the required disclaimer text.\n\n**Default: Shortlist mode.** Show only candidates with `recommended_action`\nof `high-priority-review`, `review`, or `rebuild-only-review`.\n\nIf the user requested audit mode, show ALL candidates with full dimension\nbreakdowns including rejection reasons.\n\n### Present the output:\n\n```\n## Expired Domain Opportunity Finder — [YYYY-MM-DD]\n\n**Target niche:** [niche]\n**Seed keywords:** [keywords]\n**Intended use:** [rebuild/redirect/either]\n**Candidates evaluated:** [N]\n**Shortlisted:** [M]\n**Rejected:** [K]\n**Scoring mode:** [llm-enhanced / rule-based-only]\n\n---\n\n### 1. [domain.com] — Score: [N]/100 | Confidence: [level] | Action: [recommendation]\n\n**Topical fit:** [summary]\n**Activity level:** [summary]\n**Content quality:** [summary]\n**History:** [summary]\n**Redirect suitability:** [level]\n**Risk flags:** [flags or \"none\"]\n\n**Why selected:** [rationale]\n**Why risky:** [rationale]\n\n---\n\n[repeat for each shortlisted domain, ranked by opportunity_score descending]\n\n---\n\n**Disclaimer:** These results are research recommendations, not guarantees\nof SEO value. Redirect analysis should only be considered when strong\ntopic continuity exists between the expired domain and your target site.\nSearch engine algorithms change frequently. Always perform manual due\ndiligence — including checking current index status, reviewing the full\nbacklink profile with a commercial tool, and verifying domain history —\nbefore making any acquisition decision. This skill does not endorse or\nfacilitate manipulative SEO practices.\n```\n\n**Save the structured JSON output:**\n```bash\nmkdir -p docs/expired-domain-intel\nOUTFILE=\"docs/expired-domain-intel/$(date +%Y-%m-%d).json\"\ncat > \"$OUTFILE\" << 'EOF'\nJSON_OUTPUT_HERE\nEOF\necho \"Saved to $OUTFILE\"\n```\n\n**If 0 candidates pass the shortlist:**\n\"No candidates met the shortlist criteria for the '[niche]' niche with the\ncurrent risk tolerance. This is a normal outcome — it means the evaluated\ndomains were not strong enough matches. Try:\n1. Providing different candidate domains\n2. Widening seed keywords\n3. Setting max_risk_level to 'high' to see borderline candidates\n4. Running in audit mode to see why candidates were rejected\"\n\n---\n\n## Self-QA Checklist\n\nRun every check before presenting output:\n\n- [ ] Every shortlisted domain has both `why_selected` AND `why_risky`\n- [ ] No shortlisted domain has a High-severity risk flag AND `high-priority-review` action\n- [ ] Domains with `redirect_mismatch` are labeled `rebuild-only-review` (not `review`)\n- [ ] The guardrails disclaimer is present at the end of output\n- [ ] No hype language: no \"guaranteed\", \"easy win\", \"safe to redirect\", \"SEO hack\"\n- [ ] `scoring_mode` correctly reflects whether LLM was used\n- [ ] Candidates are ranked by `opportunity_score` descending\n- [ ] JSON output saved to `docs/expired-domain-intel/YYYY-MM-DD.json`\n- [ ] All Wayback API calls were rate-limited (2s between calls)\n\nFix any violation before presenting.\n\n---\n\n## What Good Output Looks Like\n\n- Every domain has a score, confidence, action, and risk assessment\n- Summaries are 1–2 sentences each, specific to the candidate (not generic)\n- Risk flags are present and explained in `why_risky`\n- The shortlist is small (quality over quantity) — typically 2–5 domains from a batch of 10–20\n- Conservative: when in doubt, reject or lower confidence\n- The user can understand exactly why each domain was selected or rejected\n\n## What Bad Output Looks Like\n\n- Bare scores without explanation\n- Generic summaries like \"this domain has good metrics\" (must be specific)\n- High-priority recommendations for domains with serious risk flags\n- Redirect recommendations for topic-mismatched domains\n- No disclaimer at the end\n- Hype language promising SEO outcomes\n- Too many shortlisted domains (the skill should be selective, not permissive)","tags":["domain","expired","opportunity","finder","opendirectory","varnan-tech","agent-skills","gtm","hermes-agent","marketing-skills","openclaw-skills","skill-pack"],"capabilities":["skill","source-varnan-tech","skill-domain-expired-opportunity-finder","topic-agent-skills","topic-gtm","topic-hermes-agent","topic-marketing-skills","topic-openclaw-skills","topic-skill-pack","topic-skills","topic-technical-seo"],"categories":["opendirectory"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/Varnan-Tech/opendirectory/domain-expired-opportunity-finder","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add Varnan-Tech/opendirectory","source_repo":"https://github.com/Varnan-Tech/opendirectory","install_from":"skills.sh"}},"qualityScore":"0.593","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 286 github stars · SKILL.md body (18,901 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:54:40.610Z","embedding":null,"createdAt":"2026-05-10T18:54:45.474Z","updatedAt":"2026-05-18T18:54:40.610Z","lastSeenAt":"2026-05-18T18:54:40.610Z","tsv":"'-1':858,875 '-10':1445,1457 '-2.0':1534 '/100':2094 '/cdx/search/cdx?url=domain_here&output=json&fl=timestamp,statuscode&collapse=timestamp:6&limit=100000':778 '/dev/null':179,191,195 '/domain/':1084 '/models':1530 '/tmp/domain-relevance-request.json':1394,1547 '/v1beta':1529 '/web/latest_timestamp/http://domain_here':947 '0':595,676,798,809,819,846,852,871,894,924,1121,1247,1560,1563,1648,1686,1713,1746,1767,1794,1819,2235 '0.2':1483 '1':157,181,471,791,813,830,847,886,966,991,1120,1246,1301,1444,1456,1645,1875,2090,2271,2425 '10':425,1095,1768,2459 '100':1820 '100000':735 '15':1670,1674,1714,1747 '2':180,190,194,335,482,665,902,1318,1682,2276,2426,2452 '20':2460 '2048':1485 '25':1687 '2s':2400 '3':382,496,549,1122,1681,1709,1881,2280 '3.10':237 '30':1649,1867 '4':612,699,853,859,1743,2291 '4/10':1911,1946 '404':1041,1155 '4a':718,1018 '4b':914 '4c':1019 '4d':1199 '4e':1319 '5':383,1626,1764,1795,2453 '50000':955 '55':1936,1942,1952 '6':1643,1791,1842,1844 '7':2001 '75':1921 '8/15':1736 'absenc':1759 'abus':126,154 'accur':772 'acquisit':2195 'across':1641,1699 'action':1833,2026,2097,2337,2419 'activ':20,54,808,881,1684,1705,1754,1874,1898,1908,2102 'actual':660 'adapt':1385 'adjust':1737 'agent':1089 'aggress':436 'ai':360 'algorithm':2166 'alreadi':824 'alway':2169 'ambigu':112 'analysi':266,307,1202,1657,1723,1807,2146 'analyst':1405 'anti':125,153 'anti-abus':124,152 'anyth':165 'api':204,215,218,246,282,292,721,897,906,1328,1335,1363,1518,1525,1539,2394 'appli':1855,1863,1914,1961 'application/json':1545 'array':372,392,1466 'ascend':760,825 'ask':365,458,1347 'assess':312,1325,1354,1412,2422 'audit':2042,2294 'automat':389 'avail':175,184,333,1054,1663,1785 'backlink':2182 'bad':2482 'bare':90,2486 'base':258,277,327,1031,1244,1599,1688,1733,1748,1769,1822,1834,2088 'bash':176,212,560,773,941,1068,1218,1392,1519,2212 'basic':602 'batch':1339,2457 'bestcheaphosting247.com':526 'bodi':1388 'borderlin':2289 'breakdown':2050 'built':504 'built-in':503 'c':562,780,949,1070,1220,1549 'call':907,1586,2395,2402 'came':408 'candid':9,43,113,390,407,438,454,466,540,550,556,567,629,655,669,678,688,705,922,1341,1410,1503,1559,1617,1638,1860,1973,1985,1997,2023,2046,2074,2236,2241,2274,2290,2299,2380,2432 'captur':767,770,800,803,869,873,1698 'case':1066 'cat':1393,2223 'caution':83 'cdx':720,746 'chang':2167 'check':159,160,199,714,1255,1724,1861,2175,2308 'checklist':2305 'ci/cd':1236 'classif':1628 'clean':552 'cleanli':24,57,1745 'cloudbuildpro.dev':527 'code':806,877,1237,1756 'codeshipnews.io':523 'collect':337,338,531,701,706,1344,1610,1613 'combin':1650 'comma':480 'comma-separ':479 'commentari':1468 'commerci':2186 'compat':1369 'complet':1614,1793,1852 'comput':1639,1811 'confid':107,120,1821,1837,1923,1938,2095,2418,2468 'configur':1338,1810 'confirm':330,534 'conserv':63,95,2461 'conservative-by-default':94 'consid':1421,2150 'consist':1697,1757 'construct':133 'content':916,986,1472,1543,1561,1711,1775,2105 'content-typ':1542 'context':1479,1492 'contextu':311,1350 'continu':251,601,615,621,1595,1772,2154 'contradictori':104 'control':434 'core':352 'correct':2374 'count':836,842,879,1752,1796,1902 'coverag':1167 'creat':1104,1135,1147,1148 'criteria':2245 'critic':69,1955 'cross':1027 'cross-platform':1026 'curl':169,177,183,186,222,234,774,942,1520 'current':2176,2252 'cybersecur':362 'd':578,581,588,592,593,596,600,608,611,614,618,623,625,1546,1554,1558,2221 'd.split':594 'd.strip':582,597 'data':118,785,790,812,1098,1511,1799,1803,1829 'data.get':1109,1129 'date':2218 'dd':2064 'decis':2196 'decod':1101 'dedupl':616 'deeper':310 'default':97,424,441,450,2018 'definit':1854 'deindex':1900 'demo':506,520 'densiti':1742 'depend':1037 'deriv':1715 'desc':989,1007 'descend':2133,2386 'descript':977,985,998,1006,1430,1508,1722 'detail':1580 'develop':358,510 'devop':1235 'devtoolsweekly.com':522 'differ':1381,2273 'dilig':2173 'dimens':1644,1817,1826,2049 'disclaim':2016,2134,2352,2519 'discoveri':403 'distinct':1059 'divers':1692 'docs/expired-domain-intel':2215,2217 'docs/expired-domain-intel/yyyy-mm-dd.json':2391 'domain':2,8,37,42,135,261,391,394,455,465,473,493,541,566,580,661,687,692,717,755,794,795,862,863,890,891,1046,1075,1076,1085,1141,1142,1156,1170,1171,1181,1182,1193,1194,1200,1210,1224,1225,1242,1243,1250,1277,1299,1304,1305,1306,1308,1409,1423,1433,1439,1475,1488,1504,1651,1806,1873,2058,2128,2159,2190,2264,2275,2314,2324,2338,2414,2454,2476,2494,2506,2517,2531 'domain-expired-opportunity-find':1 'domain.com':2091 'domain.rsplit':1245 'domain_base.lower':1254 'doubt':2464 'drop':1893 'drop-off':1892 'due':2172 'e':1152,1572,1582 'e.code':1154,1188 'e.g':1234 'easi':2365 'echo':182,185,196,213,2230 'editor':1238 'either':449,451 'els':166,810,971,996,1178 'encourag':129 'end':2357,2522 'endjson':1395,1486 'endors':2201 'endpoint':1374,1526 'engin':2165 'enhanc':207,285,302,323,2085 'enough':2268 'entiti':1107,1110 'entity.get':1114,1118 'environ':162 'eof':2225,2229 'error':895,1183,1187,1195,1575,1593 'evalu':6,40,355,396,468,538,2075,2263 'event':1127,1130 'event.get':1132,1136 'eventact':1133 'eventd':1137 'everi':71,2307,2312,2413 'exact':1740,2008,2473 'exact-match':1739 'exampl':357,498,517 'example.com':697 'except':887,1123,1124,1149,1189,1190,1567 'exclud':1971,1984 'exist':2155 'expir':3,7,36,41,464,1408,2057,2158 'expireddomain':412 'expireddomains-net':411 'expiri':1878 'explain':31,64,1450,2440 'explan':93,2489 'explicit':737,1067 'extern':415 'external-fe':414 'extract':381,932,975,1239 'f':627,633,643,650,1001,1005,1081,1184 'facilit':2203 'fail':898,1198,1579,1590 'failur':1063 'feed':416 'fetch':926 'file':485,490 'filter':440,1847,1965,1999 'finder':5,39,2060 'fintech':363 'first':764,766,799,827,848,868,884 'fit':52,315,2100 'fix':2403 'flag':35,1839,1846,1853,1857,1862,1918,1930,1959,1978,1988,2114,2115,2331,2436,2510 'flash':1535 'format':653,696,1358,1365 'found':689,974,999 'framework':1635 'free':709 'frequenc':1694 'frequent':2168 'full':151,751,1633,2048,2181 'gemini':1320,1362,1517,1533 'generatecont':1364,1536 'generationconfig':1481 'generativelanguage.googleapis.com':1528 'generativelanguage.googleapis.com/v1beta':1527 'generic':2434,2490 'genuin':1053 'good':2409,2496 'guarante':2141,2364 'guardrail':2351 'h':1541 'hack':2371 'handl':1064 'header':815,1086 'high':433,1924,1928,1932,1957,1977,1987,1994,2029,2286,2328,2334,2502 'high-prior':2501 'high-priority-review':1931,2028,2333 'high-sever':1927,1956,2327 'higher':1703 'histor':19,53,139,421,730,918,1425,1506,1655,1683,1710,1717,1774,1864,1907 'histori':23,56,722,1744,1880,1889,2108,2191 'hit':1620 'html':953,961,987 'http':1030,1040,1186 'http-base':1029 'https':591 'human':67 'hype':2361,2523 'i.e':1050 'import':563,781,950,1071,1221,1550 'includ':74,1995,2051,2174 'incomplet':102 'index':2177 'indexerror':1569 'indic':1702,1763 'infer':1707 'inflat':122 'input':336,343,533 'instal':239 'instruct':1397 'int':850,856 'integ':419,1443,1455 'intend':443,545,2071 'intent':742 'invalid':576,637,648,652 'invalid.append':613 'invalid/duplicate':635,674 'json':783,1074,1223,1232,1387,1436,1465,1552,2009,2210,2222,2226,2387 'json.dumps':793,861,889,1140,1169,1180,1192,1303,1574 'json.jsondecodeerror':1570 'json.load':786,1555 'json.loads':1099 'k':1621,2080 'key':205,216,219,247,283,293,1329,1336,1537,1540 'keyerror':1568 'keyword':267,371,373,384,1203,1206,1217,1263,1292,1310,1500,1509,1652,1667,1672,1729,1788,2069,2070,2279 'kw':1281,1287,1289 'l':944 'label':2343 'languag':2362,2524 'last':769,802,854,872,882 'latest':1009 'legitimaci':1708 'len':610,630,636,789,866,1295,1298 'level':21,55,108,428,1685,1964,1969,1982,1993,2096,2103,2112,2284 'lifetim':752 'like':1161,2412,2485,2492 'limit':734,900,2399 'line':477,495 'list':462,557,568,656,662 'llm':203,214,217,245,281,291,301,322,1321,1327,1334,1524,1531,1538,1576,1585,1659,1665,1676,1678,1732,1780,1808,2084,2377 'llm-enhanc':300,321,2083 'log':1591 'logic':1916 'look':2411,2484 'lookup':1021,1197,1623 'low':430,1970 'lower':105,583,2467 'm':672,1618,2078,2220 'machin':727 'make':2193 'mani':1798,1825,2529 'manipul':2204 'manual':410,2171 'match':143,263,377,957,970,980,995,1204,1272,1293,1296,1311,1312,1313,1316,1510,1653,1668,1741,2269 'max':426,1297,1962,1967,1980,1991,2282 'maxoutputtoken':1484 'mean':1044,2261 'medium':431,442,1939,1975,1983 'megadealsshop.xyz':529 'met':2242 'meta':976,979,983,994,1429,1721 'meta_match.group':990 'metric':2497 'min':417,1904 'minimum':420 'mismatch':1872,1913,2341,2516 'miss':117,187,198,226 'mkdir':2213 'mm':2063 'mode':279,320,543,544,2020,2043,2082,2295,2373 'model':1532 'modif':1376 'mozilla/5.0':1090 'multipl':1700 'must':73,1384,2498 'n':539,572,667,1616,2076,2093 'name':388,474,693,984,1211,1424,1505 'natur':1726 'net':413 'network':1062 'never':87,121,128 'nich':13,47,146,209,287,314,349,353,387,512,536,537,1215,1227,1228,1256,1258,1265,1323,1352,1420,1478,1491,1497,1778,1870,2066,2067,2248,2249 'niche-relev':208,286,1322,1351 'niche.lower':1260 'none':801,804,2117 'normal':551,671,2258 'note':269,1355 'object':1160,1177,1437 'oldest':763,826 'omit':743 'one':475,492,1448,1460 'openai':1372 'openai-styl':1371 'opportun':4,38,116,1812,2059,2131,2384 'option':202,342,364 'os':1036 'os-depend':1035 'otherwis':1786 'outcom':2259,2527 'outfil':2216,2224,2233 'output':26,61,88,1434,1462,2002,2056,2211,2227,2311,2359,2388,2410,2483 'overlap':268,1207,1673,1789,1866 'p':2214 'page':919,934,1426,1718,1762,1887 'paramet':740 'park':1761,1886 'pars':1391,1578,1589 'part':1398,1473,1562 'pass':1125,2237 'past':472 'path':486,587 'pbn':132 'per':476,494,716 'perform':2170 'permiss':2538 'phrase':1727 'platform':1028 'plausibl':1454,1782 'pleas':238,459,690 'polici':155 'polit':910 'posit':77 'possibl':1899 'post':1523 'practic':2206 'present':2054,2310,2354,2407,2438 'print':626,632,642,649,792,860,888,1000,1004,1139,1168,1179,1191,1302,1565,1573 'prioriti':1933,2030,2335,2503 'profil':2183 'promis':2525 'prompt':400 'protocol':585 'provid':309,369,380,399,457,460,483,691,1382,1411,2272 'public':710 'python':173,192,197,224,236 'python3':171,188,561,779,948,1069,1219,1548 'qa':316,2304 'qualiti':1712,2106,2448 'quantiti':2450 'queri':724 'quickseorank.net':525 'r':590,818,821,829,832,959,982,1253 'rank':28,2129,2382 'rate':899,2398 'rate-limit':2397 'ratio':1294,1314,1317,1654,1669,1790 'rational':78,84,1447,1459,2120,2123 'rdap':1020,1032,1043,1159,1166,1176,1185,1196,1622,1805 'rdap.org':1083 'rdap.org/domain/':1082 're':565,952,1222 're.dotall':963 're.ignorecase':962,988 're.search':958,981 're.split':1252 're.sub':589 'reactwidgetlib.com':528 'read':147,1629,1848,2004,2011 'reason':32,2053 'rebuild':446,1948,2035,2345 'rebuild-only-review':1947,2034,2344 'rebuild/redirect/either':2073 'recent':929,1014 'recommend':72,1832,1915,1919,2025,2098,2139,2504,2512 'redirect':59,131,447,1453,1458,1765,1781,1909,1912,1944,2110,2145,2340,2369,2511 'reduc':119 'references/guardrails.md':148,2012 'references/output-format.md':2005 'references/risk-flags.md':1849 'references/scoring-model.md':1630 'refin':375 'reflect':2375 'regist':1049,1144 'registr':1022,1134 'registrar':1102,1112,1117,1145,1146 'reject':1960,2052,2079,2301,2465,2480 'relev':18,210,288,306,939,1324,1353,1415,1441,1446,1647,1660,1679 'remain':679 'remov':634,673,1248 'repeat':2124 'replac':654,1008,1034,1487 'repurpos':136 'req':1079,1093 'request':1514,2041 'request/response':1357 'requir':233,340,347,2015 'research':1404,2138 'respons':1097,1390,1577,1588 'response.read':1100 'result':757,2136 'return':747,1801 'review':68,1934,1940,1950,2031,2032,2037,2179,2336,2347,2349 'risk':34,427,1838,1845,1856,1963,1968,1981,1992,2113,2253,2283,2330,2421,2435,2509 'riski':86,437,2122,2321,2443 'role':1115 'round':1315 'row':811,816,823,834,867 'rule':70,98,127,257,276,326,1598,2087 'rule-bas':256,1597 'rule-based-on':275,325,2086 'run':273,500,712,2292,2306 's.lower':1267 'saa':361 'safe':2367 'sampl':917 'save':2003,2207,2231,2389 'say':497,516 'schema':2010 'score':14,48,91,211,259,289,303,319,542,559,940,1205,1442,1452,1600,1627,1634,1640,1661,1680,1734,1783,1813,1818,1836,1917,1920,1935,1941,1951,2081,2092,2132,2372,2385,2417,2487 'scoring-model.md':1831 'search':2164 'second':903 'see':1830,1840,2288,2297 'seed':370,1216,1230,1231,1271,1499,2068,2278 'seen':573,620 'seen.add':622 'select':80,2119,2318,2478,2536 'self':2303 'self-qa':2302 'send':1512 'sentenc':1449,1461,2427 'seo':1403,2143,2205,2370,2526 'separ':481 'sequenti':715 'serious':2508 'servic':913 'set':220,250,280,295,507,521,574,1264,1331,2281 'setup':158 'sever':1929,1958,2329 'short':1879 'shortlist':29,65,2019,2077,2127,2239,2244,2313,2323,2445,2530 'show':2021,2044 'signal':100,700,707,1345,1476,1489,1609,1612,1792 'site':2163 'skill':232,253,297,2198,2533 'skill-domain-expired-opportunity-finder' 'skip':814 'small':2447 'snapshot':418,422,723,731,748,797,865,893,925,930,1691,1696,1751,1883,1901,1905 'sort':759 'sourc':404,711,1800 'source-varnan-tech' 'specif':46,393,2429,2500 'specifi':1418 'split':571,1261 'stackforgeapp.com':524 'standard':1033 'state':317,666,1611 'status':805,828,835,840,841,876,878,1023,1143,1172,1755,2178 'status_counts.get':844 'step':156,334,548,664,698,1017,1625,1841,1843,2000 'stop':227,680,1604 'str':1581 'string':262,350,405,429,445,1201,1440 'strip':570,584,967,992 'strong':115,1828,2152,2267 'structur':2209 'stuf':1730 'style':1373 'succeed':1624 'sudden':1890 'suitabl':60,1766,1910,1945,2111 'sum':1814 'summari':2101,2104,2107,2109,2423,2491 'surfac':111 'sustain':1704 'sys':564,782,951,1551 'sys.stdin':787,1556 'sys.stdin.read':954 'system':1396 'target':12,145,348,535,1214,1419,1496,1777,1869,2065,2162 'tell':228,682 'temperatur':1482 'text':489,1399,1474,1557,1564,1566,2017 'threshold':423 'timeout':1094 'timestamp':762,817,851,857,870,874,1010,1015 'titl':265,920,935,956,960,964,969,973,1002,1003,1427,1507,1671,1719 'title/description':1656 'title_match.group':965 'tld':603,1249 'toler':2254 'tool':331,359,511,2187 'topic':17,51,140,305,376,938,1414,1646,1771,1865,1871,2099,2153,2515 'topic-agent-skills' 'topic-gtm' 'topic-hermes-agent' 'topic-marketing-skills' 'topic-mismatch':2514 'topic-openclaw-skills' 'topic-skill-pack' 'topic-skills' 'topic-technical-seo' 'tri':242,784,1078,1116,1553,2270 'type':1544 'typic':2451 'unclear':1888 'understand':2472 'unknown':1103,1105,1138 'unregist':1162,1173 'unrel':130 'untrack':1056 'urllib.error':1073 'urllib.error.httperror':1150 'urllib.request':1072 'urllib.request.request':1080 'urllib.request.urlopen':1092 'usabl':1802 'use':255,299,444,518,546,547,733,936,1024,1360,1379,1666,1677,1779,1787,2072,2379 'user':230,272,346,402,515,684,1088,2040,2470 'user-ag':1087 'v':639,644 'valid':554,575,604,628,631,641,668,677,686,704 'valid.append':624 'valu':2144 'vcardarray':1119 'verifi':167,2189 'version':178,189,193 'versus':1728 'violat':2405 'w':1273,1275,1283,1285 'wait':901 'wayback':264,719,726,896,905,915,1619,1690,1750,1804,1882,1891,2393 'weak':1906 'web.archive.org':777,946 'web.archive.org/cdx/search/cdx?url=domain_here&output=json&fl=timestamp,statuscode&collapse=timestamp:6&limit=100000':776 'web.archive.org/web/latest_timestamp/http://domain_here':945 'whether':2376 'whoi':1038 'widen':2277 'win':2366 'without':92,1375,1664,1731,2488 'word':1240,1251,1257,1259,1266,1278,1300,1307,1309 'workflow':1606 'x':1522 'y':2219 'year':807,849,855,880,883,885,1701,1753,1876,1896 'yyyi':2062 'yyyy-mm-dd':2061","prices":[{"id":"8bc44cef-41d9-4820-a660-db2c341b007b","listingId":"94f03650-bf4d-495d-9718-b66ba4c1386f","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"Varnan-Tech","category":"opendirectory","install_from":"skills.sh"},"createdAt":"2026-05-10T18:54:45.474Z"}],"sources":[{"listingId":"94f03650-bf4d-495d-9718-b66ba4c1386f","source":"github","sourceId":"Varnan-Tech/opendirectory/domain-expired-opportunity-finder","sourceUrl":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/domain-expired-opportunity-finder","isPrimary":false,"firstSeenAt":"2026-05-10T18:54:45.474Z","lastSeenAt":"2026-05-18T18:54:40.610Z"}],"details":{"listingId":"94f03650-bf4d-495d-9718-b66ba4c1386f","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"Varnan-Tech","slug":"domain-expired-opportunity-finder","github":{"repo":"Varnan-Tech/opendirectory","stars":286,"topics":["agent-skills","gtm","hermes-agent","marketing-skills","openclaw-skills","skill-pack","skills","technical-seo"],"license":"mit","html_url":"https://github.com/Varnan-Tech/opendirectory","pushed_at":"2026-05-18T18:27:10Z","description":" AI Agent Skills built for Founders who hate Marketing","skill_md_sha":"336b2978f8a914bba9e2815f48d8913542e7fd2f","skill_md_path":"skills/domain-expired-opportunity-finder/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/Varnan-Tech/opendirectory/tree/main/skills/domain-expired-opportunity-finder"},"layout":"multi","source":"github","category":"opendirectory","frontmatter":{"name":"domain-expired-opportunity-finder","description":"Evaluates expired domain candidates against a target niche, scores them by topical relevance, historical activity level, and history cleanliness, then outputs a ranked shortlist with explainable reasoning and risk flags.","compatibility":"[claude-code, gemini-cli, github-copilot]"},"skills_sh_url":"https://skills.sh/Varnan-Tech/opendirectory/domain-expired-opportunity-finder"},"updatedAt":"2026-05-18T18:54:40.610Z"}}