---
name: fetch_hackernews_search
kind: function
lang: py
domain: datascience
version: "1.0.0"
purity: impure
signature: "def fetch_hackernews_search(query: str, limit: int = 50, tags: str = \"story\") -> list[dict]"
description: "Busca en Hacker News via la API Algolia publica (sin auth ni anti-bot) y normaliza cada hit a un shape comun de market intelligence. GET a hn.algolia.com/api/v1/search filtrando por tags (story/comment/...)."
tags: [market-intel, hackernews, scraping, http, social, demand, impure, datascience]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [requests]
params:
  - name: query
    desc: "termino de busqueda (ej: 'i wish there was a tool')"
  - name: limit
    desc: "maximo de resultados (hitsPerPage de Algolia, topea ~1000)"
  - name: tags
    desc: "filtro de tipo de item Algolia: 'story' (default), 'comment', 'story,comment', 'show_hn', 'ask_hn'"
output: "list[dict] (puede ser []). Cada fila: {source:'hackernews', platform_id:str, title:str, body:str, url:str, author:str, channel:'hn', created_utc:float, platform_score:int, query:str}"
tested: true
tests:
  - "parser normaliza hits al shape exacto"
  - "hit sin url externa cae a news.ycombinator.com item link"
  - "points None se mapea a 0"
  - "hits vacio devuelve lista vacia"
test_file_path: "python/functions/datascience/fetch_hackernews_search_test.py"
file_path: "python/functions/datascience/fetch_hackernews_search.py"
---

## Ejemplo

```python
from datascience import fetch_hackernews_search

# Buscar stories
rows = fetch_hackernews_search("i wish there was a tool", limit=50, tags="story")
for r in rows[:3]:
    print(r["platform_score"], r["title"], r["url"])

# Buscar comentarios (mas senal de demanda conversacional)
comments = fetch_hackernews_search("alternative to", limit=100, tags="comment")
```

## Cuando usarla

Usala como fuente complementaria a `fetch_reddit_search` en pipelines de market
intelligence. HN concentra demanda tecnica/SaaS y la API Algolia es estable y
sin anti-bot, ideal para escaneos recurrentes. Pasa `tags="comment"` para captar
demanda expresada en hilos (suele ser mas rica que los titulos de story).
Combina con `score_demand_signal` para puntuar cada hit.

## Gotchas

- **Sin red = lista vacia, no excepcion**: si la peticion falla (red, 5xx,
  JSON malformado) la funcion devuelve `[]`. Revisa el tamano del resultado.
- `created_utc` viene de `created_at_i` (epoch en segundos, float).
- `platform_score` son los `points` del item, `0` si Algolia no lo provee
  (tipico en comentarios, que no tienen puntos visibles en la API).
- `url`: si el hit es una story con enlace externo, `url` es ese enlace; si no
  (Ask HN, comentarios, Show HN sin link), cae al permalink
  `https://news.ycombinator.com/item?id={objectID}`.
- A diferencia de Reddit, Algolia **no** exige User-Agent ni rate-limitea de
  forma agresiva en uso normal, pero conviene no abusar.
