Lookup

POST /v2/lookup esegue una ricerca web in una di sei categorie e restituisce un elenco di risultati piatto e neutrale rispetto al provider. Imposta perceive_top e renderizza anche i primi N URL dei risultati in un browser reale, così un agente ottiene la pagina dei risultati del motore di ricerca (SERP) e il contenuto della pagina dietro ogni risultato in un unico viaggio di andata e ritorno. È la risposta di EnConvert a Firecrawl /search: una sola chiamata dove altrimenti dovresti raggiungere una API di ricerca, analizzarne i risultati e poi distribuire uno scraper.

Oggi è supportato da Serper. La richiesta e la risposta parlano un vocabolario di ricerca neutrale — category, country, locale, time_filter — così un futuro cambio di provider non altera il contratto su cui scrivi il codice.

Ecco la chiamata utile più piccola. Invia una query, ottieni i principali risultati 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 risposta è un elenco di risultati piatto più la provenienza per la correlazione con il supporto:

{
    "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": []
}

Vale la pena segnalarlo subito. /v2/lookup è un endpoint V2 con il proprio contatore di quota, lookup_queries, separato dalle conversioni V1 e dal contatore perceive. I piani di conversione V1 non includono le query di lookup — serve un piano che includa V2 per chiamarlo. Consulta la pagina dei prezzi per le quote per fascia e la panoramica V2 per come si relazionano i contatori V2.


Endpoint

Metodo Percorso Scopo
POST /v2/lookup Esegue una ricerca e, facoltativamente, auto-percepisce i primi N URL dei risultati.

/v2/lookup è un endpoint a chiamata singola — non c'è un percorso separato di stato o di recupero. Quando auto-percepisci, ogni pagina renderizzata diventa un'operazione perceive di prima classe con il proprio operation_id, che puoi recuperare in seguito tramite GET /v2/perceive/{operation_id}.

Content-Type: application/json.


Autenticazione

Autenticati con una chiave privata nell'header X-API-Key per le chiamate server-to-server. È il percorso usato negli esempi qui sotto.

X-API-Key: sk_live_your_private_key

Funzionano anche le chiavi pubbliche con un token bearer JWT, usando lo stesso flusso di ogni altro endpoint — genera un token con la tua chiave pk_, poi invialo come Authorization: Bearer <token>. Il flusso completo, incluso il blocco del dominio e il refresh del token, è in la guida all'autenticazione.

Ogni chiave API porta con sé un allowlist di endpoint consentiti. Se /v2/lookup non è nell'elenco della chiave, la richiesta viene rifiutata con 403.


Come funziona lookup

Una richiesta esegue una ricerca con il provider e — solo se lo richiedi — renderizza poi i principali risultati.

  1. Controllo della quota. Prima di qualsiasi addebito, il gestore verifica il contatore lookup_queries per il tuo piano. Un piano disabilitato o una quota mensile esaurita vengono rifiutati con 402, così non viene addebitato nulla in caso di rifiuto.
  2. Ricerca. La query va al provider di ricerca (oggi Serper) sull'endpoint per la tua category. Recency, country, locale, location, dimensione della pagina e autocorrect si mappano sui parametri del provider.
  3. Normalizzazione. Ogni risultato del provider viene appiattito in un LookupResult neutrale — title, url, snippet, position — e gli extra specifici della categoria finiscono in extra, così il contratto non aggiunge mai una colonna per ogni stranezza del provider.
  4. Addebito e audit. La ricerca è riuscita, quindi viene consumato un lookup_queries e viene scritta una riga di audit ch_lookup_queries. L'id della riga torna come lookup_id per la correlazione con il supporto.
  5. Auto-perceive (facoltativo). Se perceive_top > 0, i primi N URL dei risultati vengono renderizzati uno alla volta tramite il singleton condiviso headless Chrome — la stessa pipeline di l'endpoint perceive. Ogni render è un'operazione /v2/perceive completa: il proprio decremento di quota, la propria riga di operazione, il proprio operation_id. Le richieste di auto-perceive producono solo Markdown — niente screenshot, PDF o estrazione LLM.

L'auto-perceive è best-effort. Un singolo URL che fallisce, o la quota perceive che si esaurisce a metà strada, degrada a un avviso e restituisce comunque i risultati della ricerca — la SERP è il prodotto principale qui, quindi un problema di percezione non affonda mai l'intera chiamata.


Parametri della richiesta

Query e categoria

