curl --request POST \
--url https://helve.dev/v1/extract \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"urls": [
"https://arxiv.org/abs/2211.17192"
],
"query": "how does speculative decoding work",
"content": {
"excerpts": {
"max_per_url": 3
}
}
}
'import requests
url = "https://helve.dev/v1/extract"
payload = {
"urls": ["https://arxiv.org/abs/2211.17192"],
"query": "how does speculative decoding work",
"content": { "excerpts": { "max_per_url": 3 } }
}
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({
urls: ['https://arxiv.org/abs/2211.17192'],
query: 'how does speculative decoding work',
content: {excerpts: {max_per_url: 3}}
})
};
fetch('https://helve.dev/v1/extract', 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/extract",
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([
'urls' => [
'https://arxiv.org/abs/2211.17192'
],
'query' => 'how does speculative decoding work',
'content' => [
'excerpts' => [
'max_per_url' => 3
]
]
]),
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/extract"
payload := strings.NewReader("{\n \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\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/extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://helve.dev/v1/extract")
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 \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"provider": "exa",
"results": [
{
"url": "<string>",
"final_url": "<string>",
"title": "<string>",
"content": "<string>",
"excerpts": [
"<string>"
],
"summary": "<string>",
"published_date": "<string>",
"author": "<string>",
"links": [
"<string>"
],
"images": [
"<string>"
],
"raw": "<unknown>"
}
],
"failed": [
{
"url": "<string>",
"error": "<string>"
}
],
"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>"
}
}Extract page content
URLs in, clean content out. Returns the full page as markdown or text, and optionally focused excerpts and a summary when you pass a query. URLs the provider cannot fetch are listed in failed rather than failing the whole request.
curl --request POST \
--url https://helve.dev/v1/extract \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"urls": [
"https://arxiv.org/abs/2211.17192"
],
"query": "how does speculative decoding work",
"content": {
"excerpts": {
"max_per_url": 3
}
}
}
'import requests
url = "https://helve.dev/v1/extract"
payload = {
"urls": ["https://arxiv.org/abs/2211.17192"],
"query": "how does speculative decoding work",
"content": { "excerpts": { "max_per_url": 3 } }
}
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({
urls: ['https://arxiv.org/abs/2211.17192'],
query: 'how does speculative decoding work',
content: {excerpts: {max_per_url: 3}}
})
};
fetch('https://helve.dev/v1/extract', 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/extract",
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([
'urls' => [
'https://arxiv.org/abs/2211.17192'
],
'query' => 'how does speculative decoding work',
'content' => [
'excerpts' => [
'max_per_url' => 3
]
]
]),
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/extract"
payload := strings.NewReader("{\n \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\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/extract")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://helve.dev/v1/extract")
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 \"urls\": [\n \"https://arxiv.org/abs/2211.17192\"\n ],\n \"query\": \"how does speculative decoding work\",\n \"content\": {\n \"excerpts\": {\n \"max_per_url\": 3\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"provider": "exa",
"results": [
{
"url": "<string>",
"final_url": "<string>",
"title": "<string>",
"content": "<string>",
"excerpts": [
"<string>"
],
"summary": "<string>",
"published_date": "<string>",
"author": "<string>",
"links": [
"<string>"
],
"images": [
"<string>"
],
"raw": "<unknown>"
}
],
"failed": [
{
"url": "<string>",
"error": "<string>"
}
],
"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>"
}
}Authorizations
An API key from the dashboard, sk_live_…, sent as Authorization: Bearer sk_live_….
Body
The pages to extract, 1–20 absolute URLs. Providers that take one URL per call are fanned out by Helve.
1 - 20 elementsWhich provider fetches and cleans the pages. auto (default) picks the first configured provider in Helve's priority order. Brave and Perplexity have no extraction product.
exa, tavily, parallel, serper, firecrawl, linkup, valyu, jina, octen, auto What you are extracting for. Drives focused excerpts and summaries on providers that support them (Exa, Tavily, Parallel, Firecrawl, Valyu).
1What to return for each URL.
Show child attributes
Show child attributes
Return the page's outbound links in links. Native on Exa.
Return the page's image URLs in images. Native on Exa and Tavily.
Accept a cached copy up to this many hours old; 0 forces a live fetch. Native on Exa.
0 <= x <= 720Per-page fetch timeout in milliseconds, 1000–90000. Native on Exa and Tavily.
1000 <= x <= 90000When true, any parameter the serving provider cannot honour is a 400 instead of a warning. Default false.
Escape hatch for provider-native parameters, keyed by provider id and merged into that provider's request unchanged.
Show child attributes
Show child attributes
Response
Extracted content
Helve's id for this extraction, ext_….
The provider that served the request, resolved from auto.
exa, tavily, parallel, serper, firecrawl, linkup, valyu, jina, octen One entry per successfully extracted URL.
Show child attributes
Show child attributes
URLs the provider could not fetch, with its reason. Partial success is a 200.
Show child attributes
Show child attributes
How the request was adjusted for the serving provider. 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.