Хранилище
Список файлов
GET /api/v1/storage — постраничный список файлов хранилища с фильтрами
GET
/
api
/
v1
/
storage
Список файлов
curl --request GET \
--url https://speshu.ai/api/v1/storage \
--header 'Authorization: Bearer <token>'import requests
url = "https://speshu.ai/api/v1/storage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://speshu.ai/api/v1/storage', 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/storage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://speshu.ai/api/v1/storage"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://speshu.ai/api/v1/storage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://speshu.ai/api/v1/storage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"assets": [
{
"id": "<string>",
"filename": "<string>",
"url": "<string>",
"asset_type": "<string>",
"size": 123,
"mime_type": "<string>",
"created_at": "<string>",
"session_id": "<string>"
}
],
"total": 123
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request"
}
}Возвращает файлы вашего хранилища, от новых к старым. Есть фильтр по типу и полнотекстовый поиск по имени. Удалённые и архивные файлы в выдаче не появляются.
Допустимые значения
Пример
curl "https://speshu.ai/api/v1/storage?limit=20&type=chat_upload" \
-H "Authorization: Bearer $SPESHU_API_KEY"
import requests
response = requests.get(
"https://speshu.ai/api/v1/storage",
headers={"Authorization": "Bearer sk-ваш-ключ"},
params={"limit": 20, "type": "chat_upload", "search": "счёт"},
)
data = response.json()
print(data["total"], "всего")
for asset in data["assets"]:
print(asset["created_at"], asset["filename"], asset["url"])
Параметры
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
limit | integer | 50 | Сколько файлов вернуть. Максимум 100 |
offset | integer | 0 | Сколько файлов пропустить |
type | string | — | Фильтр по типу. Неизвестное значение молча игнорируется |
search | string | — | Полнотекстовый поиск по имени файла |
Пагинация — только
limit и offset. Ни page, ни totalPages, ни курсора здесь нет.type:
chat_upload, reference_image, generated_image, generated_video, generated_audio, generated_document, voice_message, avatar, invoice_pdf.
Осмысленны как типы загрузки только
chat_upload, reference_image и voice_message — это то, что создаёт эндпоинт загрузки. Остальные значения существуют в фильтре, но появляются из других источников: генерации медиа и служебных операций.Ответ
200 OK:
{
"assets": [
{
"id": "0199...",
"filename": "photo.png",
"url": "https://cdn.example.com/uploads/1/2026/10/02/0199....png",
"asset_type": "chat_upload",
"size": 245760,
"mime_type": "image/png",
"created_at": "2026-10-02T12:31:04Z",
"session_id": "sess_123"
}
],
"total": 1
}
| Поле | Тип | Описание |
|---|---|---|
assets | array | Файлы текущей страницы, от новых к старым |
assets[].id | string | Идентификатор файла |
assets[].filename | string | Имя файла |
assets[].url | string | Публичная ссылка на файл |
assets[].asset_type | string | Тип файла |
assets[].size | integer | Размер сохранённого файла в байтах |
assets[].mime_type | string | Тип сохранённого файла |
assets[].created_at | string | Дата и время в формате YYYY-MM-DDTHH:MM:SSZ |
assets[].session_id | string | Идентификатор сессии. Может отсутствовать |
total | integer | Сколько файлов подходит под фильтр по всем страницам |
total — это не длина текущей страницы. Это счётчик по всему фильтру, поэтому по нему можно посчитать число страниц: ceil(total / limit).session_id приходит не у всех файлов: у загруженных без него он пуст или отсутствует.Что дальше
Загрузить файл
Положить файл в хранилище
Метаданные файла
Один файл по идентификатору
Удалить файл
Убрать файл из хранилища
Ошибки
Полная таблица кодов
Авторизации
API-ключ в формате sk-.... Альтернативно — заголовок X-Api-Key: sk-... (совместимо с Anthropic SDK).
Параметры запроса
Требуемый диапазон:
1 <= x <= 100Требуемый диапазон:
x >= 0Фильтр по типу. Неизвестное значение игнорируется.
Доступные опции:
chat_upload, reference_image, generated_image, generated_video, generated_audio, generated_document, voice_message, avatar, invoice_pdf Полнотекстовый поиск по имени файла.
⌘I
Список файлов
curl --request GET \
--url https://speshu.ai/api/v1/storage \
--header 'Authorization: Bearer <token>'import requests
url = "https://speshu.ai/api/v1/storage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://speshu.ai/api/v1/storage', 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/storage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://speshu.ai/api/v1/storage"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://speshu.ai/api/v1/storage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://speshu.ai/api/v1/storage")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"assets": [
{
"id": "<string>",
"filename": "<string>",
"url": "<string>",
"asset_type": "<string>",
"size": 123,
"mime_type": "<string>",
"created_at": "<string>",
"session_id": "<string>"
}
],
"total": 123
}{
"error": {
"message": "<string>",
"type": "invalid_request_error",
"param": "<string>",
"code": "invalid_request"
}
}{
"error": {
"message": "<string>",
"type": "invalid_request"
}
}