Parametro Tipo Predefinito Descrizione
query string La query di ricerca. 1–512 caratteri, ripulita dagli spazi iniziali/finali. Una query vuota dopo il trimming viene rifiutata con 422. Obbligatorio.
category string "web" Uno tra web, news, images, scholar, patents, maps.

Targeting e recency

Parametro Tipo Predefinito Descrizione
country string null Codice paese Google gl, es. us, in. Max 8 caratteri.
locale string null Lingua dell'interfaccia Google hl, es. en. Max 16 caratteri.
time_filter string null Limita ai risultati del periodo passato: hour, day, week, month, o year.
location string null Stringa di località in testo libero, es. "Austin, Texas". Max 128 caratteri.
autocorrect boolean true Se il provider può autocorreggere l'ortografia della query.

Paginazione

Parametro Tipo Predefinito Descrizione
num_results integer 10 Risultati per pagina. 1–100.
page integer 1 Numero di pagina. 1–10.

Auto-perceive

Parametro Tipo Predefinito Descrizione
perceive_top integer 0 Auto-percepisce i primi N URL dei risultati che hanno un link navigabile. 0–10. Ognuno è un render completo del browser che gira in sequenza attraverso il singleton condiviso e consuma un perceive_operations dalla tua quota — motivo per cui è limitato a 10. Per insiemi più grandi, prendi i campi url e chiama l'endpoint perceive batch. 0 disabilita l'auto-perceive.

Categorie

Ogni categoria raggiunge un endpoint diverso del provider e mostra una forma di risultato leggermente diversa. I campi universali (title, url, snippet, position) sono sempre tipizzati; i campi specifici della categoria finiscono in extra.

category Cosa cerca Campi notevoli popolati
web Risultati web generici title, url, snippet, date, position
news Articoli di notizie aggiunge source, image_url
images Risultati di immagini image_url, thumbnail_url, source (spesso senza snippet)
scholar Risultati accademici stessa forma di web; conteggi delle citazioni in extra
patents Risultati di brevetti stessa forma di web; campi dei brevetti in extra
maps Luoghi locali url è il sito web del luogo; snippet porta l'indirizzo; valutazione e coordinate in extra

Vale la pena segnalare: per images e maps, url può essere null per un dato risultato quando il provider non restituisce alcun link navigabile. L'auto-perceive salta qualsiasi risultato il cui url è null, quindi un perceive_top di 5 su una SERP con due risultati senza URL percepisce al massimo tre pagine.


Risposta

L'endpoint omette i campi null, quindi un risultato web minimale porta solo i campi effettivamente popolati.

Campo Tipo Descrizione
lookup_id integer L'id della riga di audit ch_lookup_queries. Citalo al supporto. null se la scrittura dell'audit è fallita — i risultati restano comunque validi.
query string La query (ripulita) che hai inviato.
category string La categoria cercata.
country string Eco del country che hai inviato, se presente.
locale string Eco del locale che hai inviato, se presente.
time_filter string Eco del time_filter che hai inviato, se presente.
total integer Numero di risultati restituiti.
results LookupResult[] L'elenco dei risultati. Vedi sotto.
perceive_top integer Quanti risultati sono stati effettivamente percepiti — al massimo il valore richiesto, meno se la quota si è esaurita o gli URL hanno fallito.
perceive_operation_ids string[] Gli id di operazione per_... dei risultati percepiti, in ordine.
answer_box object Il riquadro di risposta del provider, quando presente.
knowledge_graph object Il pannello knowledge graph del provider, quando presente.
credits integer Crediti del provider consumati da questa query.
cost_cents number Costo monetario della ricerca in centesimi. Oggi un valore fisso di 0.06 per query.
warnings string[] Note non fatali: un risultato senza URL saltato, un fallimento dell'auto-perceive, la quota perceive che si esaurisce a metà del ciclo.

LookupResult

Campo Tipo Descrizione
title string Titolo del risultato.
url string Link canonico della pagina — la cosa che percepiresti. null per i risultati senza URL navigabile.
snippet string Snippet del risultato. Per maps, porta l'indirizzo.
position integer La posizione del risultato sulla SERP.
source string Fonte/editore, per news e images.
date string Data di pubblicazione, quando il provider ne riporta una.
image_url string URL dell'immagine, per images e news.
thumbnail_url string URL della miniatura, per images.
extra object Campi specifici della categoria non presenti nell'insieme neutrale: valutazioni, coordinate, conteggi delle citazioni e così via.
perceive PerceiveResponse Il risultato perceive completo in linea per questo URL — presente solo per i primi N quando perceive_top > 0 e il render è riuscito. Stessa forma di oggetto di l'endpoint perceive.

