---
name: fetch_reddit_search
kind: function
lang: py
domain: datascience
version: "1.0.0"
purity: impure
signature: "def fetch_reddit_search(query: str, subreddits: list[str] = None, limit: int = 50, sort: str = \"new\") -> list[dict]"
description: "Busca posts en Reddit via la API JSON publica (sin auth) y los normaliza a un shape comun de market intelligence. Por subreddit (o global si None), GET a search.json con t=year. Tolera errores por subreddit (429, red) continuando con los demas. Requiere User-Agent obligatorio."
tags: [market-intel, reddit, 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: 'csv dedupe tool')"
  - name: subreddits
    desc: "lista de subreddits sin prefijo r/ (ej: ['SaaS','Entrepreneur']). Si None o vacio -> busqueda global en todo Reddit"
  - name: limit
    desc: "maximo de resultados por subreddit (o por la busqueda global). Reddit topea ~100"
  - name: sort
    desc: "orden de Reddit: 'new' (default), 'relevance', 'top', 'comments', 'hot'"
output: "list[dict] (puede ser []). Cada fila: {source:'reddit', platform_id:str, title:str, body:str, url:str, author:str, channel:str, created_utc:float, platform_score:int, query:str}"
tested: true
tests:
  - "parser normaliza children al shape exacto"
  - "selftext vacio se mapea a body vacio"
  - "children vacio devuelve lista vacia"
test_file_path: "python/functions/datascience/fetch_reddit_search_test.py"
file_path: "python/functions/datascience/fetch_reddit_search.py"
---

## Ejemplo

```python
from datascience import fetch_reddit_search

# Buscar en subreddits concretos
rows = fetch_reddit_search(
    "csv dedupe tool",
    subreddits=["SaaS", "Entrepreneur"],
    limit=25,
    sort="new",
)
for r in rows[:3]:
    print(r["channel"], r["platform_score"], r["title"])

# Busqueda global (sin subreddits)
rows_global = fetch_reddit_search("i wish there was a tool", limit=50)
```

## Cuando usarla

Usala como primera fase de un pipeline de market intelligence: recolectar
conversaciones reales de Reddit donde la gente expresa necesidades o busca
herramientas. Combina la salida con `score_demand_signal` para puntuar cada
post por senal de demanda. Cubre subreddits de nicho (`subreddits=[...]`) o
escanea todo Reddit (busqueda global).

## Gotchas

- **User-Agent obligatorio**: Reddit devuelve `429 Too Many Requests` si no se
  envia un User-Agent identificable. Esta funcion envia
  `demand_radar/0.1 (registry market-intel)` por defecto.
- **Rate limiting**: la API publica sin auth tiene limites estrictos. Si haces
  muchas llamadas seguidas o pides muchos subreddits, Reddit puede empezar a
  devolver 429. La funcion **tolera** estos fallos por subreddit (try/except) y
  sigue con los demas — un 429 en un subreddit no aborta la busqueda completa,
  simplemente ese subreddit aporta 0 filas.
- **Sin red = lista vacia, no excepcion**: si todas las peticiones fallan,
  devuelve `[]`. Revisa el tamano del resultado, no asumas exito.
- `created_utc` es epoch en segundos (float). `platform_score` son los upvotes
  netos (`ups`), 0 si Reddit no lo provee.
- `t=year` fija la ventana temporal a un ano; no es parametrizable en esta
  version (mantiene la firma simple).
