Lookup

POST /v2/lookup ejecuta una búsqueda web en una de seis categorías y devuelve una lista de resultados plana e independiente del proveedor. Define perceive_top y además renderiza las URL de los N primeros resultados en un navegador real, de modo que un agente obtiene la página de resultados del motor de búsqueda (SERP) y el contenido de la página detrás de cada acierto en una sola ida y vuelta. Es la respuesta de EnConvert a Firecrawl /search: una sola llamada donde, de otro modo, tendrías que invocar una API de búsqueda, analizar sus resultados y luego desplegar un scraper.

Serper la respalda hoy. La petición y la respuesta hablan un vocabulario de búsqueda neutral — category, country, locale, time_filter — de modo que un futuro cambio de proveedor no altera el contrato contra el que programas.

Aquí tienes la llamada útil más pequeña. Envía una consulta y recupera los mejores resultados web:

curl -X POST https://api.enconvert.com/v2/lookup \
  -H "X-API-Key: sk_live_your_private_key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "headless chrome pdf rendering"
  }'

La respuesta es una lista de resultados plana más la procedencia para correlación de soporte:

{
    "lookup_id": 81423,
    "query": "headless chrome pdf rendering",
    "category": "web",
    "total": 10,
    "results": [
        {
            "title": "Generate PDFs with headless Chrome",
            "url": "https://example.com/guide/chrome-pdf",
            "snippet": "Render a page and print it to PDF...",
            "position": 1
        },
        {
            "title": "Print to PDF — Chrome DevTools Protocol",
            "url": "https://example.dev/cdp/print-to-pdf",
            "snippet": "Page.printToPDF returns base64 PDF data...",
            "position": 2
        }
    ],
    "perceive_top": 0,
    "perceive_operation_ids": [],
    "credits": 1,
    "cost_cents": 0.06,
    "warnings": []
}

Conviene señalarlo de entrada. /v2/lookup es un endpoint V2 con su propio contador de cuota, lookup_queries, separado de las conversiones V1 y del contador de perceive. Los planes de conversión V1 no incluyen consultas de lookup — necesitas un plan que incluya V2 para llamarlo. Consulta la página de precios para las asignaciones por nivel, y la visión general de V2 para saber cómo se relacionan los contadores de V2.


Endpoints

Method Path Propósito
POST /v2/lookup Ejecuta una búsqueda y, opcionalmente, auto-percibe las URL de los N primeros resultados.

/v2/lookup es un endpoint de una sola llamada — no hay una ruta separada de estado o recuperación. Cuando auto-percibes, cada página renderizada se convierte en una operación perceive de primera clase con su propio operation_id, que puedes volver a recuperar más tarde mediante GET /v2/perceive/{operation_id}.

Content-Type: application/json.


Autenticación

Autentícate con una clave privada en la cabecera X-API-Key para llamadas servidor a servidor. Esta es la vía que usan los ejemplos siguientes.

X-API-Key: sk_live_your_private_key

Las claves públicas con un token bearer JWT también funcionan, usando el mismo flujo que cualquier otro endpoint — genera un token con tu clave pk_ y luego envíalo como Authorization: Bearer <token>. El flujo completo, incluyendo el bloqueo de dominio y la renovación de tokens, está en la guía de autenticación.

Cada clave de API lleva una lista de permitidos de endpoints. Si /v2/lookup no está en la lista de la clave, la petición se rechaza con 403.


Cómo funciona lookup

Una petición ejecuta una búsqueda del proveedor y — solo si lo pides — renderiza los mejores resultados después.

  1. Control de cuota. Antes de facturar nada, el handler comprueba el contador lookup_queries de tu plan. Un plan deshabilitado o una cuota mensual agotada se rechazan con 402, así que no se cobra nada en un rechazo.
  2. Búsqueda. La consulta va al proveedor de búsqueda (Serper hoy) en el endpoint correspondiente a tu category. La actualidad, el país, la configuración regional, la ubicación, el tamaño de página y el autocorrector se mapean sobre los parámetros del proveedor.
  3. Normalización. Cada acierto del proveedor se aplana en un LookupResult neutral — title, url, snippet, position, y los extras específicos de la categoría aterrizan en extra para que el contrato nunca crezca una columna por cada peculiaridad de proveedor.
  4. Cobro y auditoría. La búsqueda tuvo éxito, así que se consume un lookup_queries y se escribe una fila de auditoría ch_lookup_queries. El id de la fila vuelve como lookup_id para correlación de soporte.
  5. Auto-perceive (opcional). Si perceive_top > 0, las URL de los N primeros resultados se renderizan de una en una a través del singleton compartido de Chrome headless — el mismo pipeline que el endpoint perceive. Cada renderizado es una operación completa de /v2/perceive: su propio decremento de cuota, su propia fila de operación, su propio operation_id. Las peticiones de auto-perceive solicitan únicamente Markdown — sin captura de pantalla, PDF ni extracción con LLM.

