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/lookupes 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.
- Control de cuota. Antes de facturar nada, el handler comprueba el
contador
lookup_queriesde tu plan. Un plan deshabilitado o una cuota mensual agotada se rechazan con402, así que no se cobra nada en un rechazo. - 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. - Normalización. Cada acierto del proveedor se aplana en un
LookupResultneutral —title,url,snippet,position, y los extras específicos de la categoría aterrizan enextrapara que el contrato nunca crezca una columna por cada peculiaridad de proveedor. - Cobro y auditoría. La búsqueda tuvo éxito, así que se consume un
lookup_queriesy se escribe una fila de auditoríach_lookup_queries. El id de la fila vuelve comolookup_idpara correlación de soporte. - 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 propiooperation_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) |