{
"error": "error_brand_already_exists",
"localMessage": "Бренд Base уже существует",
"params": {
"name": "Base"
}
}Публичный API · Справочник API
Тестирование гипотез
Создание и изменение гипотез для проверки изменений в работе с товарами.
Методы для работы с гипотезами и анализа результатов.
/api/hypothesis
Модель данных
Структуры данных
Поля объектов, которые используются в запросах и ответах этого раздела.
Hypothesis14 полей
idinteger · int32Поле id.
namestringНазвание гипотезы
previousStartDatestring · date-timeНачало предыдущего периода для сравнения
startDatestring · date-timeДата начала гипотезы
endDatestring · date-timeДата окончания гипотезы
modelIdinteger · int64Модель, в которой создана гипотеза
modelArticlestringАртикул модели, в которой создана гипотеза
viewIdinteger · int64Идентификатор цвета
productIdinteger · int64Идентификатор товара
organizationIdinteger · int64Идентификатор организации
createdDatestring · date-timeДата создания
createdUserstringЛогин пользователя, создавшего гипотезу
servicestringМаркетплейс, на котором проверяем гипотезу
successStatusstringСтатус
FindResponseHypothesis1 полей
rowsHypothesis[]Строки с результатом поиска
Ошибки
Обработка ошибок
При ошибке API возвращает её код в поле error и сообщение на языке пользователя в localMessage. Проверяйте код error в программе, а localMessage показывайте пользователю.
errorКод ошибки для обработки в программе.
localMessageСообщение на языке пользователя, которому принадлежит токен.
paramsЗначения, которые сервер подставил в сообщение об ошибке.
Язык localMessage определяется полем lang пользователя, которому принадлежит API-токен. Язык страницы документации и заголовок Accept-Language его не переключают; если язык пользователя не указан, используется русский.
{
"error": "error_brand_already_exists",
"localMessage": "Brand Base already exists",
"params": {
"name": "Base"
}
}Методы
Методы
Создать гипотезу
/api/hypothesis/Позволяет создать новую гипотезу
Тело запроса
application/jsonПоля объектаHypothesis
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
curl --request POST 'https://api.selsup.ru/api/hypothesis/' \
--header 'Authorization: YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}'
const response = await fetch('https://api.selsup.ru/api/hypothesis/', {
method: 'POST',
headers: {
Authorization: process.env.SELSUP_API_TOKEN,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'selsup_request_failed');
}
const result = await response.json();
const response: Response = await fetch('https://api.selsup.ru/api/hypothesis/', {
method: 'POST',
headers: {
Authorization: process.env.SELSUP_API_TOKEN!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}),
});
if (!response.ok) {
const error = await response.json() as { error?: string };
throw new Error(error.error ?? 'selsup_request_failed');
}
const result: unknown = await response.json();
import os
import requests
response = requests.post(
'https://api.selsup.ru/api/hypothesis/',
headers={'Authorization': os.environ['SELSUP_API_TOKEN']},
json={
'id': 1001,
'name': 'Example',
'previousStartDate': '2026-01-15T12:00:00Z',
'startDate': '2026-01-15T12:00:00Z',
'endDate': '2026-01-15T12:00:00Z',
'modelId': 1001
},
)
response.raise_for_status()
result = response.json()
<?php
$payload = <<<'JSON'
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}
JSON;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.selsup.ru/api/hypothesis/',
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: ' . getenv('SELSUP_API_TOKEN'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status >= 400) {
throw new RuntimeException($response ?: 'selsup_request_failed');
}
echo $response;
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
req, err := http.NewRequest("POST", "https://api.selsup.ru/api/hypothesis/", strings.NewReader(`{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}`))
if err != nil { panic(err) }
req.Header.Set("Authorization", os.Getenv("SELSUP_API_TOKEN"))
req.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer response.Body.Close()
result, _ := io.ReadAll(response.Body)
fmt.Printf("%d\n%s\n", response.StatusCode, result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class SelSupExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.selsup.ru/api/hypothesis/"))
.header("Authorization", System.getenv("SELSUP_API_TOKEN"))
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("""
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}
"""))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
Успешный ответ
200
Поля объекта
Hypothesis
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}Ошибки9
При ошибке проверьте HTTP-статус и тело ответа. Поле error содержит код ошибки, localMessage — сообщение для пользователя, params — дополнительные сведения. Обработка ошибок ↑
auth_requiredЗаголовок Authorization отсутствует, пуст или содержит недействительный токен.
error_access_deniedТокен существует, но его роль не позволяет выполнить операцию.
error_unknownНе удалось выполнить запрос из-за внутренней ошибки. Если запрос изменял данные, проверьте результат перед повторной отправкой. Для обращения в поддержку сохраните время запроса и полученный ответ.
error_cant_extract_tariffsПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_cant_extract_tariffs; localMessage содержит приведённый выше перевод.
error_empty_end_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_end_date; localMessage содержит приведённый выше перевод.
error_empty_nameПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_name; localMessage содержит приведённый выше перевод.
error_empty_start_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_start_date; localMessage содержит приведённый выше перевод.
error_end_less_then_start_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_end_less_then_start_date; localMessage содержит приведённый выше перевод.
error_no_clientПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_no_client; localMessage содержит приведённый выше перевод.
Получить гипотезу
/api/hypothesis/{id}Позволяет получить гипотезу по ID
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Да | Поле id. |
curl --request GET 'https://api.selsup.ru/api/hypothesis/1001' \
--header 'Authorization: YOUR_API_TOKEN'
const response = await fetch('https://api.selsup.ru/api/hypothesis/1001', {
method: 'GET',
headers: { Authorization: process.env.SELSUP_API_TOKEN },
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'selsup_request_failed');
}
const result = await response.json();
const response: Response = await fetch('https://api.selsup.ru/api/hypothesis/1001', {
method: 'GET',
headers: { Authorization: process.env.SELSUP_API_TOKEN! },
});
if (!response.ok) {
const error = await response.json() as { error?: string };
throw new Error(error.error ?? 'selsup_request_failed');
}
const result: unknown = await response.json();
import os
import requests
response = requests.get(
'https://api.selsup.ru/api/hypothesis/1001',
headers={'Authorization': os.environ['SELSUP_API_TOKEN']},
)
response.raise_for_status()
result = response.json()
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.selsup.ru/api/hypothesis/1001',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: ' . getenv('SELSUP_API_TOKEN')],
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status >= 400) {
throw new RuntimeException($response ?: 'selsup_request_failed');
}
echo $response;
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.selsup.ru/api/hypothesis/1001", nil)
if err != nil { panic(err) }
req.Header.Set("Authorization", os.Getenv("SELSUP_API_TOKEN"))
response, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer response.Body.Close()
result, _ := io.ReadAll(response.Body)
fmt.Printf("%d\n%s\n", response.StatusCode, result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class SelSupExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.selsup.ru/api/hypothesis/1001"))
.header("Authorization", System.getenv("SELSUP_API_TOKEN"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
Успешный ответ
200
Поля объекта
Hypothesis
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}Ошибки5
При ошибке проверьте HTTP-статус и тело ответа. Поле error содержит код ошибки, localMessage — сообщение для пользователя, params — дополнительные сведения. Обработка ошибок ↑
auth_requiredЗаголовок Authorization отсутствует, пуст или содержит недействительный токен.
error_access_deniedТокен существует, но его роль не позволяет выполнить операцию.
error_unknownНе удалось выполнить запрос из-за внутренней ошибки. Если запрос изменял данные, проверьте результат перед повторной отправкой. Для обращения в поддержку сохраните время запроса и полученный ответ.
error_cant_extract_tariffsПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_cant_extract_tariffs; localMessage содержит приведённый выше перевод.
error_no_clientПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_no_client; localMessage содержит приведённый выше перевод.
Изменить гипотезу
/api/hypothesis/{id}Позволяет изменить гипотезу
Тело запроса
application/jsonПоля объектаHypothesis
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
curl --request PATCH 'https://api.selsup.ru/api/hypothesis/%7Bid%7D' \
--header 'Authorization: YOUR_API_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}'
const response = await fetch('https://api.selsup.ru/api/hypothesis/%7Bid%7D', {
method: 'PATCH',
headers: {
Authorization: process.env.SELSUP_API_TOKEN,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}),
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'selsup_request_failed');
}
const result = await response.json();
const response: Response = await fetch('https://api.selsup.ru/api/hypothesis/%7Bid%7D', {
method: 'PATCH',
headers: {
Authorization: process.env.SELSUP_API_TOKEN!,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}),
});
if (!response.ok) {
const error = await response.json() as { error?: string };
throw new Error(error.error ?? 'selsup_request_failed');
}
const result: unknown = await response.json();
import os
import requests
response = requests.patch(
'https://api.selsup.ru/api/hypothesis/%7Bid%7D',
headers={'Authorization': os.environ['SELSUP_API_TOKEN']},
json={
'id': 1001,
'name': 'Example',
'previousStartDate': '2026-01-15T12:00:00Z',
'startDate': '2026-01-15T12:00:00Z',
'endDate': '2026-01-15T12:00:00Z',
'modelId': 1001
},
)
response.raise_for_status()
result = response.json()
<?php
$payload = <<<'JSON'
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}
JSON;
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.selsup.ru/api/hypothesis/%7Bid%7D',
CURLOPT_CUSTOMREQUEST => 'PATCH',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: ' . getenv('SELSUP_API_TOKEN'), 'Content-Type: application/json'],
CURLOPT_POSTFIELDS => $payload,
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status >= 400) {
throw new RuntimeException($response ?: 'selsup_request_failed');
}
echo $response;
package main
import (
"fmt"
"io"
"net/http"
"os"
"strings"
)
func main() {
req, err := http.NewRequest("PATCH", "https://api.selsup.ru/api/hypothesis/%7Bid%7D", strings.NewReader(`{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}`))
if err != nil { panic(err) }
req.Header.Set("Authorization", os.Getenv("SELSUP_API_TOKEN"))
req.Header.Set("Content-Type", "application/json")
response, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer response.Body.Close()
result, _ := io.ReadAll(response.Body)
fmt.Printf("%d\n%s\n", response.StatusCode, result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class SelSupExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.selsup.ru/api/hypothesis/%7Bid%7D"))
.header("Authorization", System.getenv("SELSUP_API_TOKEN"))
.header("Content-Type", "application/json")
.method("PATCH", HttpRequest.BodyPublishers.ofString("""
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}
"""))
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
Успешный ответ
200
Поля объекта
Hypothesis
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
{
"id": 1001,
"name": "Example",
"previousStartDate": "2026-01-15T12:00:00Z",
"startDate": "2026-01-15T12:00:00Z",
"endDate": "2026-01-15T12:00:00Z",
"modelId": 1001
}Ошибки10
При ошибке проверьте HTTP-статус и тело ответа. Поле error содержит код ошибки, localMessage — сообщение для пользователя, params — дополнительные сведения. Обработка ошибок ↑
auth_requiredЗаголовок Authorization отсутствует, пуст или содержит недействительный токен.
error_access_deniedТокен существует, но его роль не позволяет выполнить операцию.
error_unknownНе удалось выполнить запрос из-за внутренней ошибки. Если запрос изменял данные, проверьте результат перед повторной отправкой. Для обращения в поддержку сохраните время запроса и полученный ответ.
error_cant_extract_tariffsПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_cant_extract_tariffs; localMessage содержит приведённый выше перевод.
error_empty_end_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_end_date; localMessage содержит приведённый выше перевод.
error_empty_idПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_id; localMessage содержит приведённый выше перевод.
error_empty_nameПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_name; localMessage содержит приведённый выше перевод.
error_empty_start_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_empty_start_date; localMessage содержит приведённый выше перевод.
error_end_less_then_start_dateПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_end_less_then_start_date; localMessage содержит приведённый выше перевод.
error_no_clientПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_no_client; localMessage содержит приведённый выше перевод.
Удалить гипотезу
/api/hypothesis/{id}Позволяет удалить гипотезу
Параметры пути
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Да | Поле id. |
curl --request DELETE 'https://api.selsup.ru/api/hypothesis/1001' \
--header 'Authorization: YOUR_API_TOKEN'
const response = await fetch('https://api.selsup.ru/api/hypothesis/1001', {
method: 'DELETE',
headers: { Authorization: process.env.SELSUP_API_TOKEN },
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'selsup_request_failed');
}
const response: Response = await fetch('https://api.selsup.ru/api/hypothesis/1001', {
method: 'DELETE',
headers: { Authorization: process.env.SELSUP_API_TOKEN! },
});
if (!response.ok) {
const error = await response.json() as { error?: string };
throw new Error(error.error ?? 'selsup_request_failed');
}
import os
import requests
response = requests.delete(
'https://api.selsup.ru/api/hypothesis/1001',
headers={'Authorization': os.environ['SELSUP_API_TOKEN']},
)
response.raise_for_status()
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.selsup.ru/api/hypothesis/1001',
CURLOPT_CUSTOMREQUEST => 'DELETE',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: ' . getenv('SELSUP_API_TOKEN')],
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status >= 400) {
throw new RuntimeException($response ?: 'selsup_request_failed');
}
echo $response;
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("DELETE", "https://api.selsup.ru/api/hypothesis/1001", nil)
if err != nil { panic(err) }
req.Header.Set("Authorization", os.Getenv("SELSUP_API_TOKEN"))
response, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer response.Body.Close()
result, _ := io.ReadAll(response.Body)
fmt.Printf("%d\n%s\n", response.StatusCode, result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class SelSupExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.selsup.ru/api/hypothesis/1001"))
.header("Authorization", System.getenv("SELSUP_API_TOKEN"))
.method("DELETE", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
Успешный ответ
200Тело ответа пустое.
Ошибки5
При ошибке проверьте HTTP-статус и тело ответа. Поле error содержит код ошибки, localMessage — сообщение для пользователя, params — дополнительные сведения. Обработка ошибок ↑
auth_requiredЗаголовок Authorization отсутствует, пуст или содержит недействительный токен.
error_access_deniedТокен существует, но его роль не позволяет выполнить операцию.
error_unknownНе удалось выполнить запрос из-за внутренней ошибки. Если запрос изменял данные, проверьте результат перед повторной отправкой. Для обращения в поддержку сохраните время запроса и полученный ответ.
error_cant_extract_tariffsПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_cant_extract_tariffs; localMessage содержит приведённый выше перевод.
error_no_clientПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_no_client; localMessage содержит приведённый выше перевод.
Поиск гипотез
/api/hypothesis/findПозволяет получить список гипотез
Параметры запроса
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
query |
string | Нет | Поле query. |
modelId |
integer · int64 | Нет | Поле modelId. |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Сервис |
endDateFrom |
string · date-time | Нет | Поле endDateFrom. |
endDateTo |
string · date-time | Нет | Поле endDateTo. |
limit |
integer · int32 | Нет | Ограничение на количество записей. Максимальное значение - 500 |
page |
integer · int32 | Нет | Номер страницы начиная с 1 |
count |
boolean | Нет | Возвратить в ответе общее количество записей |
sortBy |
stringID, NAME, CREATEDDATE, CREATEDUSER, STARTDATE, ENDDATE, PREVIOUSSTARTDATE, SUCCESSSTATUS | Нет | Поле для сортировки |
ascending |
boolean | Нет | Порядок сортировки - по возрастанию?. Работает только при получении списка. |
curl --request GET 'https://api.selsup.ru/api/hypothesis/find?limit=50&page=1' \
--header 'Authorization: YOUR_API_TOKEN'
const response = await fetch('https://api.selsup.ru/api/hypothesis/find?limit=50&page=1', {
method: 'GET',
headers: { Authorization: process.env.SELSUP_API_TOKEN },
});
if (!response.ok) {
const error = await response.json();
throw new Error(error.error || 'selsup_request_failed');
}
const result = await response.json();
const response: Response = await fetch('https://api.selsup.ru/api/hypothesis/find?limit=50&page=1', {
method: 'GET',
headers: { Authorization: process.env.SELSUP_API_TOKEN! },
});
if (!response.ok) {
const error = await response.json() as { error?: string };
throw new Error(error.error ?? 'selsup_request_failed');
}
const result: unknown = await response.json();
import os
import requests
response = requests.get(
'https://api.selsup.ru/api/hypothesis/find?limit=50&page=1',
headers={'Authorization': os.environ['SELSUP_API_TOKEN']},
)
response.raise_for_status()
result = response.json()
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.selsup.ru/api/hypothesis/find?limit=50&page=1',
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Authorization: ' . getenv('SELSUP_API_TOKEN')],
]);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
curl_close($curl);
if ($response === false || $status >= 400) {
throw new RuntimeException($response ?: 'selsup_request_failed');
}
echo $response;
package main
import (
"fmt"
"io"
"net/http"
"os"
)
func main() {
req, err := http.NewRequest("GET", "https://api.selsup.ru/api/hypothesis/find?limit=50&page=1", nil)
if err != nil { panic(err) }
req.Header.Set("Authorization", os.Getenv("SELSUP_API_TOKEN"))
response, err := http.DefaultClient.Do(req)
if err != nil { panic(err) }
defer response.Body.Close()
result, _ := io.ReadAll(response.Body)
fmt.Printf("%d\n%s\n", response.StatusCode, result)
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class SelSupExample {
public static void main(String[] args) throws Exception {
HttpRequest request = HttpRequest.newBuilder(URI.create("https://api.selsup.ru/api/hypothesis/find?limit=50&page=1"))
.header("Authorization", System.getenv("SELSUP_API_TOKEN"))
.method("GET", HttpRequest.BodyPublishers.noBody())
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
}
}
Успешный ответ
200
Поля объекта
FindResponseHypothesis
| Поле | Тип | Обязательно | Описание | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
rows |
Hypothesis[] | Нет | Строки с результатом поиска | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Структура элемента массива
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
id |
integer · int32 | Нет | Поле id. |
name |
string | Нет | Название гипотезы |
previousStartDate |
string · date-time | Нет | Начало предыдущего периода для сравнения |
startDate |
string · date-time | Нет | Дата начала гипотезы |
endDate |
string · date-time | Нет | Дата окончания гипотезы |
modelId |
integer · int64 | Нет | Модель, в которой создана гипотеза |
modelArticle |
string | Нет | Артикул модели, в которой создана гипотеза |
viewId |
integer · int64 | Нет | Идентификатор цвета |
productId |
integer · int64 | Нет | Идентификатор товара |
organizationId |
integer · int64 | Нет | Идентификатор организации |
createdDate |
string · date-time | Нет | Дата создания |
createdUser |
string | Нет | Логин пользователя, создавшего гипотезу |
service |
stringNONE, WILDBERRIES, OZON, YANDEX_MARKET, FAMILIYA, NATIONAL_CATALOG, ALIEXPRESS, OTHER, MOY_SKLAD, SBER_MEGA_MARKET, CISLINK, ONE_C, AVITO, LEROY_MERLIN, DETMIR, KAZAN_EXPRESS, EVOTOR, WEBASYST, AMAZON, EBAY, SIMALAND, INSALES, LAMODA, OZON_PERFORMANCE, WALMART, GOOGLE, YANDEX_DISC, EMAIL, WOOCOMMERCE, MAGNIT, OPENCART, M_VIDEO, TAKEALOT, UZUM, SHOPIFY, MAKRO, YANDEX_KIT, BOB_SHOP, KASPI, DIADOC, TEKSHER, KONTUR_LOGISTICS, KONTUR_EDI, VSE_INSTRUMENTI, ELECTRONIC_SIGN | Нет | Маркетплейс, на котором проверяем гипотезу |
successStatus |
stringNONE, SUCCESSFUL, UNSUCCESSFUL | Нет | Статус |
{
"rows": "string"
}Ошибки5
При ошибке проверьте HTTP-статус и тело ответа. Поле error содержит код ошибки, localMessage — сообщение для пользователя, params — дополнительные сведения. Обработка ошибок ↑
auth_requiredЗаголовок Authorization отсутствует, пуст или содержит недействительный токен.
error_access_deniedТокен существует, но его роль не позволяет выполнить операцию.
error_unknownНе удалось выполнить запрос из-за внутренней ошибки. Если запрос изменял данные, проверьте результат перед повторной отправкой. Для обращения в поддержку сохраните время запроса и полученный ответ.
error_cant_extract_tariffsПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_cant_extract_tariffs; localMessage содержит приведённый выше перевод.
error_no_clientПерсональная ошибка этого метода. Для программной логики используйте стабильный код error_no_client; localMessage содержит приведённый выше перевод.