# Referencia del endpoint de búsqueda: POST y GET /search

> Endpoint de búsqueda: parámetros POST y GET /search, desde read y max_chars hasta filtros topic, time_range y dominio. Sin KYC, criptomonedas.

- URL: https://llmwebsearch.com/es/docs/search/
- Última actualización: 2026-10-22
- Editor: LLMWebSearch (https://llmwebsearch.com)

`/search` ejecuta una búsqueda web en vivo, clasifica hasta 20 resultados y lee las páginas de los primeros. Esta página enumera todos los parámetros, su valor predeterminado, sus límites y su efecto en el precio.

**Respuesta rápida — ¿Qué parámetros acepta el endpoint de búsqueda de LLMWebSearch?**

El endpoint `/search` de **LLMWebSearch** solo necesita `q`. Los parámetros opcionales definen cuántos resultados se devuelven (`max_results`), cuántas páginas se leen (`read`), el formato y la longitud del contenido, noticias o web, un rango de tiempo, el país y el idioma, y los dominios que se conservan o se descartan. Leer hasta 3 páginas cuesta 1 crédito, desde 1,20 US$/1K búsquedas a fecha de octubre de 2026. Sin KYC; paga con criptomonedas.

## /search at a glance

| Atributo | Valor |
| --- | --- |
| Métodos | `POST` con un cuerpo JSON, o `GET` con los mismos nombres en la cadena de consulta |
| URL | `https://llmwebsearch.com/api/v1/search` |
| Obligatorio | `q`: de 1 a 400 caracteres; los operadores de búsqueda se pasan tal como se escriben |
| Valores predeterminados | 5 resultados, se leen los 3 primeros, Markdown de hasta 6.000 caracteres por página |
| Facturación | Un crédito paga una búsqueda: hasta 20 resultados clasificados, con las páginas de los 3 primeros leídas y devueltas como Markdown. Leer de 4 a 10 páginas pasa a 2 créditos. Una llamada que termina en error no cuesta nada |
| Resultados | Los resultados provienen de una búsqueda web en vivo ejecutada en el momento de tu llamada, en el orden en que los clasifica el motor de búsqueda; no se sirve nada de un índice antiguo |
| Filtros | Elige el país y el idioma de los resultados, un rango temporal (último día, semana, mes o año), resultados web o de noticias, y dominios que incluir o excluir |
| Lector de páginas | `LLMWebSearch/1.0 (+https://llmwebsearch.com/bot/)` |

## Busca en la web y lee los mejores resultados (POST)

`POST /api/v1/search`

Ejecuta una búsqueda web en vivo y devuelve resultados clasificados. Las páginas de los primeros `read` resultados se obtienen en paralelo y su contenido principal se devuelve en `content`. El ejemplo pregunta cómo rotar claves API; los títulos, las fechas y los valores son ilustrativos.

Autenticación: clave API en la cabecera `Authorization: Bearer API_KEY`.

**Cuerpo de la solicitud**

| Campo | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `q` | string | Sí | La consulta de búsqueda, de 1 a 400 caracteres. Las comillas y los operadores como `site:` se mantienen tal como se escriben. |
| `max_results` | integer | No | Número de resultados clasificados, de 1 a 20. Predeterminado 5. |
| `read` | integer | No | Cuántos de los primeros resultados se leen y se devuelven con su contenido, de 0 a 10. Predeterminado 3. A partir de 4, la llamada cuesta 2 créditos. |
| `format` | string | No | `markdown` (predeterminado) o `text` para el contenido de la página. |
| `max_chars` | integer | No | Límite de longitud del contenido de cada página, de 500 a 50,000 caracteres. Por defecto 6,000. |
| `topic` | string | No | `web` (predeterminado) o `news`. |
| `time_range` | string | No | `day`, `week`, `month` o `year`. Sin valor predeterminado: cualquier fecha. |
| `country` | string | No | Código de país de dos letras (ISO 3166-1 alpha-2) para el lugar donde se ejecuta la búsqueda. Predeterminado `us`. |
| `language` | string | No | Idioma de los resultados, como `en`, `de` o `pt-BR`. Predeterminado `en`. |
| `include_domains` | string[] | No | Hasta 20 dominios; solo se conservan los resultados de estos dominios y sus subdominios. |
| `exclude_domains` | string[] | No | Hasta 20 dominios cuyos resultados se descartan. |

*Ejemplo: five results, the top three read as Markdown*

```json
{
  "q": "how to rotate api keys without downtime",
  "max_results": 5,
  "read": 3,
  "max_chars": 6000
}
```

*Ejemplo: news of the past week from two sites, nothing read*

```json
{
  "q": "open source license change",
  "topic": "news",
  "time_range": "week",
  "include_domains": [
    "news.example.com",
    "example.org"
  ],
  "read": 0
}
```

**Respuesta** `200`

```json
{
  "query": "how to rotate api keys without downtime",
  "created_at": "2026-10-22T10:15:04Z",
  "credits_used": 1,
  "results": [
    {
      "position": 1,
      "title": "Rotating API keys",
      "url": "https://docs.example.com/security/key-rotation",
      "host": "docs.example.com",
      "snippet": "Create a second key, deploy it everywhere, then revoke the first one.",
      "published_at": "2026-09-30",
      "content_status": "ok",
      "content": "# Rotating API keys\n\n## Zero-downtime rotation\n\n1. Create a second key.\n2. Deploy it to every service.\n3. Revoke the old key.",
      "word_count": 948
    },
    {
      "position": 2,
      "title": "Key rotation checklist",
      "url": "https://blog.example.org/key-rotation-checklist",
      "host": "blog.example.org",
      "snippet": "Keep two keys active during the switch and alert on the old one.",
      "content_status": "blocked_by_robots"
    },
    {
      "position": 3,
      "title": "Secrets management basics",
      "url": "https://security.example.net/secrets-basics",
      "host": "security.example.net",
      "snippet": "Never commit keys to a repository.",
      "published_at": "2026-06-12",
      "content_status": "ok",
      "content": "# Secrets management basics\n\n**Never** commit keys to a repository...",
      "word_count": 1310
    },
    {
      "position": 4,
      "title": "API key best practices",
      "url": "https://dev.example.com/api-key-best-practices",
      "host": "dev.example.com",
      "snippet": "Scope each key to one service and one environment.",
      "content_status": "not_requested"
    }
  ]
}
```

*curl*

```bash
curl -s "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "how to rotate api keys without downtime", "max_results": 5, "read": 3}'
```

*Python*

```python
import os
import requests

resp = requests.post(
    "https://llmwebsearch.com/api/v1/search",
    headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
    json={"q": "how to rotate api keys without downtime", "max_results": 5, "read": 3},
    timeout=60,
)
resp.raise_for_status()
for r in resp.json()["results"]:
    print(r["position"], r["content_status"], r["url"])
```

*Node.js*

```javascript
const res = await fetch('https://llmwebsearch.com/api/v1/search', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${process.env.LLMWEBSEARCH_API_KEY}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ q: 'how to rotate api keys without downtime', max_results: 5, read: 3 }),
});
const { results } = await res.json();
for (const r of results) console.log(r.position, r.content_status, r.url);
```

## Busca en la web (GET)

`GET /api/v1/search`

La misma búsqueda con los parámetros en la cadena de consulta, codificados en URL. Las listas como `include_domains` se escriben como un único valor separado por comas. Útil para una prueba rápida o para herramientas que solo envían solicitudes GET. El ejemplo pide solo resultados (`read=0`).

Autenticación: clave API en la cabecera `Authorization: Bearer API_KEY`.

**Parámetros**

| Nombre | En | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- | --- |
| `q` | query | string | Sí | La consulta de búsqueda, codificada para URL, de 1 a 400 caracteres. |
| `max_results` | query | integer | No | De 1 a 20. Predeterminado: 5. |
| `read` | query | integer | No | De 0 a 10. Predeterminado: 3; 4 o más cuesta 2 créditos. |
| `format` | query | string | No | `markdown` (por defecto) o `text`. |
| `max_chars` | query | integer | No | De 500 a 50.000 por página. Predeterminado: 6.000. |
| `topic` | query | string | No | `web` (predeterminado) o `news`. |
| `time_range` | query | string | No | `day`, `week`, `month` o `year`. |
| `country` | query | string | No | Código ISO 3166-1 alpha-2. Predeterminado: `us`. |
| `language` | query | string | No | Código de idioma. Predeterminado: `en`. |
| `include_domains` | query | string | No | Lista separada por comas, hasta 20 dominios. |
| `exclude_domains` | query | string | No | Lista separada por comas, hasta 20 dominios. |
| `api_key` | query | string | No | Tu clave, cuando no envías el header `Authorization`. |

**Respuesta** `200`

```json
{
  "query": "postgres connection pooling",
  "created_at": "2026-10-22T10:21:47Z",
  "credits_used": 1,
  "results": [
    {
      "position": 1,
      "title": "Connection pooling explained",
      "url": "https://docs.example.com/db/pooling",
      "host": "docs.example.com",
      "snippet": "A pool keeps a few database connections open and lends them to requests.",
      "content_status": "not_requested"
    },
    {
      "position": 2,
      "title": "Sizing a connection pool",
      "url": "https://blog.example.org/pool-size",
      "host": "blog.example.org",
      "snippet": "Start small: the right size depends on cores and disk, not on traffic.",
      "published_at": "2026-03-04",
      "content_status": "not_requested"
    }
  ]
}
```

*curl*

```bash
curl -sG "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  --data-urlencode "q=postgres connection pooling" \
  -d max_results=10 -d read=0
```

*Python*

```python
import os
import requests

resp = requests.get(
    "https://llmwebsearch.com/api/v1/search",
    headers={"Authorization": "Bearer " + os.environ["LLMWEBSEARCH_API_KEY"]},
    params={"q": "postgres connection pooling", "max_results": 10, "read": 0},
    timeout=60,
)
print([r["url"] for r in resp.json()["results"]])
```

*Node.js*

```javascript
const params = new URLSearchParams({ q: 'postgres connection pooling', max_results: '10', read: '0' });
const res = await fetch(`https://llmwebsearch.com/api/v1/search?${params}`, {
  headers: { Authorization: `Bearer ${process.env.LLMWEBSEARCH_API_KEY}` },
});
console.log((await res.json()).results.map((r) => r.url));
```

## ¿Cómo obtengo resultados sin contenido de las páginas?

Configura `read` en `0`. Cada resultado vuelve entonces con su título, URL, host, snippet y fecha, y `content_status: "not_requested"`. La respuesta es mucho más pequeña, lo que ayuda cuando el agente solo necesita elegir qué enlaces importan.

El precio se mantiene en 1 crédito, igual que leer hasta 3 páginas. Un patrón habitual es una búsqueda `read=0` para hacer una preselección y luego una [llamada a extract](https://llmwebsearch.com/es/docs/extract/) sobre las dos o tres URLs que eligió el modelo.

## ¿Cuándo cuesta 2 créditos una búsqueda?

Cuando `read` está entre 4 y 10. Leer más páginas implica más trabajo de nuestro lado, así que el precio se duplica una vez y se mantiene en 2 créditos hasta el máximo de 10 páginas.

`credits_used` en cada respuesta muestra cuánto costó la llamada. Una página que no se pudo leer, por una regla de robots.txt o por una negativa, no baja ni sube ese precio. Si la mayoría de las veces solo necesitas unas pocas páginas completas, deja `read` en 3 y llama a `/extract` para la página extra ocasional.

## ¿Cómo busco noticias recientes?

Envía `topic: "news"` y un `time_range`. Los resultados provienen entonces de artículos de noticias, y `time_range` conserva solo los del último `day`, `week`, `month` o `year`. `published_at` se rellena cuando el artículo o el resultado de búsqueda indica una fecha.

El mismo filtro de actualidad funciona con `topic: "web"`. Es útil para preguntas como lanzamientos recientes o cambios de precios, donde una página antigua engañaría al modelo.

*Noticias de la última semana, los 3 artículos principales leídos*

```bash
curl -s "https://llmwebsearch.com/api/v1/search" \
  -H "Authorization: Bearer $LLMWEBSEARCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q": "database release security fix", "topic": "news", "time_range": "week", "read": 3}'
