OAuth

Список всех доступных методов для взаимодействия с API.

POST

Зарегистрировать клиента (RFC 7591)

Новое/oauth/register

Регистрация клиента

Динамическая регистрация клиентов (RFC 7591) для общедоступных клиентов, таких как приложения MCP и интерфейсы командной строки (CLI). Секретный ключ не выдается — каждый клиент использует PKCE.

Примечания

  • redirect_uris должен быть https или http на 127.0.0.1 / localhost (любой порт) для приложений на компьютере пользователя.
  • Самостоятельно зарегистрированные клиенты отображаются на странице согласия как «непроверенные»; сотрудники StableProxy могут проверить клиента.

Способ запроса

POSThttps://api.stableproxy.com/v3/oauth/register

Параметры запроса

ИдентификаторПравилаПример
client_namerequiredstring75
redirect_urisrequiredarray[]
logo_uriНе обязательноnullableurlnull
token_endpoint_auth_methodНе обязательноnullablein:none"none"

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/register", {
3 method: "POST",
4 headers: {
5 "Content-Type": "application/json"
6 },
7 body: JSON.stringify({
8 "client_name": 75,
9 "redirect_uris": "[]",
10 "logo_uri": "null",
11 "token_endpoint_auth_method": "\"none\""
12 })
13});
14const data = await response.json();

Примеры ответов

Client created201application/json
{
  "client_id": "3f6c2a0e-8b1d-4c6f-9a77-1d2e3f4a5b6c",
  "client_name": "My scraper",
  "redirect_uris": [
    "http://127.0.0.1:53682/callback"
  ],
  "token_endpoint_auth_method": "none",
  "grant_types": [
    "authorization_code",
    "refresh_token"
  ],
  "response_types": [
    "code"
  ]
}
GET

Описание текущего токена

Новое/oauth/token-info

Описание текущего токена

Кто и что представляет собой токен-носитель: пользователь, кому приписываются его заказы (source), его права, области OAuth и аудитория, а также включена ли функция автоматических покупок.

Примечания

  • 401 возвращается, если токен отсутствует, его срок действия истек или он был отозван — используйте этот код для проверки токена перед вызовом других методов.
Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

GEThttps://api.stableproxy.com/v3/oauth/token-info

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/token-info", {
3 method: "GET",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();

Примеры ответов

OAuth token200application/json
{
  "data": {
    "user_id": 2527,
    "source": "oauth:3f6c2a0e-8b1d-4c6f-9a77-1d2e3f4a5b6c",
    "abilities": [
      "cart.purchase",
      "packages.update"
    ],
    "scopes": [
      "orders:create",
      "offline_access"
    ],
    "audience": "https://mcp.stableproxy.com",
    "expires_at": "2026-10-06T17:00:00Z",
    "auto_confirm": false
  },
  "meta": []
}
No token401application/json
{
  "error": {
    "code": "unauthenticated",
    "message": "Sign in or send a valid token.",
    "details": []
  }
}
GET

Начать авторизацию (code + PKCE S256)

Новое/oauth/authorize

Начать авторизацию

Перенаправляет браузер пользователя на страницу согласия StableProxy. Алгоритм авторизации с использованием кода авторизации только с PKCE S256.

Примечания

  • Обязательные параметры: response_type=code, client_id, redirect_uri (точно так, как зарегистрировано), code_challenge, code_challenge_method=S256, scope, state.
  • Области доступа: account:read, packages:read, proxies:manage, packages:manage, orders:create, payments:create, promos:manage, referrals:manage, offline_access.
  • После предоставления согласия пользователь возвращается на redirect_uri?code=…&state=…&iss=…; неизвестному клиенту или при попытке перенаправления выводится сообщение об ошибке, и перенаправление не происходит.

Способ запроса

GEThttps://api.stableproxy.com/v3/oauth/authorize

Параметры запроса

ИдентификаторПравилаПример
response_typerequiredin:code"code"
client_idrequireduuid20
redirect_urirequiredstring""
scoperequiredstring""
stateНе обязательноnullablestring""
code_challengerequiredstring""
code_challenge_methodrequiredin:_s256"_s256"
resourceНе обязательноnullableurlnull

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/authorize", {
3 method: "GET",
4 headers: {
5 "Content-Type": "application/json"
6 }
7});
8const data = await response.json();
GET

Запрос доступа для страницы согласия

Новое/oauth/request/{id}
Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

GEThttps://api.stableproxy.com/v3/oauth/request/{id}

Параметры запроса

ИдентификаторПравилаПример
id1required36

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/request/{id}", {
3 method: "GET",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();
POST

Разрешить или отклонить доступ

Новое/oauth/decision
Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

POSThttps://api.stableproxy.com/v3/oauth/decision

Параметры запроса

ИдентификаторПравилаПример
requestrequiredstring""
approverequiredbooleanfalse
spend_limit_usd_dayНе обязательноnullablenumeric0
auto_confirmНе обязательноsometimesbooleanfalse

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/decision", {
3 method: "POST",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 },
8 body: JSON.stringify({
9 "request": "\"\"",
10 "approve": "false",
11 "spend_limit_usd_day": "0",
12 "auto_confirm": "false"
13 })
14});
15const data = await response.json();
POST

