curl --request POST \
--url https://helve.dev/v1/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "latest research on speculative decoding",
"provider": "fusion",
"max_results": 5,
"freshness": "month"
}
'import requests
url = "https://helve.dev/v1/search"
payload = {
"query": "latest research on speculative decoding",
"provider": "fusion",
"max_results": 5,
"freshness": "month"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'latest research on speculative decoding',
provider: 'fusion',
max_results: 5,
freshness: 'month'
})
};
fetch('https://helve.dev/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://helve.dev/v1/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'latest research on speculative decoding',
'provider' => 'fusion',
'max_results' => 5,
'freshness' => 'month'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://helve.dev/v1/search"
payload := strings.NewReader("{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://helve.dev/v1/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://helve.dev/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"provider": "exa",
"results": [
{
"id": "<string>",
"url": "<string>",
"title": "<string>",
"snippets": [
"<string>"
],
"score_synthesized": true,
"full_text": "<string>",
"summary": "<string>",
"score": 123,
"published_date": "<string>",
"author": "<string>",
"raw": "<unknown>"
}
],
"warnings": [
{
"code": "param_ignored",
"message": "<string>",
"param": "<string>"
}
],
"usage": {
"cost_usd": 123,
"credits": 123
},
"latency_ms": 123
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}Search the web
One request shape across every search engine Helve fronts. Pick an engine with provider, leave it on auto, or set fusion to merge a panel’s top picks. Parameters the serving engine cannot express are approximated or dropped and reported in warnings; set strict to make that an error instead. The response always includes what the request cost.
curl --request POST \
--url https://helve.dev/v1/search \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "latest research on speculative decoding",
"provider": "fusion",
"max_results": 5,
"freshness": "month"
}
'import requests
url = "https://helve.dev/v1/search"
payload = {
"query": "latest research on speculative decoding",
"provider": "fusion",
"max_results": 5,
"freshness": "month"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: 'latest research on speculative decoding',
provider: 'fusion',
max_results: 5,
freshness: 'month'
})
};
fetch('https://helve.dev/v1/search', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://helve.dev/v1/search",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => 'latest research on speculative decoding',
'provider' => 'fusion',
'max_results' => 5,
'freshness' => 'month'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://helve.dev/v1/search"
payload := strings.NewReader("{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://helve.dev/v1/search")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://helve.dev/v1/search")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"latest research on speculative decoding\",\n \"provider\": \"fusion\",\n \"max_results\": 5,\n \"freshness\": \"month\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"provider": "exa",
"results": [
{
"id": "<string>",
"url": "<string>",
"title": "<string>",
"snippets": [
"<string>"
],
"score_synthesized": true,
"full_text": "<string>",
"summary": "<string>",
"score": 123,
"published_date": "<string>",
"author": "<string>",
"raw": "<unknown>"
}
],
"warnings": [
{
"code": "param_ignored",
"message": "<string>",
"param": "<string>"
}
],
"usage": {
"cost_usd": 123,
"credits": 123
},
"latency_ms": 123
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}{
"error": {
"type": "unauthorized",
"message": "<string>",
"detail": "<unknown>"
}
}Authorizations
An API key from the dashboard, sk_live_…, sent as Authorization: Bearer sk_live_….
Body
What to search for, in natural language. Keyword engines (Brave, Serper) receive it as typed; neural engines (Exa, Parallel) interpret it semantically.
1Which engine serves the request. auto (default) picks the first configured provider in Helve's priority order. fusion fans out to a panel of engines and merges their top picks by consensus; see the Fusion guide.
exa, parallel, tavily, brave, serper, firecrawl, linkup, valyu, jina, octen, perplexity, auto, fusion Number of results to return, 1–100. Default 10. Engines with a lower ceiling (Tavily and Brave stop at 20) are capped with a param_approximated warning. With fusion this sizes each member's list, not the merged one.
1 <= x <= 100Speed/quality trade-off, mapped to each engine's tiers (Exa instant/fast/auto/deep, Parallel turbo/fast/basic/advanced, Tavily ultra-fast/fast/basic/advanced). Single-tier engines ignore it with a warning. Default: the engine's own default tier.
instant, fast, balanced, deep Only return pages from these domains. Native on most engines; rewritten into site: operators on Brave and Serper.
1Never return pages from these domains. Native on most engines; rewritten into -site: operators on Brave and Serper.
1Only pages published on or after this date, YYYY-MM-DD. Mutually exclusive with freshness.
^\d{4}-\d{2}-\d{2}$Only pages published on or before this date, YYYY-MM-DD. Mutually exclusive with freshness.
^\d{4}-\d{2}-\d{2}$Shorthand for a rolling publication window ending now. Mutually exclusive with published_after / published_before.
day, week, month, year What text to return for each result. Every engine returns snippets; full text and summaries depend on the engine.
Show child attributes
Show child attributes
Bias results toward a country and language. Native on Brave, Serper, and Tavily.
Show child attributes
Show child attributes
Content category. news maps to the engine's news index where one exists; company, people, and research are native on Exa and approximated elsewhere.
general, news, company, people, research Adult-content filtering. Native on Brave and Serper; ignored with a warning elsewhere.
off, moderate, strict Skip this many results for pagination. Native on Brave and Serper only; other engines ignore it with a warning.
x >= 0When true, any parameter the serving engine cannot honour is a 400 instead of a warning. Not allowed with fusion. Default false.
Escape hatch for provider-native parameters. Each key is a provider id; its value is merged into that provider's request unchanged. Helve never inspects these, except fusion, which is Helve's own and typed.
Show child attributes
Show child attributes
Response
Search results
Helve's id for this search, srch_….
The engine that served the request, resolved from auto, or fusion.
exa, parallel, tavily, brave, serper, firecrawl, linkup, valyu, jina, octen, perplexity, fusion Show child attributes
Show child attributes
How the request was adjusted for the serving engine. Empty when it was honoured exactly.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Wall-clock time Helve spent on the request. With fusion, roughly the slowest member.