you-web-search

SkillWeb & browsing

Lets your agent search the web with You.com and get cited, structured results.

Use you-web-search in Claude, ChatGPT or Ahel Desktop

Free. Sign in, add you-web-search and connect your AI. About a minute.

Also: Claude Code · Cursor · Codex

Then ask your AI: use the you-web-search skill

Details

Instructions available. Your AI can read the instructions. Execution depends on the setup they require.

Add ahel to your AI once: Claude, ChatGPT, Cursor, Claude Code or Codex. Then ask it to use this.

you-web-searchStart free
About this skill

Web search using You.com Search API with high-quality, cited results, runs keyless out of the box; YDC_API_KEY unlocks higher limits and real-time web crawling

What this skill tells your AI

The instructions your AI receives, as published by aeonfun/aeon in skills/you-web-search/SKILL.md and read by ahel’s review.

${var} — Search query or topic. When empty, uses a general search for current notable developments across tracked areas.

Today is ${today}. Perform web search using You.com's Search API to find current, high-quality information on ${var}.

Overview

This skill provides web search functionality via You.com's Search API, offering several advantages over basic WebSearch:

  • Higher quality results with relevance ranking and citation extraction
  • Works with zero configuration — no key, wallet, or sign-up needed for the keyless tier
  • Real-time web crawling for fresh content when livecrawl=web is enabled (keyed tier)
  • Structured result format with titles, URLs, snippets, and publication dates
  • Optional livecrawl control through YOUCOM_LIVECRAWL when a full page fetch is useful

Auth modes

ModeWhenEndpointLimits
keylessYDC_API_KEY unsethttps://api.you.com/v1/agents/search100 searches/day per IP, no livecrawl
keyedYDC_API_KEY sethttps://api.you.com/v1/searchYour plan's limits, livecrawl available

Phase 1 — Execute Search

Auth Mode

Check whether the key is set via ${VAR:+x} — a bare $YDC_API_KEY trips the secret-expansion analyzer:

if [ -n "${YDC_API_KEY:+x}" ]; then AUTH_MODE="keyed"; else AUTH_MODE="keyless"; fi
echo "youcom auth_mode=$AUTH_MODE"

A missing key is not an error — the skill runs on the keyless tier.

API Call

Both modes call the same REST contract through ./secretcurl. In keyed mode the {YDC_API_KEY} placeholder is substituted inside the helper; in keyless mode no key header is sent at all.

QUERY="${var:-current notable developments in AI, crypto, and technology}"
COUNT="10"

FRESHNESS="${YOUCOM_FRESHNESS:-week}"
LIVECRAWL="${YOUCOM_LIVECRAWL:-}"
PARAMS="query=$(echo "$QUERY" | jq -Rr @uri)&count=$COUNT&safesearch=strict&freshness=$(echo "$FRESHNESS" | jq -Rr @uri)"

if [ "$AUTH_MODE" = "keyed" ]; then
  SEARCH_URL="https://api.you.com/v1/search?$PARAMS"
  # livecrawl is a keyed-tier feature; the keyless endpoint answers it with 402.
  if [ -n "${LIVECRAWL:+x}" ]; then
    SEARCH_URL="$SEARCH_URL&livecrawl=$(echo "$LIVECRAWL" | jq -Rr @uri)"
  fi
  HTTP=$(./secretcurl -s -o /tmp/youcom-search.json -w '%{http_code}' \
    --max-time 30 -X GET \
    "$SEARCH_URL" \
    -H "X-API-Key: {YDC_API_KEY}" \
    -H "User-Agent: youdotcom-integration/aeonfun-aeon")
else
  SEARCH_URL="https://api.you.com/v1/agents/search?$PARAMS"
  [ -n "${LIVECRAWL:+x}" ] && echo "youcom livecrawl=skipped reason=keyless (set YDC_API_KEY to enable)"
  HTTP=$(./secretcurl -s -o /tmp/youcom-search.json -w '%{http_code}' \
    --max-time 30 -X GET \
    "$SEARCH_URL" \
    -H "User-Agent: youdotcom-integration/aeonfun-aeon")
fi

echo "youcom http=$HTTP auth_mode=$AUTH_MODE bytes=$(wc -c </tmp/youcom-search.json)"