Обменять код или refresh-токен на токен доступа

Новое/oauth/token

Обмен кодом или токеном обновления

application/x-www-form-urlencoded, ошибки по RFC 6749 (invalid_grant, invalid_client, …).

Примечания

  • grant_type=authorization_code с code, client_id, redirect_uri, code_verifier.
  • grant_type=refresh_token с refresh_token, client_id; токены обновления меняются — используйте только самый новый. Повторное использование старого токена приводит к аннулированию всего подключения.
  • Токены доступа действительны в течение 1 часа. Токен обновления выдается только с областью действия offline_access.

Способ запроса

POSThttps://api.stableproxy.com/v3/oauth/token

Параметры запроса

ИдентификаторПравилаПример
grant_typerequiredin:authorization_coderefresh_token"authorization_code"
client_idrequireduuid56
codeНе обязательноnullablestring""
redirect_uriНе обязательноnullablestring""
code_verifierНе обязательноnullablestring""
refresh_tokenНе обязательноnullablestring""
scopeНе обязательноnullablestring""
resourceНе обязательноnullableurlnull

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/token", {
3 method: "POST",
4 headers: {
5 "Content-Type": "application/json"
6 },
7 body: JSON.stringify({
8 "grant_type": "\"authorization_code\"",
9 "client_id": 56,
10 "code": "\"\"",
11 "redirect_uri": "\"\"",
12 "code_verifier": "\"\"",
13 "refresh_token": "\"\"",
14 "scope": "\"\"",
15 "resource": "null"
16 })
17});
18const data = await response.json();

Примеры ответов

Tokens200application/json
{
  "access_token": "412|9f2c…",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "r1_7b0e…",
  "scope": "orders:create offline_access"
}
Bad code or verifier400application/json
{
  "error": "invalid_grant",
  "error_description": "The code or refresh token is invalid, expired, revoked or was issued to another client."
}
POST

Отозвать токен доступа или обновления (RFC 7009)

Новое/oauth/revoke

Отзыв токена

RFC 7009: отзывает токен доступа или токен обновления. Всегда возвращает статус 200, даже в случае неизвестного токена.

Способ запроса

POSThttps://api.stableproxy.com/v3/oauth/revoke

Параметры запроса

ИдентификаторПравилаПример
tokenrequiredstring""
token_type_hintНе обязательноnullablein:access_tokenrefresh_token"access_token"
client_idrequireduuid8

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/revoke", {
3 method: "POST",
4 headers: {
5 "Content-Type": "application/json"
6 },
7 body: JSON.stringify({
8 "token": "\"\"",
9 "token_type_hint": "\"access_token\"",
10 "client_id": 8
11 })
12});
13const data = await response.json();
GET

Подключённые приложения

Новое/oauth/apps

Подключенные приложения

Приложения, на которые пользователь, вошедший в систему, дал разрешение, с указанием их областей доступа, настроек покупок (auto_confirm, spend_limit_usd_day) и даты последнего использования. Доступно только при входе в панель управления.

Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

GEThttps://api.stableproxy.com/v3/oauth/apps

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/apps", {
3 method: "GET",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();
PUT

Изменить настройки покупок подключённого приложения

Новое/oauth/apps/{grant}

Настройки покупок для подключенного приложения

Включает или отключает автоматические покупки и устанавливает дневной лимит расходов. Доступно только после входа в панель управления.

Примечания

  • Отправляйте только изменившиеся параметры: auto_confirm, spend_limit_usd_day (в долларах США, null = без лимита).
  • Для автоматических покупок требуется лимит: auto_confirm: true без указания лимита приводит к ошибке 422 auto_confirm_requires_limit.
  • Если автоматические покупки отключены, каждая покупка ожидает подтверждения владельца в браузере.
Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

PUThttps://api.stableproxy.com/v3/oauth/apps/{grant}

Параметры запроса

ИдентификаторПравилаПример
spend_limit_usd_dayНе обязательноsometimesnullablenumericdecimal:0, 28872
auto_confirmНе обязательноsometimesbooleanfalse
grant1requirednull

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/apps/{grant}", {
3 method: "PUT",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 },
8 body: JSON.stringify({
9 "spend_limit_usd_day": 8872,
10 "auto_confirm": "false"
11 })
12});
13const data = await response.json();
DELETE

Отключить приложение

Новое/oauth/apps/{grant}
Для этого метода – нужна авторизация!
Вы можете использовать собственный ключ API, который можно получить в панели управления.

Способ запроса

DELETEhttps://api.stableproxy.com/v3/oauth/apps/{grant}

Параметры запроса

ИдентификаторПравилаПример
grant1requirednull

Примеры кода

1const baseUrl = "https://api.stableproxy.com/v3";
2const response = await fetch(baseUrl + "/oauth/apps/{grant}", {
3 method: "DELETE",
4 headers: {
5 "Authorization": "Bearer [YOUR TOKEN]",
6 "Content-Type": "application/json"
7 }
8});
9const data = await response.json();