Auto-perceive funciona en modo de mejor esfuerzo. Una sola URL que falla, o la cuota de perceive que se agota a mitad de camino, degrada a una advertencia y aun así devuelve los resultados de búsqueda — la SERP es el producto principal aquí, así que un problema de percepción nunca hunde la llamada entera.


Parámetros de la petición

Consulta y categoría

Parameter Type Default Descripción
query string La consulta de búsqueda. 1–512 caracteres, recortada de espacios al inicio y al final. Una consulta vacía tras recortar se rechaza con 422. Obligatoria.
category string "web" Una de web, news, images, scholar, patents, maps.

Segmentación y actualidad

Parameter Type Default Descripción
country string null Código de país gl de Google, p. ej. us, in. Máximo 8 caracteres.
locale string null Idioma de interfaz hl de Google, p. ej. en. Máximo 16 caracteres.
time_filter string null Restringe a resultados del período pasado: hour, day, week, month o year.
location string null Cadena de ubicación de texto libre, p. ej. "Austin, Texas". Máximo 128 caracteres.
autocorrect boolean true Si el proveedor puede autocorregir la ortografía de la consulta.

Paginación

Parameter Type Default Descripción
num_results integer 10 Resultados por página. 1–100.
page integer 1 Número de página. 1–10.

Auto-perceive

Parameter Type Default Descripción
perceive_top integer 0 Auto-percibe las primeras N URL de resultado que tengan un enlace navegable. 0–10. Cada una es un renderizado completo de navegador que se ejecuta secuencialmente a través del singleton compartido y consume un perceive_operations de tu cuota — por eso está limitado a 10. Para conjuntos más grandes, toma los campos url y llama al endpoint de perceive por lotes. 0 deshabilita auto-perceive.

Categorías

Cada categoría llega a un endpoint distinto del proveedor y expone una forma de resultado ligeramente diferente. Los campos universales (title, url, snippet, position) siempre están tipados; los campos específicos de la categoría aterrizan en extra.

category Qué busca Campos notables poblados
web Resultados web generales title, url, snippet, date, position
news Artículos de noticias añade source, image_url
images Resultados de imágenes image_url, thumbnail_url, source (a menudo sin snippet)
scholar Resultados académicos misma forma que web; recuentos de citas en extra
patents Resultados de patentes misma forma que web; campos de patente en extra
maps Lugares locales url es el sitio web del lugar; snippet lleva la dirección; valoración y coordenadas en extra

Conviene señalar: para images y maps, url puede ser null en un acierto dado cuando el proveedor no devuelve un enlace navegable. Auto-perceive omite cualquier resultado cuya url sea null, así que un perceive_top de 5 sobre una SERP con dos aciertos sin URL percibe como mucho tres páginas.


Respuesta

El endpoint omite los campos null, así que un resultado web mínimo lleva solo los campos que realmente están poblados.

Field Type Descripción
lookup_id integer El id de la fila de auditoría ch_lookup_queries. Cítalo a soporte. null si la escritura de auditoría falló — los resultados siguen siendo válidos.
query string La consulta (recortada) que enviaste.
category string La categoría buscada.
country string Eco del country que enviaste, si lo hubo.
locale string Eco del locale que enviaste, si lo hubo.
time_filter string Eco del time_filter que enviaste, si lo hubo.
total integer Número de resultados devueltos.
results LookupResult[] La lista de resultados. Véase más abajo.
perceive_top integer Cuántos resultados se percibieron realmente — como mucho el valor que pediste, menos si la cuota se agotó o las URL fallaron.
perceive_operation_ids string[] Los ids de operación per_... de los resultados percibidos, en orden.
answer_box object La caja de respuesta del proveedor, cuando está presente.
knowledge_graph object El panel de grafo de conocimiento del proveedor, cuando está presente.
credits integer Créditos del proveedor consumidos por esta consulta.
cost_cents number Coste monetario de la búsqueda en céntimos. Un valor fijo de 0.06 por consulta hoy.
warnings string[] Notas no fatales: un resultado sin URL omitido, un fallo de auto-perceive, la cuota de perceive agotándose a mitad del bucle.