Leggere i risultati dell'auto-perceive

Quando invii perceive_top, scorri i risultati e controlla il campo perceive — è presente solo sui risultati che sono stati percepiti, e solo quando il loro render è riuscito. Il Markdown di ciascuno risiede dietro un URL di download pre-firmato (un link firmato a breve scadenza all'object storage) sotto perceive.outputs.markdown.url, lo stesso di una chiamata perceive diretta.

{
    "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": []
}

Quegli URL firmati scadono dopo 15 minuti. Per scaricare una pagina percepita in seguito, recupera di nuovo la sua operazione con GET /v2/perceive/{operation_id} usando l'id da perceive_operation_ids — questo rifirma gli URL e non ri-renderizza, quindi non costa quota. Vedi la sezione recupero di perceive per i dettagli.


Esempi di codice

curl — ricerca 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 — notizie recenti, localizzate

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 — ricerca più auto-perceive dei primi 3

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);
}

Se chiami EnConvert da Claude, Cursor o un altro client Model Context Protocol (MCP), la capacità di ricerca è esposta come uno strumento — vedi la pagina del server MCP.


Gating del piano

Le query di lookup sono misurate sul proprio contatore, lookup_queries, separato dalle conversioni V1 e dal contatore perceive che usa l'endpoint perceive. I piani di conversione V1 non includono alcuna quota di lookup; serve un piano che includa V2.

Su una chiamata di lookup vengono addebitate due cose in modo indipendente:

Cosa fai Contatore consumato
Esegui una ricerca un lookup_queries
Auto-percepisci N URL dei risultati un perceive_operations per ogni URL effettivamente renderizzato

Quindi una chiamata con perceive_top: 3 consuma un lookup_queries e fino a tre perceive_operations. Se la tua quota perceive si esaurisce a metà del ciclo, la ricerca restituisce comunque — l'auto-perceive si ferma semplicemente al limite e lo annota in warnings, invece di far fallire l'intera richiesta.

Le quote per fascia per entrambi i contatori si trovano su la pagina dei prezzi; sono configurate per piano, non codificate in modo fisso nell'endpoint. (Al momento della scrittura, il piano Free predefinito porta 25 lookup_queries e 50 perceive_operations al mese.)


Risposte di errore

Il gestore non riporta mai al client il testo grezzo del provider — i dettagli del provider e di SSRF restano nei log del server, e il client riceve un messaggio pulito e generico.

Stato Condizione
401 Unauthorized Chiave API / token JWT mancante o non valido.
402 Payment Required Il lookup non è nel tuo piano attuale, oppure la tua quota mensile lookup_queries è esaurita.
403 Forbidden /v2/lookup non è negli endpoint consentiti della chiave API.
422 Unprocessable Entity La validazione della richiesta è fallita: query vuota/troppo lunga, una category o un time_filter sconosciuti, num_results o page fuori intervallo, perceive_top superiore a 10.
502 Bad Gateway Il provider di ricerca ha restituito una risposta di errore o un guasto di trasporto non ritentabile (SearchUpstreamError). Riprovare può aiutare.
503 Service Unavailable Il provider di ricerca è mal configurato lato server (una chiave mancante — colpa nostra, SearchConfigError), oppure è temporaneamente non disponibile: il circuit breaker è aperto, o il provider ci ha applicato un rate limit (SearchUnavailableError). Riprova più tardi.
500 Internal Server Error Un guasto inatteso. Il messaggio è generico; cita l'ora della chiamata al supporto.

Un auto-perceive fallito non solleva mai un errore proprio — finisce in warnings e la chiamata risponde comunque 200. Il riferimento completo dei codici di stato è in la guida ai codici di errore.


Limiti

Limite Valore
Lunghezza di query 1–512 caratteri (ripuliti)
Lunghezza di country 8 caratteri
Lunghezza di locale 16 caratteri
Lunghezza di location 128 caratteri
num_results 1–100
page 1–10
perceive_top 0–10
Output dell'auto-perceive Solo Markdown
Concorrenza dell'auto-perceive Sequenziale (un render alla volta)
Costo per ricerca 0,06 centesimi fisso
Scadenza dell'URL firmato della pagina percepita 15 minuti
lookup_queries mensili Dipendente dal piano (vedi prezzi)