```

## ¿Cómo limito los resultados a ciertos sitios?

Lístalos en `include_domains`, hasta 20 entradas. Solo se conservan los resultados cuyo host sea uno de esos dominios, o uno de sus subdominios: `example.com` también coincide con `docs.example.com`. Usa `exclude_domains` al revés, por ejemplo para excluir tu propio sitio de los resultados.

En un body POST ambos campos son arrays JSON. En una solicitud GET, escríbelos como un único valor separado por comas. La consulta en sí también puede llevar un operador `site:`; se pasa a la búsqueda tal como está escrita.

## ¿Qué cambian el país y el idioma?

`country` define dónde se ejecuta la búsqueda, con un código de dos letras como `us`, `de` o `br`. Los rankings varían según el país, sobre todo para servicios locales, precios y normativas. `language` define el idioma de los resultados, como `en`, `fr` o `pt-BR`.

Ambos tienen como valor predeterminado Estados Unidos e inglés. Configúralos juntos cuando el agente trabaja para usuarios de un solo mercado: un usuario alemán que pregunta por normas fiscales quiere `country: "de"` y `language: "de"`.

## ¿Cuánto texto de la página vuelve?

Hasta `max_chars` caracteres por página, 6.000 por defecto y desde 500 hasta 50.000. El límite protege la ventana de contexto del modelo: tres páginas de 6.000 caracteres son aproximadamente 4.500 tokens de inglés.

`word_count` cuenta todo el texto extraído, antes del corte, así que puedes saber cuándo se recortó una página. Cuando una respuesta necesita un documento largo, busca primero con un límite bajo y luego obtén esa página sola mediante `/extract` con un límite más alto. Una página lenta no se espera indefinidamente: tras 15 segundos vuelve como `fetch_timeout`, sin contenido.

## Endpoint de búsqueda: preguntas frecuentes

### ¿Debo usar POST o GET?

POST en el código, porque los arrays JSON y las consultas largas son más simples en un body. GET va bien para una prueba rápida en una terminal o en una herramienta que solo envía query strings. Ambos devuelven la misma respuesta y cuestan lo mismo.

### ¿Puedo pedir más de 20 resultados?

No. 20 es el máximo por llamada. Los agentes rara vez necesitan más: una segunda búsqueda con la consulta reformulada suele traer mejores fuentes que una lista larga.

### ¿Las páginas se leen una tras otra?

No, en paralelo. Una página que no responde en 15 segundos se devuelve sin contenido, como `fetch_timeout`, para que un sitio lento no retenga toda la respuesta.

### ¿Qué motor de búsqueda produce los resultados?

Los resultados provienen de una búsqueda web en vivo ejecutada en el momento de tu llamada, en el orden en que los clasifica el motor de búsqueda; no se sirve nada de un índice antiguo. No publicamos qué proveedores upstream ejecutan la búsqueda.

---

LLMWebSearch: LLMWebSearch es una API de búsqueda web para agentes de IA que devuelve resultados clasificados con el contenido de las mejores páginas en Markdown, se paga con criptomonedas y sin subir documentos de identidad. Los créditos prepago desde 1,20 US$/1K búsquedas nunca caducan. Sin KYC: sin ID, sin selfie, sin documentos. Paga con criptomonedas.
