Инструменты
Загрузка страницы
POST /api/v1/tools/fetch — текст страницы по ссылке
POST
/
api
/
v1
/
tools
/
fetch
Загрузка страницы
curl --request POST \
--url https://speshu.ai/api/v1/tools/fetch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>"
}
'import requests
url = "https://speshu.ai/api/v1/tools/fetch"
payload = { "url": "<string>" }
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({url: '<string>'})
};
fetch('https://speshu.ai/api/v1/tools/fetch', 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://speshu.ai/api/v1/tools/fetch",
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([
'url' => '<string>'
]),
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://speshu.ai/api/v1/tools/fetch"
payload := strings.NewReader("{\n \"url\": \"<string>\"\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://speshu.ai/api/v1/tools/fetch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://speshu.ai/api/v1/tools/fetch")
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 \"url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"title": "<string>",
"content": "<string>",
"usage": {
"cost": 123
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}Эндпоинт загружает страницу по ссылке и возвращает её заголовок и текст в Markdown. Типичное применение — второй этап поиска: вы нашли страницу в выдаче и хотите прочитать её целиком, а не по выдержке.
Текст приходит в Markdown: заголовки, списки и таблицы сохраняются. Если у страницы нет пригодного содержимого, придёт
Ошибки приходят в конверте OpenAI — объект
Минимальный запрос
cURL
curl https://speshu.ai/api/v1/tools/fetch \
-H "Authorization: Bearer $SPESHU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/article"}'
Ключ передаётся заголовком
Authorization: Bearer sk-.... Он создаётся в личном кабинете и показывается один раз — подробности на странице Аутентификация.Поля запроса
| Поле | Тип | Описание |
|---|---|---|
url | string | Адрес страницы. Обязательно; до 8192 символов |
Какие адреса принимаются
- Схема адреса —
httpилиhttps. Другие схемы отклоняются. - Адрес должен быть абсолютным и содержать хост.
- Логин и пароль в адресе не допускаются.
- Адрес не должен вести во внутреннюю сеть: приватный диапазон, loopback и link-local отклоняются с
403 url_not_allowed.
http допускается.
Внутренние адреса отклоняются всегда, в том числе
127.0.0.1 и localhost. Через эндпоинт нельзя достать до внутренних адресов платформы.Ответ
200 OK:
{
"title": "Возврат товара",
"content": "# Возврат товара\n\nВернуть товар можно в течение 14 дней...",
"usage": {
"cost": 0.0002
}
}
| Поле | Тип | Описание |
|---|---|---|
title | string | Заголовок страницы |
content | string | Текст страницы в Markdown |
usage | object | Расход по вызову. Объект есть всегда, в каждом ответе |
usage.cost | number | Сумма, списанная с вашего баланса за вызов. Поле отсутствует, если списание не зафиксировано |
404 not_found.
Стоимость
Стоимость зависит от объёма загрузки. Полеusage.cost — сумма, списанная с вашего баланса; оно отсутствует, если списание не зафиксировано.
Фактический остаток после вызова проверяйте через GET /api/v1/balance.
Проверки перед вызовом
| Ситуация | Ответ |
|---|---|
| Нет ключа или ключ недействителен | 401 invalid_api_key |
| Не хватает денег | 402 insufficient_quota |
Нет url, пустой url, url длиннее 8192 символов, схема адреса не http и не https, нет хоста, в адресе есть логин и пароль | 400 invalid_request |
| Адрес ведёт на приватный, loopback или link-local адрес | 403 url_not_allowed |
| На странице нет пригодного текста | 404 not_found |
| Превышен лимит запросов в минуту | 429 rate_limit_exceeded |
| Превышен лимит потребления в минуту | 429 token_limit_exceeded |
| Загрузка недоступна | 503 service_unavailable |
| Загрузка страницы вернула ошибку | 502 upstream_error |
error с полями message, type, param и code. Полная таблица кодов — на странице Ошибки.
Что дальше
Поиск в интернете
Поиск страниц по текстовому запросу
Баланс
Остаток кошелька по валютам
Ошибки
Полная таблица кодов
Ранжирование
Второй этап отбора документов
Авторизации
API-ключ в формате sk-.... Альтернативно — заголовок X-Api-Key: sk-... (совместимо с Anthropic SDK).
Тело
application/json
Адрес страницы. Обязательно; до 8192 символов. Схема — http или https, хост обязателен, логин и пароль в адресе не допускаются.
Maximum string length:
8192⌘I
Загрузка страницы
curl --request POST \
--url https://speshu.ai/api/v1/tools/fetch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"url": "<string>"
}
'import requests
url = "https://speshu.ai/api/v1/tools/fetch"
payload = { "url": "<string>" }
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({url: '<string>'})
};
fetch('https://speshu.ai/api/v1/tools/fetch', 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://speshu.ai/api/v1/tools/fetch",
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([
'url' => '<string>'
]),
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://speshu.ai/api/v1/tools/fetch"
payload := strings.NewReader("{\n \"url\": \"<string>\"\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://speshu.ai/api/v1/tools/fetch")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"url\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://speshu.ai/api/v1/tools/fetch")
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 \"url\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"title": "<string>",
"content": "<string>",
"usage": {
"cost": 123
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}