LookupResult

Field Type Descripción
title string Título del resultado.
url string Enlace canónico a la página — lo que percibirías. null para resultados sin URL navegable.
snippet string Fragmento del resultado. Para maps, lleva la dirección.
position integer La posición del resultado en la SERP.
source string Fuente/editor, para news e images.
date string Fecha de publicación, cuando el proveedor reporta una.
image_url string URL de la imagen, para images y news.
thumbnail_url string URL de la miniatura, para images.
extra object Campos específicos de la categoría que no están en el conjunto neutral: valoraciones, coordenadas, recuentos de citas, etc.
perceive PerceiveResponse El resultado completo de perceive en línea para esta URL — presente solo para los N primeros cuando perceive_top > 0 y el renderizado tuvo éxito. Misma forma de objeto que el endpoint perceive.

Leer los resultados de auto-perceive

Cuando envías perceive_top, recorre los resultados y comprueba el campo perceive — está presente solo en los resultados que se percibieron, y solo cuando su renderizado tuvo éxito. El Markdown de cada uno vive detrás de una URL de descarga prefirmada (un enlace firmado y de corta duración al almacenamiento de objetos) bajo perceive.outputs.markdown.url, igual que en una llamada directa a perceive.

{
    "lookup_id": 81910,
    "query": "react server components data fetching",
    "category": "web",
    "total": 10,
    "results": [
        {
            "title": "Data fetching with RSC",
            "url": "https://example.com/rsc/data",
            "snippet": "Fetch on the server, stream to the client...",
            "position": 1,
            "perceive": {
                "operation_id": "per_3f9a2c1b8e7d4a6f90b1c2d3e4f5a6b7",
                "status": "completed",
                "url": "https://example.com/rsc/data",
                "outputs": {
                    "markdown": {
                        "url": "https://spaces.example.com/...signed...",
                        "size_bytes": 7421,
                        "content_type": "text/markdown; charset=utf-8",
                        "expires_in": 900
                    }
                },
                "cost_cents": 0.0,
                "duration_ms": 5840
            }
        }
    ],
    "perceive_top": 1,
    "perceive_operation_ids": [
        "per_3f9a2c1b8e7d4a6f90b1c2d3e4f5a6b7"
    ],
    "credits": 1,
    "cost_cents": 0.06,
    "warnings": []
}

Esas URL firmadas expiran tras 15 minutos. Para descargar una página percibida más tarde, vuelve a recuperar su operación con GET /v2/perceive/{operation_id} usando el id de perceive_operation_ids — eso vuelve a firmar las URL y no vuelve a renderizar, así que no cuesta cuota. Consulta la sección de recuperación de perceive para los detalles.


Ejemplos de código

curl — búsqueda web

curl -X POST https://api.enconvert.com/v2/lookup \
  -H "X-API-Key: sk_live_your_private_key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "open source vector database",
    "num_results": 20
  }'

curl — noticias recientes, localizadas

curl -X POST https://api.enconvert.com/v2/lookup \
  -H "X-API-Key: sk_live_your_private_key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "rbi monetary policy",
    "category": "news",
    "country": "in",
    "locale": "en",
    "time_filter": "week"
  }'

curl — búsqueda más auto-perceive de los 3 primeros

curl -X POST https://api.enconvert.com/v2/lookup \
  -H "X-API-Key: sk_live_your_private_key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "langchain retrieval augmented generation",
    "perceive_top": 3
  }'

Python

import requests

response = requests.post(
    "https://api.enconvert.com/v2/lookup",
    headers={"X-API-Key": "sk_live_your_private_key"},
    json={
        "query": "langchain retrieval augmented generation",
        "perceive_top": 3,
    },
)
response.raise_for_status()
data = response.json()