Never send the key to the keyless endpoint, and never call the keyed endpoint without a key (it answers with a 402 payment challenge rather than results).

Response Processing

On HTTP=200 with non-empty body, parse the response:

if [ "$HTTP" = "200" ] && [ -s /tmp/youcom-search.json ]; then
  # Extract web and news results using the documented Search API shape.
  if jq -r '
    [
      (.results.web[]?  | ["web",  (.title // ""), (.url // ""), ((.snippets // []) | join(" ")), (.page_age // "recent")]),
      (.results.news[]? | ["news", (.title // ""), (.url // ""), ((.snippets // []) | join(" ")), (.page_age // "recent")])
    ] | .[] | @tsv
  ' /tmp/youcom-search.json > /tmp/youcom-results.txt; then
    PARSE_OK=1
  else
    PARSE_OK=0
    : > /tmp/youcom-results.txt
  fi

  # Count results
  RESULT_COUNT=$(wc -l < /tmp/youcom-results.txt)
  echo "Extracted $RESULT_COUNT search results"
else
  PARSE_OK=1
  RESULT_COUNT=0
fi

# Any non-200 (or a 200 with nothing usable) hands the run to the built-in WebSearch.
if [ "$RESULT_COUNT" -eq 0 ]; then
  case "$HTTP" in
    200) if [ "$PARSE_OK" = "1" ]; then REASON="EMPTY"; else REASON="PARSE"; fi ;;
    000) REASON="NETWORK" ;;
    *)   REASON="HTTP_$HTTP" ;;
  esac
  SOURCE_PATH="websearch"
  echo "youcom fallback=websearch reason=$REASON auth_mode=$AUTH_MODE"
else
  SOURCE_PATH="youcom"
fi

WebSearch Fallback

When SOURCE_PATH=websearch, don't end the run empty. Run the same query ($QUERY) through the built-in WebSearch tool and continue to Phase 2 with those results. The log line above is the record of why:

youcom fallback=websearch reason=HTTP_401 auth_mode=keyless

Typical triggers are a keyless 401 (see Error Handling), the keyless 429 daily cap (shared GitHub Actions runner IPs can hit it even on light usage), 5xx, a network timeout (reason=NETWORK), an unparseable body (reason=PARSE), or zero results (reason=EMPTY). Only fall back once per run. If WebSearch also returns nothing, report that neither source returned results.

Phase 2 — Format Results

Process the results into a readable format:

Result Structure

For each result from You.com API:

  • Title — article/page title
  • URL — direct link to source
  • Snippet — join snippets[] into one excerpt highlighting query match
  • Date — page_age or recent when unavailable

Quality Filtering

Apply basic quality filters:

  • Exclude results with missing or placeholder titles
  • Skip results without accessible URLs
  • Filter out low-quality content (spam, thin content)
  • Deduplicate near-identical results from the same domain

Formatting

Structure the output for easy consumption:

*You.com Web Search Results — ${today}*

Query: "${var}"
Source: ${source}
Results: ${result_count} found

1. **[Title](URL)**
   Snippet with relevant context...
   Published: Date

2. **[Title](URL)**
   Snippet...
   Published: Date

---
API Status: ${http_status} | Auth: ${auth_mode} | Quality: ${quality_score}/5

${source} is exactly one of You.com Search API (${auth_mode}) or WebSearch (fallback: ${reason}), matching SOURCE_PATH. Never print both.

Phase 3 — Delivery and Logging

Notification

Send formatted results via ./notify:

  • Include query, result count, and source attribution
  • Highlight most relevant results (top 5-7)
  • Note the auth mode actually used (keyless or keyed)
  • When the fallback ran, say so and give the reason (e.g. "via WebSearch — You.com returned HTTP 401")
  • Include livecrawl info when enabled (or that it was skipped on the keyless tier)

Memory Integration

Log the search for future reference:

  1. Log record - this skill is read-only, so the workflow's read-only guard writes its ### you-web-search log entry from your captured output; a self-written entry would be a duplicate. Don't append to memory/logs/ yourself - put this record in your final output:

    ### you-web-search
    - Query: "${var}"
    - Source: ${source}
    - Results: N found, M delivered
    - Status: HTTP ${code}
    - Quality score: X/5 (relevance, freshness, diversity)
    
  2. Update search memory — Add successful searches to memory/searches.md for pattern tracking

Error Handling

API Failure Recovery

Every failure below ends in the WebSearch fallback, so a run always has results. The notes say what to tell the operator:

  • Keyless 401: In keyless mode no key is sent, so a 401 is not a credential problem. Some locations currently get 401 from the keyless endpoint with a body like {"detail":"'ascii' codec can't encode characters ..."}. This is a known server-side issue with non-ASCII region names (e.g. Île-de-France), and country/language parameters don't avoid it. Fall back and log reason=HTTP_401. Setting YDC_API_KEY uses the keyed endpoint, which is unaffected
  • Rate limits (429): Log rate limit hit. In keyless mode this is usually the 100/day per-IP cap — suggest setting YDC_API_KEY (get one at https://you.com/platform?utm_source=aeonfun-aeon&utm_medium=oss_integration&utm_campaign=2026-09-oss-integrations&utm_content=error-message). In keyed mode, suggest checking the plan quota
  • Payment required (402): The request needs the keyed tier (e.g. livecrawl without a key) — suggest setting YDC_API_KEY
  • Invalid key (401/403, keyed mode): Clear error about checking YDC_API_KEY
  • Server errors (5xx): Transient. Fall back and log reason=HTTP_<code> (e.g. HTTP_503)
  • Network failures: Fall back and log reason=NETWORK
  • Malformed responses: A 200 whose body jq can't parse. Fall back and log reason=PARSE
  • Empty results: A 200 with zero results. Fall back and log reason=EMPTY. If WebSearch is also empty, suggest query refinement or broader terms

Logging Failures

Record failure reasons for debugging:

  • youcom-api-unavailable — API endpoint unreachable
  • youcom-rate-limited — Hit plan limits or the keyless daily cap
  • youcom-payment-required — Keyed-tier feature requested without a key
  • youcom-auth-invalid — API key rejected (keyed mode)
  • youcom-keyless-401 — Keyless endpoint returned 401 with no key sent
  • youcom-parse-error — Response format unexpected

Network

Both modes go through ./secretcurl so one code path covers them: keyed calls carry the {YDC_API_KEY} placeholder (never a bare $YDC_API_KEY on the line); keyless calls carry no placeholder and are passed through unchanged. Every request sends User-Agent: youdotcom-integration/aeonfun-aeon.

Environment Variables

Constraints

  • Never expose credentials in logs or notifications
  • Always attribute source — clearly indicate You.com API
  • Respect rate limits — handle 429 responses gracefully
  • Validate all URLs — ensure results contain real, accessible links
  • Keep results relevant — filter low-quality or off-topic results
  • Never end a run empty — on any You.com failure, fall back to WebSearch and log youcom fallback=websearch reason=<REASON>
  • Report the path honestly — say whether results came from You.com or the WebSearch fallback, never present fallback results as You.com results

Integration Notes

Relationship to Built-in WebSearch

This skill complements Aeon's built-in WebSearch, but it is a separate Search API path (keyless by default, keyed when YDC_API_KEY is set):

  • You.com advantages: Higher quality results, real-time crawling, better relevance ranking
  • WebSearch advantages: No API dependency, always available, deeply integrated. It is also this skill's fallback whenever the You.com call fails
  • Use You.com for: Research tasks, fact-checking, current events, specific queries
  • Use WebSearch for: Built-in search flows elsewhere in Aeon

Scheduling Recommendations

  • On-demand: Manual execution for specific research needs
  • Low frequency: Daily or less frequent automatic searches to respect quotas
  • Research workflows: Chain with other skills that need web context
  • Avoid high-frequency: Don't schedule more than hourly to preserve API quotas — the keyless tier is capped at 100 searches/day per IP

Skills Integration

This skill works well with:

  • digest — Enhanced web signal for daily digests
  • article — Research support for article generation
  • github-trending — Context for trending repo evaluation
  • token-pick — Market research and catalyst discovery
  • mention-radar — Broader web mention detection beyond X/Twitter

The You.com search results can inform other skills' web research needs while providing a higher-quality alternative to basic web search.

Signals

GitHub stars
760
Forks
270
Last commit
Sep 2026
Advanced
Item type
skill
Key
you-web-search
Source
github.com/aeonfun/aeon