# Pull the Markdown of every result that was perceived
for result in data["results"]:
    perceived = result.get("perceive")
    if not perceived:
        continue
    markdown_url = perceived["outputs"]["markdown"]["url"]
    page_text = requests.get(markdown_url).text
    print(result["url"], len(page_text), "chars")

for note in data["warnings"]:
    print("warning:", note)

Node.js

const res = await fetch("https://api.enconvert.com/v2/lookup", {
    method: "POST",
    headers: {
        "Content-Type": "application/json",
        "X-API-Key": "sk_live_your_private_key"
    },
    body: JSON.stringify({
        query: "langchain retrieval augmented generation",
        perceive_top: 3
    })
});

const data = await res.json();

// Pull the Markdown of every result that was perceived
for (const result of data.results) {
    if (!result.perceive) continue;
    const markdownUrl = result.perceive.outputs.markdown.url;
    const pageText = await fetch(markdownUrl).then(r => r.text());
    console.log(result.url, pageText.length, "chars");
}

for (const note of data.warnings) {
    console.log("warning:", note);
}

Si llamas a EnConvert desde Claude, Cursor u otro cliente del Model Context Protocol (MCP), la capacidad de búsqueda se expone como una herramienta — consulta la página del servidor MCP.


Restricciones por plan

Las consultas de lookup se miden en su propio contador, lookup_queries, separado de las conversiones V1 y del contador de perceive que usa el endpoint perceive. Los planes de conversión V1 no incluyen cuota de lookup; necesitas un plan que incluya V2.

Dos cosas se facturan de forma independiente en una llamada de lookup:

Qué haces Contador consumido
Ejecutar una búsqueda un lookup_queries
Auto-percibir N URL de resultado un perceive_operations por URL realmente renderizada

Así que una llamada con perceive_top: 3 consume un lookup_queries y hasta tres perceive_operations. Si tu cuota de perceive se agota a mitad del bucle, la búsqueda aun así devuelve — auto-perceive simplemente se detiene en el límite y lo anota en warnings, en lugar de hacer fallar la petición entera.

Las asignaciones por nivel para ambos contadores están en la página de precios; se configuran por plan, no están codificadas en duro en el endpoint. (En el momento de escribir esto, el plan Free trae por defecto 25 lookup_queries y 50 perceive_operations al mes.)


Respuestas de error

El handler nunca repite el texto crudo del proveedor al cliente — el detalle del proveedor y de SSRF se queda en los logs del servidor, y el cliente recibe un mensaje limpio y genérico.

Status Condición
401 Unauthorized Clave de API / token JWT ausente o inválido.
402 Payment Required Lookup no está en tu plan actual, o tu cuota mensual de lookup_queries está agotada.
403 Forbidden /v2/lookup no está en los endpoints permitidos de la clave de API.
422 Unprocessable Entity Falló la validación de la petición: query vacía o demasiado larga, una category o time_filter desconocida, num_results o page fuera de rango, perceive_top mayor de 10.
502 Bad Gateway El proveedor de búsqueda devolvió una respuesta de error o un fallo de transporte no reintentable (SearchUpstreamError). Reintentar puede ayudar.
503 Service Unavailable El proveedor de búsqueda está mal configurado del lado del servidor (una clave ausente — culpa nuestra, SearchConfigError), o está temporalmente no disponible: el circuit breaker está abierto, o el proveedor nos limitó la tasa (SearchUnavailableError). Reintenta más tarde.
500 Internal Server Error Un fallo inesperado. El mensaje es genérico; cita a soporte la hora de la llamada.

Un auto-perceive que falla nunca lanza un error propio — aterriza en warnings y la llamada aun así responde 200. La referencia completa de códigos de estado está en la guía de códigos de error.


Límites

Límite Valor
Longitud de query 1–512 caracteres (recortada)
Longitud de country 8 caracteres
Longitud de locale 16 caracteres
Longitud de location 128 caracteres
num_results 1–100
page 1–10
perceive_top 0–10
Salidas de auto-perceive Solo Markdown
Concurrencia de auto-perceive Secuencial (un renderizado a la vez)
Coste por búsqueda 0.06 céntimos fijo
Expiración de la URL firmada de página percibida 15 minutos
lookup_queries mensuales Dependiente del plan (ver precios)