Справочник API
Справочник REST API Mockarty. Локально запущенный сервер доступен по адресу
http://127.0.0.1:5770, а Mockarty Desktop — по адресу http://127.0.0.1:5780.
Все тела запросов/ответов используют Content-Type: application/json, если не указано иное.
URL-адреса в примерах: Все примеры используют
localhost:5770как адрес по умолчанию. Если ваш Mockarty развёрнут на удалённом сервере (например,https://mockarty.company.comилиhttp://192.168.1.50:5770), заменитеlocalhost:5770на реальный адрес. SDK принимают базовый URL в конструкторе клиента, так что его достаточно указать один раз. Подробнее — в Быстром старте.
Совет: Если у примера есть вкладки, переключайтесь между cURL, CLI и SDK. Установка и подробное использование описаны в руководстве по SDK и руководстве по CLI.
Ваш первый мок
Создайте мок и вызовите его. Сначала создайте токен в разделе Настройки → API-токены и запишите его в MOCKARTY_API_KEY. У токена должно быть право создавать моки в пространстве sandbox.
cURL
# 1. Создаём мок
curl -X POST http://localhost:5770/api/v1/mocks \
-H "X-API-Key: $MOCKARTY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "hello-world",
"namespace": "sandbox",
"http": {
"route": "/api/greeting",
"httpMethod": "GET"
},
"response": {
"statusCode": 200,
"payload": {
"message": "Hello, World!",
"timestamp": "$.fake.RFC3339"
}
}
}'
# 2. Вызываем мок (namespace — часть URL)
curl http://localhost:5770/stubs/sandbox/api/greeting
# Возвращает: {"message": "Hello, World!", "timestamp": "2026-03-22T10:30:00Z"}
CLI
# Установка: https://github.com/mockarty/mockarty-cli/releases
# 1. Сохраняем мок в файл и создаём его (пространство имён по умолчанию — "sandbox")
cat > hello-world.json <<'JSON'
{
"id": "hello-world",
"http": { "route": "/api/greeting", "httpMethod": "GET" },
"response": { "statusCode": 200, "payload": { "message": "Hello, World!", "timestamp": "$.fake.RFC3339" } }
}
JSON
mockarty-cli mock create -f hello-world.json
# 2. Вызываем мок — namespace всегда часть URL
curl http://localhost:5770/stubs/sandbox/api/greeting
Go
// go get github.com/mockarty/mockarty-go
package main
import (
"context"
"fmt"
"github.com/mockarty/mockarty-go"
)
func main() {
// Пространство имён по умолчанию "sandbox"
client := mockarty.NewClient("http://localhost:5770",
mockarty.WithAPIKey("mk_YOUR_TOKEN"),
)
mock := mockarty.NewMockBuilder().
ID("hello-world").
HTTP(func(h *mockarty.HTTPBuilder) {
h.Route("/api/greeting").Method("GET")
}).
Response(func(r *mockarty.ResponseBuilder) {
r.Status(200).JSONBody(map[string]any{
"message": "Hello, World!",
"timestamp": "$.fake.RFC3339",
})
}).
Build()
resp, err := client.Mocks().Create(context.Background(), mock)
if err != nil {
panic(err)
}
fmt.Printf("Создан: %s (перезаписан: %v)\n", resp.Mock.ID, resp.Overwritten)
}
Python
# pip install mockarty
from mockarty import MockartyClient
from mockarty.builders import MockBuilder
# Пространство имён по умолчанию "sandbox"
client = MockartyClient(
base_url="http://localhost:5770",
api_key="mk_YOUR_TOKEN",
)
mock = (
MockBuilder.http("/api/greeting", "GET")
.id("hello-world")
.respond(200, body={
"message": "Hello, World!",
"timestamp": "$.fake.RFC3339",
})
.build()
)
result = client.mocks.create(mock)
print(f"Создан: {result.mock.id}, перезаписан: {result.overwritten}")
Java
// Gradle: implementation "ru.mockarty:mockarty-java:0.3.0"
import ru.mockarty.MockartyClient;
import ru.mockarty.builder.MockBuilder;
import ru.mockarty.model.Mock;
import ru.mockarty.model.SaveMockResponse;
import java.util.Map;
// Пространство имён по умолчанию "sandbox"
try (MockartyClient client = MockartyClient.builder()
.baseUrl("http://localhost:5770")
.apiKey("mk_YOUR_TOKEN")
.build()) {
Mock mock = MockBuilder.http("/api/greeting", "GET")
.id("hello-world")
.respond(200, Map.of(
"message", "Hello, World!",
"timestamp", "$.fake.RFC3339"
))
.build();
SaveMockResponse resp = client.mocks().create(mock);
System.out.println("Создан: " + resp.getMock().getId());
}
Kotlin
// Gradle: implementation("ru.mockarty:mockarty-kotlin:0.3.0")
import ru.mockarty.MockartyClient
import ru.mockarty.dsl.createMock
// Пространство имён по умолчанию "sandbox"
val client = MockartyClient.builder()
.baseUrl("http://localhost:5770")
.apiKey("mk_YOUR_TOKEN")
.build()
client.createMock {
id = "hello-world"
http {
route = "/api/greeting"
method = "GET"
}
respond {
statusCode = 200
body = mapOf(
"message" to "Hello, World!",
"timestamp" to "$.fake.RFC3339"
)
}
}
Как это работает: Вы определяете мок через
POST /api/v1/mocks, затем Mockarty обслуживает его по адресу/stubs/<ваш-маршрут>. Префикс/stubsуказывает Mockarty разрешить мок, а не обращаться к API управления. Динамические значения вроде$.fake.RFC3339подставляются в момент формирования ответа.
Если такой мок уже есть. Чтобы не затирать данные, создание мока с тем же методом и маршрутом (и условиями), который уже существует в пространстве имён, возвращает
409с телом вида{"code":"duplicate_entity","matchLevel":"strict","existing":{"id":"…","summary":"GET /api/users"}}— вместо тихого создания дубля. Разрешите конфликт повтором запроса с query-параметром:
?intent=overwrite— заменить существующий мок на месте (его id сохраняется; это новая версия того же эндпоинта).?intent=create_new— всё же создать второй мок (полезно, когда это действительно другой вариант, например другие условия совпадения или приоритет).
matchLevel—strict(идентичный мок) илиsimilar(тот же эндпоинт с другими условиями). В интерфейсе появляется диалог Перезаписать / Создать новый / Отмена. То же работает при сохранении записанного UI-теста под уже существующим именем.

Содержание
- Аутентификация
- API управления моками (публичный)
- API пространств имён
- API хранилищ
- API шаблонов
- Руководство по CI/CD интеграции
- API тестирования API
- API нагрузочного тестирования
- API фаззинга
- API рекордера
- API контрактного тестирования
- API Chaos Engineering
- API администрирования
- Утилиты
- Вызов HTTP-мока
- Настройки автономных миссий пространства
- Проверка знаний агентов
- Окружения delivery policy (администратор)
- Связанная документация
1. Аутентификация
Mockarty использует два механизма аутентификации: API-токены для программного доступа и сессионные куки для Web UI.
API-токены
Создавайте токены в Web UI (Настройки > API-токены) или через POST /api/v1/auth/tokens.
Передавайте токен в запросах через заголовок:
cURL
# Заголовок X-API-Key (пространство "sandbox" по умолчанию)
curl -H "X-API-Key: mk_YOUR_TOKEN" http://localhost:5770/api/v1/mocks
# Заголовок Authorization: Bearer
curl -H "Authorization: Bearer mk_YOUR_TOKEN" http://localhost:5770/api/v1/mocks
CLI
# Настройка токена и namespace глобально (сохраняется в ~/.mockarty-cli/config.yaml)
mockarty-cli config set-context default --token mk_YOUR_TOKEN --namespace sandbox
mockarty-cli config use-context default
# Или передать для конкретной команды
mockarty-cli mock list --token mk_YOUR_TOKEN
Go
// Токен задаётся через опцию WithAPIKey; пространство по умолчанию "sandbox"
client := mockarty.NewClient("http://localhost:5770",
mockarty.WithAPIKey("mk_YOUR_TOKEN"),
mockarty.WithNamespace("sandbox"), // необязательно, "sandbox" по умолчанию
)
Python
# Токен задаётся через параметр api_key; пространство по умолчанию "sandbox"
client = MockartyClient(
base_url="http://localhost:5770",
api_key="mk_YOUR_TOKEN",
namespace="sandbox", # необязательно, "sandbox" по умолчанию
)
Java
// Токен задаётся через apiKey; пространство по умолчанию "sandbox"
MockartyClient client = MockartyClient.builder()
.baseUrl("http://localhost:5770")
.apiKey("mk_YOUR_TOKEN")
.namespace("sandbox") // необязательно, "sandbox" по умолчанию
.build();
Kotlin
// Токен задаётся через apiKey; пространство по умолчанию "sandbox"
val client = MockartyClient.builder()
.baseUrl("http://localhost:5770")
.apiKey("mk_YOUR_TOKEN")
.namespace("sandbox") // необязательно, "sandbox" по умолчанию
.build()
Сессионная аутентификация
Для Web UI и доступа через браузер:
# Вход (возвращает сессионную куку)
curl -c cookies.txt -X POST http://localhost:5770/api/v1/auth/login \
-d '{"username": "admin", "password": "secret"}'
# Использование сессионной куки
curl -b cookies.txt http://localhost:5770/api/v1/mocks
Эндпоинты аутентификации
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| POST | /api/v1/auth/login |
нет | Вход по логину/паролю |
| POST | /api/v1/auth/logout |
пользователь | Завершение сессии |
| GET | /api/v1/auth/me |
пользователь | Информация о текущем пользователе |
| POST | /api/v1/auth/change-password |
пользователь | Смена пароля |
| POST | /api/v1/auth/tokens |
пользователь | Создание API-токена |
| GET | /api/v1/auth/tokens |
пользователь | Список своих API-токенов |
| GET | /api/v1/auth/tokens/:id |
пользователь | Детали токена |
| PATCH | /api/v1/auth/tokens/:id |
пользователь | Обновление токена (имя, срок действия) |
| DELETE | /api/v1/auth/tokens/:id |
пользователь | Отзыв токена |
| POST | /api/v1/auth/delegated-credentials |
пользователь | Выпустить делегированные учётные данные проекта |
| GET | /api/v1/auth/delegated-credentials |
пользователь | Список учётных данных, доступных вызывающему |
| GET | /api/v1/auth/delegated-credentials/:id |
пользователь | Прочитать учётные данные |
| POST | /api/v1/auth/delegated-credentials/:id/rotate |
пользователь | Заменить токен, сохранив область |
| DELETE | /api/v1/auth/delegated-credentials/:id |
пользователь | Отозвать навсегда |
| POST | /api/v1/auth/ldap/login |
нет | Вход через LDAP |
| GET | /api/v1/auth/oauth/login/:provider |
нет | Начало OAuth-потока |
| POST | /api/v1/auth/forgot-password |
нет | Запрос сброса пароля по email |
| GET | /api/v1/auth/verify-email |
нет | Подтверждение email |
Ограничение частоты запросов
Запросы к API ограничены в зависимости от лицензии. Лимиты применяются отдельно для каждого API-ключа.
2. API управления моками (публичный)

Эндпоинты для управления определениями моков. Доступны на корневом сервере (порт 5770). Требуют аутентификации с правом read или write.
Создание/обновление мока
POST /api/v1/mocks | Авторизация: пользователь (write)
Создаёт новый мок или перезаписывает существующий (по id).
cURL
curl -X POST http://localhost:5770/api/v1/mocks \
-H "X-API-Key: mk_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": "get-user",
"namespace": "sandbox",
"http": {
"route": "/api/users/list",
"httpMethod": "GET"
},
"response": {
"statusCode": 200,
"payload": {
"id": "$.fake.UUID",
"name": "$.fake.FirstName",
"email": "$.fake.Email"
}
}
}'
CLI
# Пространство имён по умолчанию "sandbox"
echo '{"id":"get-user","http":{"route":"/api/users/list","httpMethod":"GET"},"response":{"statusCode":200,"payload":{"id": "$.fake.UUID", "name": "$.fake.FirstName", "email": "$.fake.Email"}}}' | mockarty-cli mock create -f -
Go
mock := mockarty.NewMockBuilder().
ID("get-user").
Namespace("sandbox"). // необязательно, "sandbox" по умолчанию
HTTP(func(h *mockarty.HTTPBuilder) {
h.Route("/api/users/list").Method("GET")
}).
Response(func(r *mockarty.ResponseBuilder) {
r.Status(200).JSONBody(map[string]any{
"id": "$.fake.UUID",
"name": "$.fake.FirstName",
"email": "$.fake.Email",
})
}).
Build()
resp, err := client.Mocks().Create(context.Background(), mock)
Python
mock = (
MockBuilder.http("/api/users/list", "GET")
.id("get-user")
.namespace("sandbox") # необязательно, "sandbox" по умолчанию
.respond(200, body={
"id": "$.fake.UUID",
"name": "$.fake.FirstName",
"email": "$.fake.Email",
})
.build()
)
result = client.mocks.create(mock)
Java
Mock mock = MockBuilder.http("/api/users/list", "GET")
.id("get-user")
.namespace("sandbox") // необязательно, "sandbox" по умолчанию
.respond(200, Map.of(
"id", "$.fake.UUID",
"name", "$.fake.FirstName",
"email", "$.fake.Email"
))
.build();
SaveMockResponse resp = client.mocks().create(mock);
Kotlin
client.createMock {
id = "get-user"
namespace = "sandbox" // необязательно, "sandbox" по умолчанию
http {
route = "/api/users/list"
method = "GET"
}
respond {
statusCode = 200
body = mapOf(
"id" to "$.fake.UUID",
"name" to "$.fake.FirstName",
"email" to "$.fake.Email"
)
}
}
Ответ:
{
"overwritten": false,
"mock": {
"id": "get-user",
"namespace": "default",
"createdAt": 1704096000000,
"useCounter": 0
}
}
Полная структура мока (все поля необязательны, кроме id):
| Поле | Тип | Описание |
|---|---|---|
id |
string | Уникальный идентификатор мока |
namespace |
string | Пространство имён (по умолчанию: “default”) |
chainId |
string | ID цепочки для связанных моков |
priority |
int64 | Моки с высшим приоритетом сопоставляются первыми (по умолчанию: 0) |
ttl |
int64 | Время жизни в миллисекундах (0 = без ограничений) |
useLimiter |
int32 | Максимальное число использований (0 = без ограничений) |
transient |
bool | Если true, мок пропускает пер-хит бухгалтерию — логирование запросов, live-обновления и счётчик использований — чтобы снять нагрузку при высоком трафике / нагрузочном тестировании (по умолчанию: false). Сопоставление и ответ не меняются. |
http |
object | HTTP-конфигурация (route, httpMethod, conditions, queryParams, header) |
grpc |
object | gRPC-конфигурация (service, method, conditions, meta) |
mcp |
object | MCP-конфигурация (method, tool, resource или prompt, conditions) |
soap |
object | SOAP-конфигурация (service, method, action, path) |
graphql |
object | GraphQL-конфигурация (operation, field, type, path) |
smtp |
object | SMTP-конфигурация (serverName, senderConditions, recipientConditions, subjectConditions, bodyConditions, headerConditions) |
socket |
object | WebSocket/TCP/UDP-конфигурация (serverName, event, namespace) |
kafka |
object | Kafka-конфигурация (topic, serverName) |
rabbitmq |
object | RabbitMQ-конфигурация (queue, serverName) |
sse |
object | SSE-конфигурация (route, serverName) |
response |
object | Ответ: statusCode, payload, headers, delay, payloadTemplatePath |
oneOf |
object | Множественные ответы: order (“order”/“random”), массив responses |
proxy |
object | Режим прокси: URL target |
webhooks |
array | Вебхук-колбэки, вызываемые при совпадении мока (см. Вебхуки и колбэки) |
tags |
array | Строковые теги для категоризации и фильтрации моков |
folderId |
string | ID папки для иерархической организации моков |
pathPrefix |
string | Единый префикс пути для нативных протоколов (HTTP, SOAP, MCP, SSE, GraphQL) |
serverName |
string | Имя сервера для группировки моков по окружениям (например, test, stage, prod) – используется для Socket и gRPC |
mStore |
object | Хранилище мока – эфемерные данные ключ-значение, доступные только при обработке данного мока |
extract |
object | Извлечение данных: mStore, cStore, gStore |
Структура условия (Condition)
Что такое условия? Условия позволяют возвращать разные ответы мока в зависимости от входящего запроса. Без условий мок соответствует любому запросу к его маршруту. С условиями Mockarty анализирует тело запроса, заголовки или параметры и выбирает мок только если все условия выполнены. Это полезно, когда несколько моков имеют один маршрут, но должны отвечать по-разному в зависимости от содержимого запроса (например, вернуть ошибку, когда $.status равен "invalid").
Массив conditions внутри конфигурационных объектов http, grpc и mcp управляет выбором мока. Каждое условие — объект со следующими полями:
| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
path |
string | Да | Выражение пути для проверки (например, $.user.role, имя заголовка, имя параметра запроса) |
assertAction |
string | Да | Операция сравнения (см. таблицу ниже) |
value |
any | Зависит | Ожидаемое значение для сравнения. Обязательно для equals, contains, not_equals, not_contains, matches, gt, lt. Игнорируется для any, notEmpty, empty. |
decode |
string | Нет | Установите "base64" для base64-декодирования извлечённого значения перед сравнением. Полезно, когда запрос содержит base64-кодированные поля. |
sortArray |
bool | Нет | Сортировать массивы перед сравнением. Переопределяет глобальный флаг sortArray конфигурации протокола для данного условия. |
valueFromFile |
string | Нет | Путь к файлу, содержимое которого используется как значение условия вместо value. Путь поддерживает шаблонную обработку ($.fake.*, ссылки на хранилища). Имеет приоритет над value. |
Действия проверки (Assert actions):
| Действие | Описание | Значение обязательно |
|---|---|---|
equals |
Точное совпадение (глубокое сравнение для объектов/массивов) | Да |
contains |
Поиск подстроки для строк, проверка подмножества для объектов, наличие элемента для массивов. У чисел и логических значений подстроки нет: проверяется точное совпадение значения (100 не содержит 10) |
Да |
not_equals |
Не равно значению | Да |
not_contains |
Отрицание contains — не содержит подстроку или подмножество, а для чисел и логических значений не равно этому значению |
Да |
matches |
Сопоставление с регулярным выражением | Да (шаблон регулярного выражения) |
not_matches |
Значение НЕ совпадает с regex (негация matches; отсутствующее поле совпадает) |
Да (шаблон регулярного выражения) |
gt |
Численно больше — значение поля и value разбираются как числа |
Да (число) |
lt |
Численно меньше — значение поля и value разбираются как числа |
Да (число) |
gte |
Численно больше или равно (включительно) — обе стороны разбираются как числа | Да (число) |
lte |
Численно меньше или равно (включительно) — обе стороны разбираются как числа | Да (число) |
any |
Всегда совпадает (значение игнорируется) | Нет |
notEmpty |
Значение существует и непустое (не null, непустая строка/массив/объект) | Нет |
empty |
Значение пустое или null ("", [], {} или null) |
Нет |
Примечание: Устаревший псевдоним
matchтакже принимается и работает идентичноmatches.
Пример с расширенными полями условий:
{
"id": "base64-body-mock",
"http": {
"route": "/api/validate",
"httpMethod": "POST",
"conditions": [
{
"path": "$.encodedData",
"assertAction": "contains",
"value": "expected-content",
"decode": "base64"
},
{
"path": "$.items",
"assertAction": "equals",
"value": ["b", "a", "c"],
"sortArray": true
},
{
"path": "$.payload",
"assertAction": "equals",
"valueFromFile": "/templates/expected-payload.json"
}
]
},
"response": {
"statusCode": 200,
"payload": {"status": "validated"}
}
}
Примечание:
decode,sortArrayиvalueFromFile— поля только для API, они не доступны в визуальном конструкторе Web UI.
Получение мока
GET /api/v1/mocks/:id | Авторизация: пользователь (read)
cURL
curl -H "X-API-Key: mk_YOUR_TOKEN" http://localhost:5770/api/v1/mocks/get-user
CLI
mockarty-cli mock get get-user
Go
mock, err := client.Mocks().Get(context.Background(), "get-user")
Python
mock = client.mocks.get("get-user")
Java
Mock mock = client.mocks().get("get-user");
Kotlin
val mock = client.mocks().get("get-user")
Список моков
GET /api/v1/mocks | Авторизация: пользователь (read)
| Параметр | Тип | Описание |
|---|---|---|
offset |
int | Смещение пагинации (по умолчанию: 0) |
limit |
int | Размер страницы (по умолчанию: 50) |
namespace |
string | Фильтр по пространству имён |
tags |
string | Фильтр по тегам через запятую |
search |
string | Поиск по идентификаторам и тегам |
folderId |
string | UUID папки или root |
protocol |
string | Фильтр по протоколу |
onlyActive |
bool | Исключить мягко удалённые моки |
cURL
# Пространство "sandbox" по умолчанию
curl -H "X-API-Key: mk_YOUR_TOKEN" \
"http://localhost:5770/api/v1/mocks?namespace=sandbox&protocol=http&onlyActive=true&limit=10"
CLI
mockarty-cli mock list --namespace sandbox
Go
page, err := client.Mocks().List(context.Background(), &mockarty.ListMocksOptions{
Namespace: "sandbox", // необязательно, "sandbox" по умолчанию
Protocol: "http",
Limit: 10,
OnlyActive: true,
})
for _, m := range page.Items {
fmt.Println(m.ID)
}
Python
page = client.mocks.list(namespace="sandbox", protocol="http", only_active=True, limit=10)
for mock in page.items:
print(mock.id)
Java
Page<Mock> page = client.mocks().list(
"sandbox", null, null, null, "http", true, 0, 10);
for (Mock m : page.getItems()) {
System.out.println(m.getId());
}
Kotlin
val page = client.mocks().list(
"sandbox", null, null, null, "http", true, 0, 10)
page.items.forEach { println(it.id) }
Удаление мока (мягкое)
DELETE /api/v1/mocks/:id | Авторизация: пользователь (delete)
cURL
curl -X DELETE -H "X-API-Key: mk_YOUR_TOKEN" \
http://localhost:5770/api/v1/mocks/get-user
CLI
mockarty-cli mock delete get-user
Go
err := client.Mocks().Delete(context.Background(), "get-user")
Python
client.mocks.delete("get-user")
Java
client.mocks().delete("get-user");
Kotlin
client.mocks().delete("get-user")
Восстановление мока
Восстановить мягко удалённый мок (один или несколько) из корзины:
POST /api/v1/mocks/batch/restore | Авторизация: пользователь (write)
{ "ids": ["mock_123"] }
Полное удаление мока
DELETE /api/v1/mocks/:id/purge | Авторизация: пользователь (delete)
Журналы запросов мока
GET /api/v1/mocks/:id/logs | Авторизация: пользователь (read)
Возвращает историю запросов к моку.
{
"id": "get-user",
"requests": [
{
"calledAt": "2024-01-01T10:05:00Z",
"req": {
"header": {},
"body": {},
"queryParam": {},
"url": "/stubs/api/users/123"
}
}
]
}
Цепочки моков
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/mocks/chains/:id |
Получить все моки в цепочке |
| DELETE | /api/v1/mocks/chains/:id |
Удалить всю цепочку |
Пакетное создание
POST /api/v1/mocks/batch | Авторизация: пользователь (write)
Создание нескольких моков за один запрос.
cURL
curl -X POST http://localhost:5770/api/v1/mocks/batch \
-H "X-API-Key: mk_YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '[
{"id": "mock-1", "namespace": "sandbox", "http": {"route": "/api/a", "httpMethod": "GET"}, "response": {"statusCode": 200}},
{"id": "mock-2", "namespace": "sandbox", "http": {"route": "/api/b", "httpMethod": "GET"}, "response": {"statusCode": 200}}
]'
CLI
# Пакетное создание из JSON-файла (пространство по умолчанию "sandbox")
mockarty-cli mock create --file mocks.json
Go
mocks := []*mockarty.Mock{
mockarty.NewMockBuilder().ID("mock-1").
HTTP(func(h *mockarty.HTTPBuilder) { h.Route("/api/a").Method("GET") }).
Response(func(r *mockarty.ResponseBuilder) { r.Status(200) }).
Build(),
mockarty.NewMockBuilder().ID("mock-2").
HTTP(func(h *mockarty.HTTPBuilder) { h.Route("/api/b").Method("GET") }).
Response(func(r *mockarty.ResponseBuilder) { r.Status(200) }).
Build(),
}
err := client.Mocks().BatchCreate(context.Background(), mocks)
Python
mocks = [
MockBuilder.http("/api/a", "GET").id("mock-1").respond(200).build(),
MockBuilder.http("/api/b", "GET").id("mock-2").respond(200).build(),
]
results = client.mocks.batch_create(mocks)
Java
// В Java SDK нет отдельного метода batchCreate;
// используйте цикл для создания каждого мока по отдельности
Mock mock1 = MockBuilder.http("/api/a", "GET").id("mock-1").respond(200).build();
Mock mock2 = MockBuilder.http("/api/b", "GET").id("mock-2").respond(200).build();
client.mocks().create(mock1);
client.mocks().create(mock2);
Частичное обновление (Patch)
PATCH /api/v1/mocks/:id | Авторизация: пользователь (write)
Частичное обновление мока (переданные поля объединяются с существующим моком).
cURL
curl -X PATCH http://localhost:5770/api/v1/mocks/get-user \
-H "X-API-Key: mk_YOUR_TOKEN" \
-d '{"response": {"statusCode": 201}}'
CLI
# CLI не предоставляет отдельной команды patch.
# Экспортируйте мок, отредактируйте его локально и примените полное определение —
# сервер обновит существующий мок по id.
mockarty-cli mock get get-user -o json > mock.json
# отредактируйте mock.json (например, измените response.statusCode на 201)
mockarty-cli mock create -f mock.json
Go
updated, err := client.Mocks().Patch(context.Background(), "get-user", map[string]any{
"response": map[string]any{"statusCode": 201},
})
Python
updated = client.mocks.patch("get-user", {"response": {"statusCode": 201}})
Java
Mock updated = client.mocks().patch("get-user", Map.of(
"response", Map.of("statusCode", 201)
));
История версий мока
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/mocks/:id/versions |
Список истории версий мока |
| GET | /api/v1/mocks/:id/versions/:version |
Получение конкретной версии |
| POST | /api/v1/mocks/:id/versions/:version/restore |
Восстановление мока до предыдущей версии |
Предпросмотр разрешения мока
GET /api/v1/mocks/preview | Авторизация: пользователь (read)
Предпросмотр того, какой мок будет разрешён для указанного маршрута/метода без фактического вызова stub-эндпоинта.
Пакетные операции (UI API)
| Метод | Путь | Описание |
|---|---|---|
| DELETE | /api/v1/mocks/batch |
Пакетное мягкое удаление: {"ids": [...]} |
| POST | /api/v1/mocks/batch/restore |
Пакетное восстановление: {"ids": [...]} |
| PATCH | /api/v1/mocks/batch/tags |
Пакетное обновление тегов: {"ids": [...], "addTags": [...], "removeTags": [...]} |
Теги
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/tags |
Список всех тегов |
| POST | /api/v1/tags |
Создание нового тега |
Папки моков
Организация моков в папки для удобного управления.
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/mock-folders |
Список всех папок |
| POST | /api/v1/mock-folders |
Создание папки |
| PUT | /api/v1/mock-folders/:id |
Обновление папки |
| DELETE | /api/v1/mock-folders/:id |
Удаление папки |
| PATCH | /api/v1/mock-folders/:id/move |
Перемещение папки (изменение порядка/родителя) |
| PATCH | /api/v1/mocks/batch/move |
Перемещение моков в папку |
Неопределённые запросы
Перехваченные запросы, не совпавшие ни с одним моком.
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/undefined-requests |
Список неопределённых запросов |
| PATCH | /api/v1/undefined-requests/:id/ignore |
Игнорировать неопределённый запрос |
| DELETE | /api/v1/undefined-requests |
Удалить выбранные неопределённые запросы |
| DELETE | /api/v1/undefined-requests/all |
Очистить все неопределённые запросы |
| POST | /api/v1/undefined-requests/:id/create-mock |
Создать мок из неопределённого запроса |
Активные протоколы плагинов
GET /api/v1/plugin-protocols | Авторизация: пользователь (mock:read)
Возвращает протокольные кодеки плагинов, активные в запрошенном namespace. В
каждой строке есть точный Socket serverName; при создании мока используйте его
без изменений. Сам wire-listener доступен, только если сервер запущен с
MOCKARTY_UNIFIED_PORT=1.
curl -H "Authorization: Bearer $TOKEN" \
"http://localhost:5770/api/v1/plugin-protocols?namespace=sandbox"
catalogue, err := client.Mocks().ListPluginProtocols(ctx, "sandbox")
catalogue = client.mocks.list_plugin_protocols(namespace="sandbox")
PluginProtocolCatalogue catalogue = client.mocks().listPluginProtocols("sandbox");
Тот же каталог доступен агентам через read-only MCP-инструмент
plugin_protocols_list и в CLI как mockarty-cli plugin protocols.
Примеры протокольных моков (GraphQL / SOAP / gRPC)
Моки — не только HTTP. Тот же POST /api/v1/mocks принимает блок конфига
протокола (graphql, soap, grpc, …) вместо http. response.payload и
шаблонные плейсхолдеры ($.fake.*, $.req.*) работают во всех протоколах.
Все три примера ниже выверены end-to-end.
GraphQL — матч по operation + field, отдаётся поверх HTTP по graphql.path:
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "gql-user",
"graphql": { "operation": "query", "field": "user", "path": "/graphql" },
"response": { "statusCode": 200, "payload": { "data": { "user": { "id": "$.fake.UUID", "name": "Ada" } } } }
}'
# Вызвать
curl -X POST http://localhost:5770/stubs/sandbox/graphql \
-H "Content-Type: application/json" \
-d '{"query":"query { user { id name } }"}'
# → {"data":{"user":{"id":"2778f790-…","name":"Ada"}}}
SOAP — матч по service / method / action, отдаётся по soap.path.
Для XML положите сырой envelope в response.payload как строку:
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "soap-getuser",
"soap": { "service": "UserService", "method": "GetUser", "action": "GetUser", "path": "/soap/users" },
"response": {
"statusCode": 200,
"payload": "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><GetUserResponse><id>42</id><name>Ada</name></GetUserResponse></soap:Body></soap:Envelope>",
"headers": { "Content-Type": ["text/xml"] }
}
}'
# Вызвать
curl -X POST http://localhost:5770/stubs/sandbox/soap/users \
-H "Content-Type: text/xml" -H "SOAPAction: GetUser" \
-d '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><GetUser><id>42</id></GetUser></soap:Body></soap:Envelope>'
# → envelope GetUserResponse выше
gRPC — матч по service / method. Сначала загрузите .proto сервиса
(Admin → gRPC или POST /api/v1/api-tester/import/grpc), затем создайте мок:
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "grpc-getuser",
"grpc": { "service": "user.UserService", "method": "GetUser" },
"response": { "statusCode": 0, "payload": { "id": "42", "name": "Ada" } }
}'
# Вызвать любым gRPC-клиентом (gRPC-порт по умолчанию :5773), напр. grpcurl:
grpcurl -plaintext -d '{"id":"42"}' localhost:5773 user.UserService/GetUser
SSE — матч по sse.eventPath; ответ стримит события из
response.sseEventChain.events[]. Запрос считается SSE, если несёт
Accept: text/event-stream (или путь под /sse/ либо /events/):
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "sse-orders",
"sse": { "eventPath": "/events/orders", "eventName": "order" },
"response": { "sseEventChain": { "events": [
{ "eventName": "order", "data": { "id": "$.fake.UUID", "status": "created" }, "delay": 100 },
{ "eventName": "order", "data": { "status": "shipped" }, "delay": 100 }
] } }
}'
# Вызвать (стрим)
curl -N -H "Accept: text/event-stream" http://localhost:5770/stubs/sandbox/events/orders
# → event:order
# data:{"id":"ccdc58b8-…","status":"created"}
# event:order
# data:{"status":"shipped"}
WebSocket — матч по socket.serverName + socket.event:
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "ws-echo",
"socket": { "serverName": "chat", "event": "message" },
"response": { "payload": { "reply": "pong", "at": "$.fake.RFC3339" } }
}'
# Вызвать любым WebSocket-клиентом (напр. websocat):
websocat ws://localhost:5770/stubs/sandbox/chat
MCP — матч по mcp.method (tools/call) + mcp.tool. Мок публикуется
как инструмент на MCP-сервере пространства имён и вызывается по JSON-RPC. Мок без
pathPrefix отдаётся по базе namespace (/stubs/<ns>); чтобы отдавать под
суб-путём, задайте pathPrefix (напр. "/mcp") и зовите /stubs/<ns>/mcp.
Полный флоу сервера — в MCP Marketplace.
# Создать
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "mcp-weather",
"mcp": { "method": "tools/call", "tool": "get_weather", "description": "Get weather" },
"response": { "payload": { "temp": 21, "city": "Berlin" } }
}'
# Вызвать по JSON-RPC на базе namespace (у мока нет pathPrefix)
curl -X POST http://localhost:5770/stubs/sandbox \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"get_weather","arguments":{}}}'
# → {"jsonrpc":"2.0","id":1,"result":{"content":[{"type":"text","text":"{\"temp\":21,\"city\":\"Berlin\"}"}],"isError":false}}
Так же мокаются промпты MCP: mcp.method prompts/get + mcp.prompt (имя
промпта). Тело ответа — результат промпта: messages с role (user или
assistant) и text либо просто строка — одно сообщение пользователя;
$.req.<аргумент> подставляет аргумент вызова. Список arguments в теле — то, что
клиент видит в prompts/list (в ответ prompts/get он не попадает). Условия на
аргументы выбирают между несколькими моками одного промпта. Как только у пути сервера
появляется мок-промпт, initialize объявляет возможность prompts.
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{
"id": "mcp-review-prompt",
"pathPrefix": "/prompts-demo",
"mcp": { "method": "prompts/get", "prompt": "code_review", "description": "Review a diff" },
"response": { "payload": {
"arguments": [{ "name": "diff", "description": "Unified diff", "required": true }],
"messages": [{ "role": "user", "text": "Review this change: $.req.diff" }]
} }
}'
curl -X POST http://localhost:5770/stubs/sandbox/prompts-demo \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"prompts/get","params":{"name":"code_review","arguments":{"diff":"+ retry on 503"}}}'
# → {"id":3,"jsonrpc":"2.0","result":{"messages":[{"content":{"text":"Review this change: + retry on 503","type":"text"},"role":"user"}]}}
В конструкторе мока выберите Тип запроса → Промпт (prompts/get) и введите имя
промпта; вызов неизвестного промпта попадает в Неопределённые запросы, откуда его
можно превратить в мок-промпт.
S3 — Mockarty эмулирует S3-совместимое объектное хранилище по бакету. Объявите
бакет через s3.bucket, затем используйте любой S3-клиент (или plain path-style
HTTP под /stubs/<ns>/<bucket>/<key>, включая aws s3 --no-sign-request):
# Создать мок бакета
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "id": "s3-assets", "s3": { "bucket": "assets" } }'
# PUT затем GET объекта (path-style, анонимно)
curl -X PUT http://localhost:5770/stubs/sandbox/assets/greeting.txt --data 'hello from s3 mock'
curl http://localhost:5770/stubs/sandbox/assets/greeting.txt
# → hello from s3 mock
Kafka / RabbitMQ / SMTP — асинхронные моки. Mockarty матчит входящее сообщение
(Kafka-record / AMQP-сообщение / письмо) против конфига + условий и может
опубликовать ответ в output* topic/queue. Мок создаётся так же; вызывается
продюсингом в матчируемый topic/queue или отправкой письма на настроенный сервер
(не по HTTP):
# Kafka — матч topic 'orders', ответ публикуется в настроенный output-topic
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "id": "kafka-orders", "kafka": { "topic": "orders", "serverName": "prod" }, "response": { "payload": { "status": "ack" } } }'
# RabbitMQ — матч queue 'tasks'
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "id": "rmq-tasks", "rabbitmq": { "queue": "tasks", "serverName": "prod" }, "response": { "payload": { "status": "ack" } } }'
# SMTP — матч писем, у которых subject содержит 'Welcome'
curl -X POST "http://localhost:5770/api/v1/mocks?namespace=sandbox" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{ "id": "smtp-welcome", "smtp": { "serverName": "mail", "subjectConditions": [ { "assertAction": "contains", "value": "Welcome" } ] }, "response": { "payload": { "accepted": true } } }'
3. API пространств имён
Как читать ответ со списком
Эндпоинт списка возвращает строки под ключом, названным по сущности, рядом со счётчиком:
{ "count": 2, "mocks": [{ "id": "mock_1785…", "name": "users" }] }
{ "total": 7, "limit": 50, "offset": 0, "runs": [{ "id": "7e8ef264-…", "status": "running" }] }
Для общих коллекций, где имя сущности ничего не добавляет, используется items:
{ "count": 3, "items": [{ "id": "37abcf01-…", "name": "Chrome / Linux" }] }
Счётчик называется count для полного набора и total, когда ответ постраничный (тогда
присутствуют и limit / offset). Какой ключ у конкретного эндпоинта — смотрите в его
разделе; источник истины — схема Swagger (/swagger/index.html), она всегда совпадает с
запущенной сборкой.
Эндпоинт списка никогда не возвращает null вместо строк — пустой результат это пустой
массив, поэтому итерироваться можно без проверки на nil.
Как указать пространство имён в любом эндпоинте
Любой эндпоинт, работающий внутри пространства имён, принимает его в любой из форм —
выберите удобную вашему клиенту и придерживайтесь её:
# Параметром запроса
curl "http://localhost:5770/api/v1/test-cases?namespace=staging" -H "X-API-Key: $TOKEN"
# Сегментом пути
curl "http://localhost:5770/api/v1/namespaces/staging/test-cases" -H "X-API-Key: $TOKEN"
# Заголовком (удобно, когда клиент проставляет его один раз для всех запросов)
curl "http://localhost:5770/api/v1/test-cases" \
-H "X-Mockarty-Namespace: staging" -H "X-API-Key: $TOKEN"
Все три формы попадают в один и тот же обработчик и возвращают одинаковый результат. Если
ваш токен закреплён за пространством имён, можно не указывать его вовсе — будет использовано
закреплённое.
Доступ проверяется одинаково при любой форме: нужно быть участником указанного пространства
имён. Обращение к чужому вернёт 404, а не 403, — чтобы по ответу нельзя было выяснить,
какие пространства имён существуют.
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| POST | /api/v1/namespaces |
пользователь (write) | Создание пространства имён: {"name": "staging"} |
| GET | /api/v1/namespaces |
пользователь (read) | Список пространств имён |
| POST | /api/v1/mocks/copy-to-namespace |
пользователь (write) | Копирование моков между пространствами |
| GET | /api/v1/namespaces |
пользователь | Список доступных пространств |
| POST | /api/v1/namespaces |
админ | Создание пространства (админ-маршрут) |
Пример копирования моков:
cURL
curl -X POST -H "X-API-Key: mk_YOUR_TOKEN" \
http://localhost:5770/api/v1/mocks/copy-to-namespace \
-d '{
"sourceNamespace": "staging",
"targetNamespace": "production",
"mockIds": ["mock-1", "mock-2"]
}'
Go
err := client.Mocks().CopyToNamespace(context.Background(),
[]string{"mock-1", "mock-2"}, "production",
)
Python
client.mocks.copy_to_namespace(
ids=["mock-1", "mock-2"],
target_namespace="production",
)
Java
client.mocks().copyToNamespace(
List.of("mock-1", "mock-2"),
"production"
);
4. API хранилищ

Три типа хранилищ для моков с состоянием. Подробнее в Системе хранилищ.
Глобальное хранилище
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| GET | /api/v1/stores/global?namespace=default |
пользователь (read) | Получить все данные |
| POST | /api/v1/stores/global |
пользователь (write) | Установить пару ключ-значение: {"key": "...", "value": "...", "namespace": "..."} |
| DELETE | /api/v1/stores/global/:key?namespace=default |
пользователь (write) | Удалить ключ (ключ в URL-пути) |
Каждый POST-запрос добавляет одну пару ключ-значение. Для добавления нескольких ключей выполните отдельные запросы.
cURL
# Установить пару ключ-значение (один за запрос)
curl -X POST -H "X-API-Key: mk_YOUR_TOKEN" \
"http://localhost:5770/api/v1/stores/global" \
-d '{"key": "totalUsers", "value": "100", "namespace": "sandbox"}'
curl -X POST -H "X-API-Key: mk_YOUR_TOKEN" \
"http://localhost:5770/api/v1/stores/global" \
-d '{"key": "serviceName", "value": "auth", "namespace": "sandbox"}'
# Прочитать хранилище
curl -H "X-API-Key: mk_YOUR_TOKEN" \
"http://localhost:5770/api/v1/stores/global?namespace=sandbox"
# Удалить ключ (ключ в URL-пути)
curl -X DELETE -H "X-API-Key: mk_YOUR_TOKEN" \
"http://localhost:5770/api/v1/stores/global/totalUsers?namespace=sandbox"
CLI
# Установить значение (пространство по умолчанию "sandbox")
mockarty-cli store global set totalUsers 100
mockarty-cli store global set serviceName auth
# Прочитать хранилище
mockarty-cli store global get
# Удалить ключ
mockarty-cli store global delete totalUsers
Go
// Установить значения (используется пространство клиента по умолчанию "sandbox")
err := client.Stores().GlobalSet(context.Background(), "totalUsers", 100)
err = client.Stores().GlobalSet(context.Background(), "serviceName", "auth")
// Прочитать хранилище
store, err := client.Stores().GlobalGet(context.Background())
fmt.Println(store) // map[totalUsers:100 serviceName:auth ...]
// Удалить ключ
err = client.Stores().GlobalDelete(context.Background(), "totalUsers")
Python
# Установить значения (используется пространство клиента по умолчанию "sandbox")
client.stores.global_set("totalUsers", 100)
client.stores.global_set("serviceName", "auth")
# Или установить несколько значений за раз
client.stores.global_set_many({"totalUsers": 100, "serviceName": "auth"})
# Прочитать хранилище
store = client.stores.global_get()
print(store) # {"totalUsers": 100, "serviceName": "auth"}
# Удалить ключи
client.stores.global_delete("totalUsers")
Java
// Установить значения (используется пространство клиента по умолчанию "sandbox")
client.stores().globalSet("totalUsers", 100);
client.stores().globalSet("serviceName", "auth");
// Прочитать хранилище
Map<String, Object> store = client.stores().globalGet();
System.out.println(store);
// Удалить ключ
client.stores().globalDelete("totalUsers");
Хранилище цепочки
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| GET | /api/v1/stores/chain/:id?namespace=default |
пользователь (read) | Получить хранилище цепочки |
| POST | /api/v1/stores/chain/:id |
пользователь (write) | Установить пару ключ-значение: {"key": "...", "value": "...", "namespace": "..."} |
| DELETE | /api/v1/stores/chain/:id/:key?namespace=default |
пользователь (write) | Удалить ключ (ключ в URL-пути) |
5. API шаблонов
Загрузка шаблонов ответов для использования в моках через payloadTemplatePath.
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| GET | /api/v1/templates |
пользователь (read) | Список всех шаблонов |
| GET | /api/v1/templates/:fileName |
пользователь (read) | Скачать шаблон |
| POST | /api/v1/templates/:fileName |
пользователь (write) | Загрузить файл шаблона |
| DELETE | /api/v1/templates/:fileName |
пользователь (write) | Удалить шаблон |
Временное хранилище файлов
Временная загрузка файлов для использования в интерфейсе чата с агентом. Файлы автоматически удаляются через 30 минут.
Временные файлы доступны только загрузившему их пользователю или сервисному ключу и в выбранном namespace. Для чтения, удаления и импорта используйте ту же идентичность и namespace. Файлы истекают через 30 минут. При Redis файлы доступны на разных admin-узлах; InMemory хранит их на принявшем узле. Если включено шифрование данных, оно защищает содержимое и имена общих временных файлов. При заполнении хранилища возвращается 429, при его недоступности — 503. Не повторяйте импорт автоматически после неопределённого ответа.
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| POST | /api/v1/temp-files |
пользователь (write) | Загрузить временный файл |
| GET | /api/v1/temp-files/:fileId |
пользователь (read) | Скачать временный файл |
| DELETE | /api/v1/temp-files/:fileId |
пользователь (write) | Удалить временный файл |
Генерация из OpenAPI (сокращённая форма)
| Метод | Путь | Авторизация | Описание |
|---|---|---|---|
| POST | /api/v1/generators/openapi |
пользователь (write) | Генерация моков из OpenAPI-спецификации |
6. Руководство по CI/CD интеграции
Пошаговые примеры перенесены в «API-автоматизацию в CI/CD»: API-тесты, нагрузка, фаззинг, импорт и подготовка моков.
7. API тестирования API
Полнофункциональная платформа тестирования API (аналог Postman). Все эндпоинты под /api/v1/ и требуют аутентификации.
Коллекции
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/collections |
Создание коллекции |
| GET | /api/v1/api-tester/collections |
Список коллекций |
| GET | /api/v1/api-tester/collections/:id |
Получение коллекции |
| PUT | /api/v1/api-tester/collections/:id |
Обновление коллекции |
| DELETE | /api/v1/api-tester/collections/:id |
Удаление коллекции |
| POST | /api/v1/api-tester/collections/:id/restore |
Восстановление удалённой коллекции |
| POST | /api/v1/api-tester/collections/:id/duplicate |
Дублирование коллекции |
| DELETE | /api/v1/api-tester/collections/batch |
Пакетное удаление |
| GET | /api/v1/api-tester/collections/:id/export |
Экспорт коллекции (JSON) |
Примечание:
POST /api/v1/api-tester/collectionsпринимает необязательный query-параметр?namespace=. Без него — и без заголовкаX-Mockarty-Namespaceили токена, закреплённого за namespace, — коллекция молча создаётся в namespace по умолчаниюsandbox. Автоматизации следует всегда передавать?namespace=явно, чтобы коллекции не оседали там, где их трудно найти.
Совместный доступ к коллекциям
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/collections/:id/sharing/users |
Поделиться с пользователями |
| POST | /api/v1/api-tester/collections/:id/sharing/spaces |
Поделиться с пространствами имён |
| GET | /api/v1/api-tester/collections/:id/users |
Список пользователей коллекции |
| PUT | /api/v1/api-tester/collections/:id/users/:userId/role |
Установить роль пользователя |
| DELETE | /api/v1/api-tester/collections/:id/users/:userId |
Удалить пользователя |
| GET | /api/v1/api-tester/collections/:id/spaces |
Список общих пространств |
| DELETE | /api/v1/api-tester/collections/:id/spaces/:namespace |
Удалить пространство |
Пока коллекция находится в корзине, изменения доступа отклоняются. Удаление или изменение несуществующего доступа пользователя возвращает 404.
Прямой доступ пользователю можно выдать только действующему участнику
Пространства коллекции с включённой учётной записью. Шаринг не приглашает в
Team, не добавляет место и не возвращает доступ после исключения из
Пространства. Сначала пригласите коллегу. Целевое Пространство также должно
быть доступно тому, кто выдаёт доступ; наблюдатель не может выдать право
редактирования. Отзыв или отключение членства закрывает и прежние права.
Для поиска людей и получения профилей по ID нужно явно указать Пространство,
которое вызывающий пользователь может читать:
| Метод | Путь | Ввод |
|---|---|---|
| GET | /api/v1/api-tester/users/search?namespace={space}&q={text}&limit=20 |
Поиск участников Пространства; максимальный limit — 100 |
| POST | /api/v1/users/lookup?namespace={space} |
JSON {"userIds":["{user_id}"]}; не более 200 переданных ID |
Вместо query-параметра можно использовать X-Mockarty-Namespace или токен,
закреплённый за этим Пространством. Без явного контекста возвращается 400;
доступ к Пространству проверяется до выдачи профилей. Ответ содержит users
с полями id, username, fullName и, при наличии, email и avatarUrl.
Неизвестные, чужие, отключённые и удалённые ID пропускаются: ответ не
подтверждает существование глобальной учётной записи. Это не каталог для
поиска и приглашения незнакомых пользователей.
Запросы
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/collections/:id/requests |
Создание запроса |
| GET | /api/v1/api-tester/collections/:id/requests |
Список запросов в коллекции |
| GET | /api/v1/api-tester/requests/:id |
Получение запроса |
| PUT | /api/v1/api-tester/requests/:id |
Обновление запроса |
| DELETE | /api/v1/api-tester/requests/:id |
Удаление запроса |
| POST | /api/v1/api-tester/requests/execute |
Выполнение запроса (серверный режим) |
| POST | /api/v1/api-tester/requests/execute-client |
Выполнение для клиентского режима |
| GET | /api/v1/api-tester/requests/history |
История выполнения запросов |
| DELETE | /api/v1/api-tester/requests/batch |
Пакетное удаление запросов |
| PATCH | /api/v1/api-tester/requests/batch/move |
Пакетное перемещение запросов |
| POST | /api/v1/api-tester/collections/:id/requests/reorder |
Изменить порядок запросов в коллекции (тело: {"ids":["uuid","uuid",...]}) |
Окружения
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/environments |
Создание окружения |
| GET | /api/v1/api-tester/environments |
Список окружений |
| GET | /api/v1/api-tester/environments/active |
Получение активного окружения |
| GET | /api/v1/api-tester/environments/:id |
Получение окружения |
| PUT | /api/v1/api-tester/environments/:id |
Обновление окружения |
| DELETE | /api/v1/api-tester/environments/:id |
Удаление окружения |
| POST | /api/v1/api-tester/environments/:id/activate |
Установить как активное |
Запуски тестов
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/api-tester/test-runs |
Список запусков (поддерживает ?mode=&referenceId=&limit=&offset=) |
| GET | /api/v1/api-tester/test-runs/:id |
Детали запуска |
| DELETE | /api/v1/api-tester/test-runs/:id |
Удаление запуска |
| POST | /api/v1/api-tester/test-runs/:id/cancel |
Отмена запущенного теста |
| GET | /api/v1/api-tester/test-runs/:id/export |
Экспорт отчёта |
| POST | /api/v1/api-tester/reports/import |
Импорт отчёта |
| GET | /api/v1/test-runs/active |
Активные запуски всех режимов в namespace |
Режимы единой витрины запусков
Каждая строка из /api/v1/api-tester/test-runs содержит поле mode,
идентифицирующее источник запуска:
| Режим | Откуда | На что указывает referenceId |
|---|---|---|
functional |
API Tester (по умолчанию) | — |
load |
Нагрузочный движок | Perf-конфигурация |
fuzz |
Фаззинг-кампания | Fuzz-конфигурация |
chaos |
Chaos-эксперимент | Chaos-эксперимент |
contract |
Контрактная верификация | Запись реестра контрактов |
Примеры фильтрации:
# Все fuzz-кампании в namespace
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/api-tester/test-runs?mode=fuzz"
# Все запуски конкретного chaos-эксперимента
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/api-tester/test-runs?mode=chaos&referenceId=$EXPERIMENT_ID"
# Пагинация по функциональным запускам
curl -H "Authorization: Bearer $TOKEN" \
"$MOCKARTY_URL/api/v1/api-tester/test-runs?mode=functional&limit=50&offset=100"
Эквиваленты в SDK:
// Go
runs, err := client.TestRuns.ListWithOptions(ctx, mockarty.ListTestRunsOptions{
Mode: "fuzz",
ReferenceID: fuzzConfigID,
Limit: 50,
})
# Python
runs = client.test_runs.list(mode="chaos", reference_id=experiment_id, limit=50)
// Java
List<TestRun> runs = client.testRuns().listByMode("fuzz", fuzzConfigId, 50, 0);
# CLI
mockarty-cli test-runs list --mode chaos --reference-id "$EXPERIMENT_ID" --limit 50
Скрипты и выполнение
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/requests/execute-with-scripts |
Выполнение с пре/пост-скриптами |
| POST | /api/v1/api-tester/scripts/execute |
Запуск скрипта отдельно |
| POST | /api/v1/api-tester/collections/:id/execute |
Выполнение всей коллекции |
| POST | /api/v1/api-tester/collections/execute-multiple |
Выполнение нескольких коллекций |
| POST | /api/v1/api-tester/collections/execute-perf |
Запуск выбранных коллекций под нагрузкой |
| GET | /api/v1/api-tester/test-reports/:id |
Получение отчёта |
Для execute-perf передайте collectionIds сохранённых коллекций или элементы selection с collectionId и необязательным requestIds, чтобы выполнить определённые запросы. Замените ID коллекции в примере своим:
{
"collectionIds": ["00000000-0000-4000-8000-000000000001"],
"perfOptions": {"vus": 20, "duration": "1m", "rps": 100},
"useSSE": true
}
Без perfOptions используются 10 виртуальных пользователей и длительность 30 секунд. rps: 0 запускает тест без заданной частоты запросов. Необязательные поля: name, environmentId, environmentVariables, runnerId (предпочтительный раннер), ciTriggerId (сохранённый CI-триггер) и isDebug. Без полей окружения используется ваше активное окружение. Непустой объект environmentVariables заменяет значения окружения для этого запуска; явно указанный environmentId всё равно должен быть доступен. Для выбора раннера или CI нужен доступный сервис выполнения; иначе API возвращает HTTP 503.
Запуски через очередь возвращают HTTP 202 с taskId и status: "queued". Локальный запуск возвращает события SSE при useSSE: true или завершённый объект testRun в остальных случаях. isDebug: true выполняет тест без сохранения запуска в историю. Генерация нагрузки из коллекции поддерживает HTTP, GraphQL и SOAP; для включённых скриптов запроса, скриптов коллекции, multipart и двоичных тел нужен отдельный нагрузочный скрипт. Необработанное исключение скрипта помечает нагрузочный запуск как неуспешный; HTTP-метрики отражают только реальные запросы.
Коллекции, открытые из другого Space, можно просматривать и копировать, но нельзя выполнять в Space получателя. Отправка сохранённого запроса, запуск его скриптов, функциональный или нагрузочный запуск коллекции и создание расписания возвращают HTTP 403. Перед выполнением скопируйте коллекцию в свой Space. Коллекции с общим доступом внутри одного Space по-прежнему можно выполнять.
При копировании коллекции сохраняются её скрипты и шаблоны. После копирования в ваше Пространство они могут использовать его переменные и секреты при запуске. Перед запуском проверьте скопированную коллекцию.
Создание моков из коллекции также требует доступа к ней в вашем Space. Недоступный ID коллекции возвращает HTTP 404, общая коллекция из другого Space — HTTP 403 до чтения её запросов или истории.
Если сохранённый запрос выполняется в браузере, POST /api/v1/api-tester/scripts/execute принимает {"scriptType":"preRequest","requestId":"<id>","authorizeOnly":true} для проверки доступа без выполнения. При разрешённом доступе возвращается {"success":true}, для общей коллекции из другого Space — HTTP 403, для недоступного запроса — HTTP 404. Скрипты не запускаются, история не создаётся.
Вердикт скрипта содержит status (passed, failed, skipped или error), success, totalTests, passedTests, failedTests и skippedTests. При упавшей проверке success равен false, даже если JavaScript выполнился без исключения. /scripts/execute возвращает tests, logs и durationMs непосредственно; автономные тесты сохраняют объект result и поле duration в миллисекундах. Для проверки сохранённого запроса передайте requestId, чтобы использовать контекст его коллекции. Результат выполнения может содержать skipRequest: true, если скрипт до отправки пропустил запрос.
Для выполнения в браузере по этапам передайте executionMode: "client". Этап до отправки возвращает подготовленный requestData и scriptState; передайте это состояние этапу проверок вместе с фактическим responseData. Состояние содержит environmentId, environment, collectionVariables, requestVariables и runContext; его размер ограничен 1 МиБ. Пустой environmentId сохраняет выполнение без окружения. Оба этапа используют исходное окружение, даже если активный выбор изменился во время запроса. preScriptEnabled и testScriptEnabled управляют собственными фрагментами запроса; скрипты коллекции продолжают выполняться. Обычный предпросмотр скрипта выполняется отдельно и не сохраняет изменения окружения.
Автономные тесты
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/api-tester/tests |
Список тестов |
| POST | /api/v1/api-tester/tests |
Создание теста |
| GET | /api/v1/api-tester/tests/:id |
Получение теста |
| PUT | /api/v1/api-tester/tests/:id |
Обновление теста |
| DELETE | /api/v1/api-tester/tests/:id |
Удаление теста |
| POST | /api/v1/api-tester/tests/:id/run |
Запуск теста |
| POST | /api/v1/api-tester/tests/run |
Запуск теста инлайн |
Расписания (Cron)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/api-tester/schedules |
Список расписаний |
| POST | /api/v1/api-tester/schedules |
Создание расписания |
| GET | /api/v1/api-tester/schedules/:id |
Получение расписания |
| PUT | /api/v1/api-tester/schedules/:id |
Обновление расписания |
| DELETE | /api/v1/api-tester/schedules/:id |
Удаление расписания |
| POST | /api/v1/api-tester/schedules/:id/run |
Запуск расписания сейчас |
Чтение, изменение, удаление и ручной запуск расписания разрешены только его
владельцу в текущем пространстве. При создании, изменении и запуске Mockarty
также проверяет доступ владельца ко всем указанным коллекциям и окружению.
Неизвестный или недоступный ресурс не раскрывается. Если проверить доступ
невозможно из-за недоступности хранилища данных, запрос записи или запуска
возвращает 503 и не начинает работу. Перед автоматическим запуском доступ
проверяется повторно, поэтому отзыв доступа к коллекции блокирует отправку.
Импорт/экспорт
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/import/postman |
Импорт коллекции Postman |
| POST | /api/v1/api-tester/import/postman-env |
Импорт файла окружения Postman |
| POST | /api/v1/api-tester/import/openapi |
Импорт из OpenAPI-спецификации |
| POST | /api/v1/api-tester/import/wsdl |
Импорт из WSDL |
| POST | /api/v1/api-tester/import/grpc |
Импорт gRPC из .proto |
| POST | /api/v1/api-tester/import/graphql |
Импорт GraphQL-схемы |
| POST | /api/v1/api-tester/import/mcp |
Импорт инструментов MCP-сервера |
| POST | /api/v1/api-tester/import/har |
Импорт HAR-записи |
| POST | /api/v1/api-tester/import/soapui |
Импорт проекта SoapUI |
| POST | /api/v1/api-tester/import/jmx |
Импорт плана JMeter (.jmx) в коллекции |
| POST | /api/v1/api-tester/import/mockarty |
Импорт коллекции Mockarty |
| POST | /api/v1/api-tester/mock-from-response |
Генерация мока из ответа |
| POST | /api/v1/api-tester/mocks-from-collection |
Генерация моков из коллекции |
При импорте нативной коллекции Mockarty код 200 означает, что все элементы сохранены. Код 207 означает, что часть запросов или папок не сохранилась; содержимое несохранённой папки также пропускается. summary.failedCount показывает полное число, а failures содержит до 50 элементов. Прежний requestsCount учитывает все сохранённые строки, включая папки; summary.importedRequests учитывает только запросы. В ответе остаются collectionId и сохранённые элементы; проверьте их перед повторным импортом.
Вспомогательные эндпоинты протоколов
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/proxy/http |
Проксирование HTTP-запроса |
| POST | /api/v1/proxy/soap |
Проксирование SOAP-запроса |
| POST | /api/v1/proxy/grpc |
Проксирование gRPC-запроса |
| POST | /api/v1/api-tester/mcp/connect |
Подключение к MCP-серверу |
| POST | /api/v1/api-tester/mcp/tools/list |
Список инструментов MCP |
| POST | /api/v1/api-tester/mcp/tools/call |
Вызов инструмента MCP |
| POST | /api/v1/api-tester/mcp/resources/list |
Список ресурсов MCP |
| POST | /api/v1/api-tester/graphql/introspect |
Интроспекция GraphQL |
| POST | /api/v1/api-tester/grpc/discover |
Обнаружение gRPC-сервисов |
| POST | /api/v1/api-tester/soap/operations |
Список SOAP-операций из WSDL |
Прокси MCP проверяет адрес до запроса и при сетевом подключении, в том числе после перенаправлений. Доступ к частным адресам зависит от настроек сервера; адреса облачных метаданных остаются закрытыми.
Kafka Admin
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/kafka/metadata |
Метаданные кластера |
| POST | /api/v1/api-tester/kafka/topics |
Список топиков |
| POST | /api/v1/api-tester/kafka/topics/create |
Создание топика |
| POST | /api/v1/api-tester/kafka/topics/delete |
Удаление топика |
| POST | /api/v1/api-tester/kafka/consumer-groups |
Список групп потребителей |
RabbitMQ Admin
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/api-tester/rabbitmq/publish |
Публикация сообщения |
| POST | /api/v1/api-tester/rabbitmq/read |
Чтение сообщений из очереди |
| POST | /api/v1/api-tester/rabbitmq/metadata |
Метаданные брокера |
| POST | /api/v1/api-tester/rabbitmq/queues |
Список очередей |
| POST | /api/v1/api-tester/rabbitmq/queues/create |
Создание очереди |
| POST | /api/v1/api-tester/rabbitmq/queues/delete |
Удаление очереди |
| POST | /api/v1/api-tester/rabbitmq/queues/purge |
Очистка очереди |
| POST | /api/v1/api-tester/rabbitmq/exchanges |
Список обменников |
| POST | /api/v1/api-tester/rabbitmq/exchanges/create |
Создание обменника |
| POST | /api/v1/api-tester/rabbitmq/exchanges/delete |
Удаление обменника |
8. API нагрузочного тестирования
Встроенное нагрузочное тестирование с k6-совместимыми скриптами. Все эндпоинты под /api/v1/.
Конфигурации нагрузочных тестов
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/perf-configs |
Список конфигураций |
| GET | /api/v1/perf-configs/:id |
Получение конфигурации |
| POST | /api/v1/perf-configs |
Создание конфигурации |
| PUT | /api/v1/perf-configs/:id |
Обновление конфигурации |
| DELETE | /api/v1/perf-configs/:id |
Удаление конфигурации |
Запуск/остановка тестов
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/perf/run |
Запуск теста со скриптом |
| POST | /api/v1/perf/run-collection |
Запуск теста из коллекции |
| POST | /api/v1/perf/stop/:taskId |
Остановка запущенного теста |
| POST | /api/v1/perf/scripts |
Генерация k6-скрипта из конфигурации |
| POST | /api/v1/perf/scripts/from-request |
Генерация скрипта из запроса API Tester |
| POST | /api/v1/perf/scripts/from-har |
Конвертация HAR в скрипт |
| GET | /api/v1/perf/snippets |
Список сниппетов скриптов |
Результаты
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/perf-results |
Список всех результатов |
| GET | /api/v1/perf-results/:id |
Детали результата |
| DELETE | /api/v1/perf-results/:id |
Удаление результата |
| GET | /api/v1/perf-results/compare |
Сравнение результатов |
| GET | /api/v1/perf-results/history/:configId |
История результатов конфигурации |
| GET | /api/v1/perf-results/trend/:configId |
Данные тренда |
| GET | /api/v1/perf-results/group/:runGroupId |
Результаты по группе запуска |
| POST | /api/v1/perf-results/:id/ai-analyze |
AI-анализ результатов |
Расписания
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/perf-schedules |
Список расписаний |
| POST | /api/v1/perf-schedules |
Создание расписания |
| PUT | /api/v1/perf-schedules/:id |
Обновление расписания |
| DELETE | /api/v1/perf-schedules/:id |
Удаление расписания |
Задачи раннеров
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/runner-tasks |
Отправка задачи раннеру |
| GET | /api/v1/runner-tasks |
Список задач |
| GET | /api/v1/runner-tasks/:id |
Статус задачи |
| GET | /api/v1/runner-tasks/:id/queue-position |
Позиция в очереди |
| DELETE | /api/v1/runner-tasks/:id |
Отмена задачи |
| GET | /api/v1/runners |
Список доступных раннеров |
Для type: "performance" запрос POST /api/v1/runner-tasks требует configId. Сохранённая конфигурация должна принадлежать пространству вызывающего пользователя; Mockarty выполняет её скрипт и окружение, а необязательный объект options в запросе заменяет сохранённые параметры прогона. Для разовых inline-скриптов используйте высокоуровневое API нагрузочного тестирования.
9. API фаззинга
Фаззинг безопасности со встроенными категориями полезных нагрузок (SQL-инъекции, XSS и др.). Все эндпоинты под /api/v1/fuzzing/.
Сводка и полезные нагрузки
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/fuzzing/summary |
Сводка по дашборду фаззинга |
| GET | /api/v1/fuzzing/payload-categories |
Список категорий полезных нагрузок |
Конфигурации
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/fuzzing/configs |
Список конфигураций |
| GET | /api/v1/fuzzing/configs/:id |
Получение конфигурации |
| POST | /api/v1/fuzzing/configs |
Создание конфигурации |
| PUT | /api/v1/fuzzing/configs/:id |
Обновление конфигурации |
| DELETE | /api/v1/fuzzing/configs/:id |
Удаление конфигурации |
| POST | /api/v1/fuzzing/configs/reorder |
Изменение порядка конфигураций |
Импорт
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/fuzzing/import/curl |
Импорт из команды cURL |
| POST | /api/v1/fuzzing/import/openapi |
Импорт из OpenAPI-спецификации |
| POST | /api/v1/fuzzing/import/collection |
Импорт из коллекции API Tester |
| POST | /api/v1/fuzzing/import/recorder |
Импорт из сессии рекордера |
| POST | /api/v1/fuzzing/import/mock |
Импорт из определения мока |
Обнаружение протоколов
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/fuzzing/introspect/graphql |
Интроспекция GraphQL для фаззинга |
| POST | /api/v1/fuzzing/discover/grpc |
Обнаружение gRPC-сервисов для фаззинга |
Запуски и результаты
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/fuzzing/run |
Запуск фаззинга |
| POST | /api/v1/fuzzing/run/:id/stop |
Остановка фаззинга |
| POST | /api/v1/fuzzing/quick-fuzz |
Быстрый фаззинг (создание + запуск) |
| GET | /api/v1/fuzzing/results |
Список результатов |
| GET | /api/v1/fuzzing/results/:id |
Детали результата |
| DELETE | /api/v1/fuzzing/results/:id |
Удаление результата |
аномалии
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/fuzzing/findings |
Список анномалий |
| GET | /api/v1/fuzzing/findings/:id |
Детали аномалии |
| PUT | /api/v1/fuzzing/findings/:id/triage |
Триаж аномалии (установка критичности, статуса) |
| POST | /api/v1/fuzzing/findings/:id/replay |
Повтор запроса аномалии |
| POST | /api/v1/fuzzing/findings/:id/analyze |
AI-анализ аномалии |
| POST | /api/v1/fuzzing/findings/batch-analyze |
AI-анализ нескольких анномалий |
| POST | /api/v1/fuzzing/findings/batch-triage |
AI пакетный триаж |
| POST | /api/v1/fuzzing/findings/export |
Экспорт анномалий |
Расписания
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/fuzzing/schedules |
Список расписаний |
| GET | /api/v1/fuzzing/schedules/:id |
Получение расписания |
| POST | /api/v1/fuzzing/schedules |
Создание расписания |
| PUT | /api/v1/fuzzing/schedules/:id |
Обновление расписания |
| DELETE | /api/v1/fuzzing/schedules/:id |
Удаление расписания |
10. API рекордера
Запись HTTP-трафика (на основе прокси). Все эндпоинты под /api/v1/recorder/.
Сессии
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/recorder/start |
Начало сессии записи |
| GET | /api/v1/recorder/sessions |
Список сессий |
| GET | /api/v1/recorder/:id |
Детали сессии |
| POST | /api/v1/recorder/:id/stop |
Остановка сессии |
| POST | /api/v1/recorder/:id/restart |
Перезапуск сессии |
| DELETE | /api/v1/recorder/:id |
Удаление сессии |
Пример начала сессии:
cURL
curl -X POST "$BASE/recorder/start" \
-H "X-API-Key: $TOKEN" \
-d '{
"targetUrl": "https://api.example.com",
"port": 8888,
"name": "API Recording"
}'
Go
session, err := client.Recorder().StartRecording(context.Background(), &mockarty.RecorderSession{
TargetURL: "https://api.example.com",
Port: 8888,
Name: "API Recording",
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Сессия запущена: %s\n", session.ID)
Python
session = client.recorder.start_recording({
"targetUrl": "https://api.example.com",
"port": 8888,
"name": "API Recording",
})
print(f"Сессия запущена: {session.id}")
Java
RecorderSession session = client.recorder().startRecording(Map.of(
"targetUrl", "https://api.example.com",
"port", 8888,
"name", "API Recording"
));
System.out.println("Сессия запущена: " + session.getId());
Совет: Те же операции доступны через
mockarty-cli recorder ...— справочник команд см. в Руководстве CLI.
Записи
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/recorder/:id/entries |
Список записанных запросов |
| PATCH | /api/v1/recorder/:id/entries/:entryId |
Аннотация записи |
| POST | /api/v1/recorder/:id/entries/:entryId/replay |
Повтор запроса |
Модификации (перезапись запросов/ответов)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/recorder/:id/modifications |
Получение правил модификации |
| PUT | /api/v1/recorder/:id/modifications |
Обновление правил |
Экспорт
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/recorder/:id/export |
Экспорт в HAR |
| POST | /api/v1/recorder/:id/export-perf |
Экспорт как скрипт нагрузки |
| POST | /api/v1/recorder/:id/export-test |
Экспорт как тестовый скрипт |
| POST | /api/v1/recorder/:id/export-collection |
Экспорт как коллекция API Tester |
| POST | /api/v1/recorder/:id/mocks |
Создание моков из записей |
AI-анализ
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/recorder/:id/ai-analyze |
AI-анализ трафика сессии |
| POST | /api/v1/recorder/:id/ai-scenarios |
AI-генерация тестовых сценариев |
Конфигурация
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/recorder/ports |
Список используемых портов |
| GET | /api/v1/recorder/port-check |
Проверка доступности порта |
| GET | /api/v1/recorder/configs |
Список конфигураций рекордера |
| POST | /api/v1/recorder/configs |
Сохранение конфигурации |
| POST | /api/v1/recorder/configs/import |
Импорт конфигурации |
| GET | /api/v1/recorder/configs/:id/export |
Экспорт конфигурации |
| DELETE | /api/v1/recorder/configs/:id |
Удаление конфигурации |
| GET | /api/v1/recorder/ca/status |
Статус CA-сертификата |
| POST | /api/v1/recorder/ca/generate |
Генерация CA-сертификата |
| GET | /api/v1/recorder/ca/download |
Скачивание CA-сертификата |
WebSocket
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/recorder/:id/ws |
WebSocket для потоковой передачи записей |
11. API контрактного тестирования
Контрактное тестирование проверяет, что ваши моки остаются согласованными со спецификациями реальных API. Поддерживаются: валидация по OpenAPI, потребительские контракты (совместимость с Pact), обнаружение дрейфа API (API drift) и реестр API (внутренний маркетплейс). Все эндпоинты находятся под префиксом /api/v1/contract/.
Валидация моков
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/contract/validate-mocks |
Проверить моки на соответствие OpenAPI-спецификации |
| POST | /api/v1/contract/verify-provider |
Проверить провайдера по потребительским контрактам |
| POST | /api/v1/contract/check-compatibility |
Проверить обратную совместимость между версиями API |
| POST | /api/v1/contract/validate-payload |
Проверить отдельное тело мока по схеме |
| POST | /api/v1/contract/detect-drift |
Обнаружить дрейф API между моками и живыми эндпоинтами |
Конфигурации и регулярные запуски
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/contract/configs |
Список конфигураций контрактного тестирования |
| POST | /api/v1/contract/configs |
Создать/сохранить конфигурацию |
| DELETE | /api/v1/contract/configs/:id |
Удалить конфигурацию |
| POST | /api/v1/contract/configs/:id/run |
Запустить конфигурацию немедленно |
Результаты и тренды
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/contract/results |
Список результатов контрактного тестирования |
| GET | /api/v1/contract/results/:id |
Получить конкретный результат |
| GET | /api/v1/contract/trends |
Получить данные тренда контрактного тестирования во времени |
аномалии (AI-анализ)
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/contract/findings/analyze |
AI-анализ анномалий контрактного тестирования |
| POST | /api/v1/contract/findings/auto-triage |
Автоматическая сортировка анномалий с помощью AI |
| POST | /api/v1/contract/findings/export |
Экспорт анномалий |
Потребительские контракты (Pact)
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/contract/pacts |
Опубликовать потребительский контракт (Pact) |
| GET | /api/v1/contract/pacts |
Список опубликованных контрактов |
| GET | /api/v1/contract/pacts/:id |
Получить конкретный Pact |
| DELETE | /api/v1/contract/pacts/:id |
Удалить Pact |
| POST | /api/v1/contract/pacts/verify |
Проверить провайдера по Pact-контрактам |
| POST | /api/v1/contract/pacts/can-i-deploy |
Проверить, безопасно ли деплоить версию (can-i-deploy) |
| GET | /api/v1/contract/pacts/verifications |
Список результатов верификации Pact |
| POST | /api/v1/contract/pacts/:id/mocks |
Сгенерировать моки из Pact-контракта |
Реестр API (внутренний маркетплейс)
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/contract/registry |
Опубликовать API в реестре |
| GET | /api/v1/contract/registry |
Список зарегистрированных API |
| GET | /api/v1/contract/registry/namespaces |
Список пространств имён реестра |
| GET | /api/v1/contract/registry/:id |
Получить зарегистрированный API |
| PUT | /api/v1/contract/registry/:id |
Обновить зарегистрированный API |
| DELETE | /api/v1/contract/registry/:id |
Удалить зарегистрированный API |
| POST | /api/v1/contract/registry/:id/generate-mocks |
Сгенерировать моки из записи реестра |
| POST | /api/v1/contract/registry/:id/subscribe |
Подписаться на изменения API |
| GET | /api/v1/contract/registry/:id/subscribers |
Список подписчиков API |
| POST | /api/v1/contract/registry/:id/check-impact |
Оценить влияние изменений API на подписчиков |
Подписки
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/contract/subscriptions |
Список ваших подписок |
| DELETE | /api/v1/contract/subscriptions/:id |
Отписаться от API |
12. API Chaos Engineering
Kubernetes-нативный chaos engineering для инъекции отказов и проверки отказоустойчивости. Создавайте эксперименты для внесения отказов (убийство подов, сетевые задержки, нагрузка на ресурсы) в ваши кластеры и наблюдайте за поведением сервисов. Все эндпоинты находятся под префиксом /api/v1/chaos/.
Пресеты
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/presets |
Список доступных пресетов chaos-экспериментов |
Эксперименты
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/experiments |
Список экспериментов (фильтры: ?namespace=, ?status=, ?limit=, ?offset=) |
| GET | /api/v1/chaos/experiments/:id |
Получить детали эксперимента |
| POST | /api/v1/chaos/experiments |
Создать новый chaos-эксперимент |
| PUT | /api/v1/chaos/experiments/:id |
Обновить эксперимент |
| DELETE | /api/v1/chaos/experiments/:id |
Удалить эксперимент |
| POST | /api/v1/chaos/experiments/:id/run |
Запустить эксперимент |
| POST | /api/v1/chaos/experiments/:id/abort |
Прервать выполняющийся эксперимент |
| GET | /api/v1/chaos/experiments/:id/metrics |
Получить метрики эксперимента |
| GET | /api/v1/chaos/experiments/:id/events |
Получить таймлайн событий эксперимента |
| GET | /api/v1/chaos/experiments/:id/report |
Получить отчёт эксперимента |
| GET | /api/v1/chaos/experiments/:id/report/download |
Скачать отчёт эксперимента (?format=html|json|junit|allure) |
| GET | /api/v1/chaos/experiments/:id/snapshot |
Снимок состояния кластера на момент эксперимента |
Очередь экспериментов
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/queue/:clusterId |
Получить статус очереди для кластера |
Инфраструктурные профили
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/profiles |
Список инфраструктурных профилей (фильтр: ?namespace=) |
| POST | /api/v1/chaos/profiles |
Создать инфраструктурный профиль (с kubeconfig) |
| PUT | /api/v1/chaos/profiles/:id |
Обновить профиль |
| DELETE | /api/v1/chaos/profiles/:id |
Удалить профиль |
| POST | /api/v1/chaos/profiles/:id/test |
Проверить подключение к кластеру |
| POST | /api/v1/chaos/profiles/:id/connect |
Подключиться к кластеру |
| POST | /api/v1/chaos/profiles-test |
Проверить kubeconfig без сохранения профиля |
Chaos Operator
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/operator/status |
Получить статус Chaos Operator в кластере |
| POST | /api/v1/chaos/operator/manifest |
Сгенерировать манифест установки оператора |
| POST | /api/v1/chaos/operator/install |
Установить Chaos Operator в кластер |
Ресурсы Kubernetes
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/chaos/clusters/:id/topology |
Получить топологию кластера |
| GET | /api/v1/chaos/pods/:namespace/:name |
Получить детали пода |
| GET | /api/v1/chaos/pods/:namespace/:name/logs |
Получить логи пода |
| DELETE | /api/v1/chaos/pods/:namespace/:name |
Убить под |
| GET | /api/v1/chaos/deployments/:namespace/:name |
Получить детали деплоймента |
| POST | /api/v1/chaos/deployments/:namespace/:name/scale |
Масштабировать деплоймент |
| POST | /api/v1/chaos/deployments/:namespace/:name/restart |
Перезапустить деплоймент |
| GET | /api/v1/chaos/configmaps/:namespace |
Список ConfigMap |
| GET | /api/v1/chaos/configmaps/:namespace/:name |
Получить ConfigMap |
| PUT | /api/v1/chaos/configmaps/:namespace/:name |
Обновить ConfigMap |
| GET | /api/v1/chaos/services/:namespace |
Список сервисов |
| GET | /api/v1/chaos/crds |
Список Custom Resource Definitions |
| GET | /api/v1/chaos/crds/:group/:version/:resource |
Список ресурсов CRD |
| GET | /api/v1/chaos/events/:namespace |
Список событий Kubernetes |
13. API администрирования
Эндпоинты только для администраторов (роль admin). Префикс: /api/v1/admin/.
Управление пользователями
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/users |
Список пользователей |
| POST | /api/v1/admin/users |
Создание пользователя |
| PUT | /api/v1/admin/users/:id |
Обновление пользователя |
| DELETE | /api/v1/admin/users/:id |
Удаление пользователя |
| PUT | /api/v1/admin/users/:id/password |
Установка пароля |
| POST | /api/v1/admin/users/:id/disable |
Деактивация пользователя |
| POST | /api/v1/admin/users/:id/enable |
Активация пользователя |
Управление пространствами имён (Админ)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/namespaces |
Список пространств с метаданными |
| DELETE | /api/v1/admin/namespaces/:namespace |
Удаление пространства |
| POST | /api/v1/admin/namespaces/:namespace/restore |
Восстановление пространства |
| GET | /api/v1/admin/namespaces/:namespace/users |
Список пользователей пространства |
| POST | /api/v1/admin/namespaces/:namespace/users |
Добавление пользователя |
| DELETE | /api/v1/admin/namespaces/:namespace/users/:user_id |
Удаление пользователя |
| PUT | /api/v1/admin/namespaces/:namespace/users/:user_id/role |
Обновление роли |
Политики очистки
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/namespaces/:namespace/cleanup-policy |
Получение политики очистки |
| PUT | /api/v1/admin/namespaces/:namespace/cleanup-policy |
Установка политики |
| GET | /api/v1/admin/cleanup-settings/:type |
Глобальные настройки очистки |
| PUT | /api/v1/admin/cleanup-settings/:type |
Обновление глобальных настроек |
Настройки LLM/AI
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/llm-settings |
Получение глобальных настроек LLM |
| PUT | /api/v1/admin/llm-settings |
Сохранение настроек LLM |
| GET | /api/v1/admin/llm-profiles |
Список профилей LLM |
| GET | /api/v1/admin/llm-profiles/:id |
Получение профиля LLM |
| POST | /api/v1/admin/llm-profiles |
Создание профиля LLM |
| PUT | /api/v1/admin/llm-profiles/:id |
Обновление профиля |
| DELETE | /api/v1/admin/llm-profiles/:id |
Удаление профиля |
| GET | /api/v1/admin/llm-usage |
Агрегация токенов LLM, физических ресурсов и зафиксированной стоимости |
| GET | /api/v1/admin/llm-usage/statement.csv |
Выгрузка ограниченной выписки из единого неизменяемого журнала потребления в CSV |
| POST | /api/v1/admin/llm-usage/reconciliations/:reservationId |
Сверка отправленного UNKNOWN-исхода ресурса по авторитетным данным провайдера |
| POST | /api/v1/admin/llm-usage/:eventId/refund |
Добавление идемпотентного полного возврата клиенту |
| GET | /api/v1/admin/llm-prices |
Список неизменяемых версий цен LLM и ресурсов |
| POST | /api/v1/admin/llm-prices |
Добавление версии цены LLM или ресурса с датой действия |
| GET | /api/v1/admin/llm-budgets |
Бюджеты рабочего пространства, продукта и миссии с фактом и резервом |
| POST | /api/v1/admin/llm-budgets |
Создание бюджета с допуском до вызова LLM |
| PUT | /api/v1/admin/llm-budgets/:id |
Изменение политики без подмены накопленного расхода |
| GET | /api/v1/admin/agent-settings |
Получение настроек AI-агента |
| PUT | /api/v1/admin/agent-settings |
Обновление настроек AI-агента |
Каждая строка стоимости по валюте несёт commercialTermsApplied. Значение
false означает, что ни платформенный сбор, ни наценка, ни налог, ни скидка в
этой сводке не применялись: стоимость для клиента равна провайдерской, и строка
записывает, во что работа обошлась, а не за сколько продана. Про равенство сумм
признак ничего не утверждает: возврат пишет отрицательную клиентскую стоимость
без коммерческих компонентов, поэтому в области с возвратами клиентская сумма
ниже, а признак остаётся false.
Каждая строка бюджета несёт softLimitBreached, вычисляемый на чтении из
потраченного плюс зарезервированного. Мягкий предел намеренно ничего не
останавливает — отказывает жёсткий, — поэтому это единственное место, где его
пересечение видно.
Ответ по потреблению также содержит стоимость провайдера и клиента, маржу,
списание из включённой квоты/предоплаты/перерасхода, прогноз на 30 дней,
стоимость по исходам, число событий/единиц ресурсов и счётчики сверки резервов.
Поле unpricedCalls сохраняет прежнее значение — только вызовы LLM/эмбеддингов;
unpricedEvents считает все события единого реестра без цены. Счётчики ресурсов
в строке стоимости относятся к оценённым событиям в этой валюте.
resourceTotals группирует всё потребление ресурсов, с ценой и без неё, по
eventKind и unit, указывая число events и целое значение quantity.
reconciliation всегда относится ко всей установке, даже если строки
потребления отфильтрованы; это явно указано полем
reconciliationScope: "global". Блок считает резервы LLM и физических
ресурсов. Счётчик unknown
означает уже отправленную работу с неоднозначным исходом: резерв сохраняется до
авторитетного завершения, а UI показывает её отдельно от ещё не отправленных
резервов. Исправная запись в очереди доставки не считается расхождением;
необрабатываемая или отсутствующая запись увеличивает missingUsageEvent.
Сверка намеренно доступна только администратору через UI/REST и не добавлена в
MCP, SDK или CLI: авторитетное решение о платном эффекте должно оставаться
явным действием оператора-человека.
В CSV столбец resource содержит SKU инструмента или runner-задачи, а model
сохранён для обратной совместимости. Цены и события потребления
неизменяемы; политика бюджета редактируется, но spentMicros и
reservedMicros изменяет только сервер.
GET /llm-prices сохраняет цены LLM в prices, а цены физических ресурсов
возвращает в добавочном массиве resourcePrices. Фильтры:
eventKind=tool_call|runner_seconds|storage_byte_seconds|egress_bytes,
provider, resource и unit. Для
нового тарифа ресурса передайте eventKind, provider, resource,
единицу calls, seconds, byte_seconds или bytes, currency, effectiveFrom,
providerMicrosPerUnit и customerMicrosPerUnit. Суммы — целые
микроединицы валюты за объявленную единицу.
curl -X POST "$MOCKARTY_URL/api/v1/admin/llm-prices" \
-H "X-API-Key: $MOCKARTY_API_TOKEN" -H "Content-Type: application/json" \
-d '{"eventKind":"tool_call","provider":"mockarty-agent","resource":"run_api_test","unit":"calls","currency":"USD","effectiveFrom":"2026-08-01T00:00:00Z","providerMicrosPerUnit":250000,"customerMicrosPerUnit":500000}'
Go SDK
prices, err := client.Economics().ListResourcePrices(ctx, mockarty.ResourcePriceQuery{
EventKind: "tool_call", Provider: "mockarty-agent", Resource: "run_api_test", Unit: "calls",
})
Python SDK
prices = client.economics.list_resource_prices(
event_kind="tool_call", provider="mockarty-agent", resource="run_api_test", unit="calls"
)
Java SDK
ResourcePriceList prices = client.economics().listResourcePrices(
"tool_call", "mockarty-agent", "run_api_test", "calls", 100);
# CLI: потребление, новая цена и месячный жёсткий бюджет
mockarty economics usage --group-by mission --days 30
mockarty economics statement --namespace sandbox --output statement.csv
mockarty economics refund --event-id 11111111-1111-1111-1111-111111111111 \
--reason "провайдер вернул некорректный ответ"
mockarty economics prices append --provider openai --model gpt-4o-mini \
--currency USD --effective-from 2026-08-01T00:00:00Z --input 0.15 --output 0.60
mockarty economics prices append --kind tool_call --provider mockarty-agent \
--resource run_api_test --unit calls --currency USD \
--effective-from 2026-08-01T00:00:00Z --provider-cost 0.25 --customer-price 0.50
mockarty economics budgets set --namespace sandbox --scope workspace \
--period-start 2026-08-01T00:00:00Z --period-end 2026-09-01T00:00:00Z \
--hard 100 --require-price
В Go, Python и Java SDK те же операции находятся в группе
Economics / economics. Для тарифов ресурсов используйте
ListResourcePrices / list_resource_prices и
AppendResourcePrice / append_resource_price; прежние ListPrices и
AppendPrice остаются специфичными для LLM.
Настройки электронной почты
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/email/config |
Получение конфигурации SMTP |
| PUT | /api/v1/admin/email/config |
Обновление конфигурации |
| POST | /api/v1/admin/email/test |
Отправка тестового письма |
| POST | /api/v1/admin/email/ping |
Проверка SMTP-сервера |
| POST | /api/v1/admin/email/broadcast |
Рассылка пользователям |
| GET | /api/v1/admin/email/events |
Список почтовых событий |
| GET | /api/v1/admin/email/templates |
Список шаблонов писем |
| PUT | /api/v1/admin/email/templates |
Создание/обновление шаблона |
| DELETE | /api/v1/admin/email/templates/:slug |
Удаление шаблона |
| POST | /api/v1/admin/email/templates/preview |
Предварительный просмотр |
Управление лицензиями
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/admin/licenses/activate |
Активация лицензионного ключа |
| POST | /api/v1/admin/licenses/import |
Импорт файла лицензии |
| GET | /api/v1/admin/licenses |
Список лицензий |
| GET | /api/v1/admin/licenses/:id |
Детали лицензии |
| POST | /api/v1/admin/licenses/:id/revoke |
Отзыв лицензии |
| GET | /api/v1/admin/licenses/status |
Сводка по лицензиям |
| GET | /api/v1/admin/licenses/usage |
Статистика использования |
| GET | /api/v1/admin/licenses/combined-limits |
Совмещённые лимиты |
Провайдеры идентификации
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/auth/providers |
Список провайдеров |
| POST | /api/v1/admin/auth/providers |
Создание провайдера (OAuth, LDAP, SAML) |
| PUT | /api/v1/admin/auth/providers/:id |
Обновление провайдера |
| DELETE | /api/v1/admin/auth/providers/:id |
Удаление провайдера |
| POST | /api/v1/admin/auth/ldap/test-connection |
Проверка подключения LDAP |
Управление резервными копиями
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/backups/configs |
Список конфигураций бэкапов |
| POST | /api/v1/admin/backups/configs |
Создание конфигурации |
| PUT | /api/v1/admin/backups/configs/:id |
Обновление конфигурации |
| DELETE | /api/v1/admin/backups/configs/:id |
Удаление конфигурации |
| GET | /api/v1/admin/backups/configs/:id/backups |
Список бэкапов конфигурации |
| POST | /api/v1/admin/backups/create |
Создать бэкап сейчас |
| GET | /api/v1/admin/backups/download |
Скачать файл бэкапа |
| POST | /api/v1/admin/backups/restore |
Восстановление из бэкапа |
| DELETE | /api/v1/admin/backups/delete |
Удаление бэкапа |
Мониторинг базы данных
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/database/health |
Проверка здоровья БД |
| GET | /api/v1/admin/database/health-dashboard |
Полный дашборд здоровья |
| GET | /api/v1/admin/database/indexes |
Список индексов |
| GET | /api/v1/admin/database/indexes/unused |
Поиск неиспользуемых индексов |
| DELETE | /api/v1/admin/database/indexes/unused |
Удаление неиспользуемых индексов |
| GET | /api/v1/admin/database/tables |
Список таблиц со статистикой |
| GET | /api/v1/admin/database/maintenance |
Рекомендации по обслуживанию |
| POST | /api/v1/admin/database/maintenance |
Автоматическое обслуживание |
Вебхуки
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/webhooks |
Список вебхуков администратора |
| POST | /api/v1/admin/webhooks |
Создание вебхука |
| DELETE | /api/v1/admin/webhooks/:id |
Удаление вебхука |
Аудит и задачи
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/audit/export |
Экспорт журнала аудита (csv, json, syslog, cef) |
| GET | /api/v1/admin/jobs/executions |
Список выполнений задач |
| GET | /api/v1/admin/jobs/statistics |
Статистика задач |
| POST | /api/v1/admin/jobs/trigger |
Ручной запуск задачи |
| GET | /api/v1/admin/ai-audit |
Журнал использования AI |
| GET | /api/v1/admin/ai-audit/export |
Экспорт журнала AI (CSV) |
Телеметрия
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/telemetry-settings |
Получение настроек телеметрии |
| PUT | /api/v1/admin/telemetry-settings |
Обновление настроек |
MCP Marketplace (Админ)
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/admin/mcp-servers |
Список MCP-серверов |
| POST | /api/v1/admin/mcp-servers |
Добавление MCP-сервера |
| GET | /api/v1/admin/mcp-servers/:id |
Получение MCP-сервера |
| PUT | /api/v1/admin/mcp-servers/:id |
Обновление MCP-сервера |
| DELETE | /api/v1/admin/mcp-servers/:id |
Удаление MCP-сервера |
| GET | /api/v1/admin/mcp-servers/:id/tools |
Список инструментов сервера |
| PUT | /api/v1/admin/mcp-servers/:id/tools/:toolName |
Переключение инструмента |
| POST | /api/v1/admin/mcp-servers/:id/check |
Проверка подключения |
| POST | /api/v1/admin/mcp-servers/:id/refresh |
Обновление инструментов |
Интеграционные токены
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/integrations |
Список интеграционных токенов |
| POST | /api/v1/integrations |
Создание интеграционного токена (админ) |
| DELETE | /api/v1/integrations/:id |
Удаление интеграции |
| POST | /api/v1/integrations/:id/revoke |
Отзыв токена |
| POST | /api/v1/integrations/:id/rotate |
Ротация токена |
| GET | /api/v1/integrations/status |
Статус раннеров |
| POST | /api/v1/integrations/namespace/:ns |
Создание интеграции пространства |
| POST | /api/v1/runners/register |
Регистрация раннер-агента |
Учётные данные интеграции действуют 90 дней с момента создания или ротации.
Ответы создания и ротации возвращают одноразовый token вместе с
credentialExpiresAt; до этой даты выполните ротацию и замените секрет
компонента.
14. Утилиты
Конвертеры (без аутентификации)
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/utils/convert-xml-to-json |
Конвертация XML в JSON |
| POST | /api/v1/utils/convert-txt-to-base64 |
Кодирование текста в Base64 |
| POST | /api/v1/utils/extract-jpath |
Извлечение значений через JsonPath |
Генерация моков из спецификаций
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/generators/openapi/preview |
Предпросмотр моков из OpenAPI |
| POST | /api/v1/generators/openapi |
Генерация моков из OpenAPI |
| POST | /api/v1/generators/soap/preview |
Предпросмотр моков из WSDL |
| POST | /api/v1/generators/soap |
Генерация моков из WSDL |
| POST | /api/v1/generators/grpc/preview |
Предпросмотр моков из .proto |
| POST | /api/v1/generators/grpc |
Генерация моков из .proto |
| POST | /api/v1/generators/graphql/preview |
Предпросмотр моков из GraphQL |
| POST | /api/v1/generators/graphql |
Генерация моков из GraphQL |
| POST | /api/v1/generators/har/preview |
Предпросмотр моков из HAR |
| POST | /api/v1/generators/har |
Генерация моков из HAR |
| POST | /api/v1/generators/mcp/preview |
Предпросмотр моков из MCP |
| POST | /api/v1/generators/mcp |
Генерация моков из MCP |
| POST | /api/v1/generators/asyncapi/preview |
Предпросмотр messaging-моков из AsyncAPI |
| POST | /api/v1/generators/asyncapi |
Генерация Kafka/RabbitMQ/NATS-моков из AsyncAPI |
| POST | /api/v1/generators/socket |
Генерация Socket-моков |
| POST | /api/v1/generators/spec |
Сборка OpenAPI 3.0 или AsyncAPI-документа ИЗ существующих моков |
Обратное направление — спецификация из уже имеющихся моков:
curl -X POST "$BASE/generators/spec" \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"format":"openapi","namespace":"sandbox","tags":["billing"],"title":"Billing mocks","version":"1.0.0"}'
format — openapi (HTTP-моки → OpenAPI 3.0) или asyncapi (Kafka/RabbitMQ/NATS-моки → AsyncAPI 2.6). Необязательные фильтры сужают набор: folderId, tags (мок должен нести все перечисленные), mockIds; title, version и serverUrl заполняют info и servers документа. В ответе — документ как JSON-значение в spec, массив warnings (mockId, route, reason по каждому моку, который не удалось выразить) и stats (considered, exported). Нужен доступ на чтение к пространству имён; каждая выгрузка пишется в аудит-лог.
Канал AsyncAPI, который нельзя описать одним адресом, несёт и то, чем он является: x-mockarty-protocol (kafka, rabbitmq, nats), x-mockarty-address (topic, queue, routingKey, subject), а для RabbitMQ — x-mockarty-exchange и x-mockarty-routing-key, потому что имя очереди не говорит, какой обменник и какой ключ маршрутизации выбирают этот мок. Если отправить такой документ обратно в /api/v1/generators/asyncapi, мок восстанавливается таким, каким был выгружен. Канал с протоколом, который генератор не умеет выразить (например socket или smtp), пропускается с предупреждением и названием протокола — вместо того чтобы стать Kafka-моком, отвечающим на трафик, для которого его не выгружали.
AI-функции
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/v1/ai/generate-test-script |
Генерация тестового скрипта (AI) |
| POST | /api/v1/ai/generate-perf-script |
Генерация скрипта нагрузки (AI) |
| POST | /api/v1/ai/diagnose-error |
Диагностика ошибки (AI) |
| POST | /api/v1/ai/generate-mock |
Генерация мока по описанию (AI) |
| POST | /api/v1/ai/improve-mock |
Улучшение существующего мока (AI) |
| POST | /api/v1/ai/analyze-test-results |
Анализ результатов тестов (AI) |
| POST | /api/v1/ai/analyze-test-run-report |
Анализ отчёта запуска (AI) |
Уведомления
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/notifications |
Список уведомлений |
| GET | /api/v1/notifications/unread-count |
Количество непрочитанных |
| POST | /api/v1/notifications/:id/read |
Отметить как прочитанное |
| POST | /api/v1/notifications/read-all |
Отметить все прочитанными |
| DELETE | /api/v1/notifications/:id |
Удаление уведомления |
| GET | /api/v1/notifications/preferences |
Получение настроек |
| PUT | /api/v1/notifications/preferences |
Обновление настроек |
Задачи агента
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/agent/tasks |
Список задач агента |
| POST | /api/v1/agent/tasks |
Отправка задачи |
| DELETE | /api/v1/agent/tasks |
Очистить все задачи агента |
| GET | /api/v1/agent/tasks/:id |
Детали задачи |
| DELETE | /api/v1/agent/tasks/:id |
Удаление конкретной задачи |
| POST | /api/v1/agent/tasks/:id/cancel |
Отмена выполняемой задачи |
| POST | /api/v1/agent/tasks/:id/rerun |
Перезапуск завершённой задачи |
| GET | /api/v1/agent/tasks/:id/export |
Экспорт результата задачи |
| GET | /api/v1/agent/tasks/:id/events |
SSE-поток событий задачи |
| POST | /api/v1/agent/tasks/:id/tool-receipts/:receiptKey/reconcile |
Уточнение внешнего действия после проверки целевой системы |
Уточнение внешнего действия
Если агент отправил неидемпотентное внешнее действие, но потерял ответ, Mockarty
приостанавливает автоматическое восстановление и показывает Требует проверки
в деталях задачи. Сначала проверьте реальную целевую систему, затем выберите один
результат:
already_applied— внешняя система подтверждает, что действие выполнено;mark_failed— внешняя система подтверждает, что действие не выполнено, и
задача должна остаться терминальной;retry_once— внешняя система подтверждает отсутствие эффекта, поэтому
Mockarty может выполнить ровно одну новую физическую попытку.
Возьмите receiptKey, version и toolName из
GET /api/v1/agent/tasks/:id. В этом же ответе есть
canReconcileToolReceipts, toolReceiptRetryAllowed и, при блокировке,
toolReceiptReconcileBlockedReason. Владелец задачи видит все квитанции, но для
записи решения именно его учётной записи нужно право Coder → Deploy в
namespace. Решения становятся доступны после остановки задачи. Для отменённой
задачи можно записать already_applied или mark_failed, но нельзя запустить
retry_once. UI объясняет эти состояния вместо неработающей кнопки. Для
повторов одного решения используйте тот же
idempotencyKey. Ответ 409 означает, что receipt изменился: перечитайте его и
проверьте новое состояние. В reason и result добавляйте только безопасное
резюме или внешнюю ссылку — без учётных данных и персональных данных.
Ограничение reason — 2000 байт в UTF-8, а result — 65536 байт в UTF-8
(не количество Unicode-символов); это важно для кириллицы, эмодзи и другого
многобайтового текста. Перед
сохранением Mockarty маскирует распространённые форматы учётных данных как
последний защитный слой, но это не заменяет аккуратный ввод.
cURL
curl -X POST -H "Authorization: Bearer $MOCKARTY_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: review-42" \
-d '{"expectedVersion":7,"decision":"already_applied","reason":"Проверено в биллинге","result":"Счёт 42 существует"}' \
"$MOCKARTY_URL/api/v1/agent/tasks/<task-id>/tool-receipts/<receipt-key>/reconcile"
SDK и CLI
receipt, err := client.AgentTasks().ReconcileToolReceipt(ctx, taskID, receiptKey,
mockarty.ToolReceiptReconcileRequest{
ExpectedVersion: 7, IdempotencyKey: "review-42",
Decision: "already_applied", Reason: "Проверено в биллинге",
Result: "Счёт 42 существует",
})
receipt = client.agent_tasks.reconcile_tool_receipt(
task_id, receipt_key, expected_version=7, idempotency_key="review-42",
decision="already_applied", reason="Проверено в биллинге",
result="Счёт 42 существует",
)
ToolReceipt receipt = client.agentTasks().reconcileToolReceipt(
taskId, receiptKey, 7, "review-42", "already_applied",
"Проверено в биллинге", "Счёт 42 существует");
mockarty-cli agent receipts list <task-id>
mockarty-cli agent receipts reconcile <task-id> <receipt-key> \
--expected-version 7 --idempotency-key review-42 \
--decision already_applied --reason "Проверено в биллинге" \
--result "Счёт 42 существует"
Восстановление истории чата без workspace
После обновления установки, которая сохраняла чат агента до появления
workspace-изоляции, Mockarty не подключает такую историю к активному чату,
пока владелец явно не выберет workspace. Восстановление доступно на
подключённом admin node (не в Desktop-режиме):
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/agent/sessions/legacy |
Метаданные только владельца; limit — 1-100, cursor продолжает keyset-страницу |
| GET | /api/v1/agent/sessions/legacy/:id/export |
Страница событий только владельца; продолжение через limit (1-2000) и afterEventId |
| POST | /api/v1/agent/sessions/legacy/:id/claim |
Перенос истории в workspace, где у вызывающего есть право записи |
Список никогда не возвращает текст сообщений. Экспорт не назначает workspace.
Для claim обязательно acknowledgeUnknownOrigin: true: у старой истории нет
достоверного исходного workspace. Один и тот же claim можно безопасно повторить;
другой workspace уже не сможет забрать эту историю.
cURL
curl -H "Authorization: Bearer $MOCKARTY_API_TOKEN" \
"$MOCKARTY_URL/api/v1/agent/sessions/legacy?limit=50"
curl -X POST -H "Authorization: Bearer $MOCKARTY_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"namespace":"payments","acknowledgeUnknownOrigin":true}' \
"$MOCKARTY_URL/api/v1/agent/sessions/legacy/<session-id>/claim"
Go SDK
page, err := client.AgentTasks().ListLegacySessions(ctx, 50, "")
session, err := client.AgentTasks().ClaimLegacySession(ctx, page.Sessions[0].OriginalID,
mockarty.LegacyAgentSessionClaimRequest{
Namespace: "payments", AcknowledgeUnknownOrigin: true,
})
Python SDK
page = client.agent_tasks.list_legacy_sessions(limit=50)
session = client.agent_tasks.claim_legacy_session(
page["sessions"][0]["originalId"],
namespace="payments",
acknowledge_unknown_origin=True,
)
Java SDK
Map<String, Object> page = client.agentTasks().listLegacySessions(50, null);
Map<String, Object> session = client.agentTasks().claimLegacySession(
legacySessionId, "payments", null, true);
CLI не выводит содержимое экспорта в терминал, чтобы история случайно не
попала в scrollback:
mockarty-cli agent sessions legacy list
mockarty-cli agent sessions legacy export <session-id> --file ./session.json
mockarty-cli --namespace payments agent sessions legacy claim <session-id> \
--acknowledge-unknown-origin
Здоровье и мониторинг
| Метод | Путь | Описание |
|---|---|---|
| GET | /health |
Полная проверка здоровья (БД, кэш) |
| GET | /health/live |
Проверка жизнеспособности (возвращает 200) |
| GET | /health/ready |
Проверка готовности |
| GET | /metrics |
Метрики Prometheus |
| GET | /swagger/ |
Swagger UI |
| GET | /swagger/doc.json |
Спецификация Swagger (JSON) |
| GET | /api/v1/stats |
Статистика дашборда |
| GET | /api/v1/counts |
Количества ресурсов |
| GET | /api/v1/status |
Статус системы |
| GET | /api/v1/system-metrics |
Системные метрики |
| GET | /api/v1/features |
Флаги функциональности |
| GET | /api/v1/features/check |
Проверка конкретных функций |
Пример ответа health:
{
"status": "up",
"releaseId": "1.2.3",
"checks": {
"database": {"status": "up"},
"cache": {"status": "up"}
}
}
Дашборды
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/dashboards/activity |
Лента совместной активности в namespace |
Легаси-эндпоинты статистики (
mock-stats,comprehensive-stats,
testing-stats,contracts-stats) удалены вместе с переходом на
пользовательские дашборды — эти метрики теперь отдаются как источники
данных виджетов. См. Пользовательские дашборды.
MCP-сервер
Mockarty предоставляет MCP (Model Context Protocol) сервер по адресу GET /mcp/sse. Подключайте AI-инструменты (Claude Desktop, Cursor) для управления моками через естественный язык.
SSE-события
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/events |
SSE-поток обновлений в реальном времени |
15. Вызов HTTP-мока
Отправьте запрос на /stubs/<namespace>/<путь-мока> по адресу вашей установки Mockarty. Используйте метод, заголовки, query-параметры и тело, которые ожидает мок. Этот адрес вызывает приложение или тест; административный API-токен, которым вы создавали мок, в адрес стаба не добавляется.
Если вы сгенерировали сервер gRPC, Kafka или другого протокола, направьте клиент на него. Запуск описан в руководстве по генератору серверов.
Выбор пространства
Укажите пространство первым сегментом после /stubs/, чтобы запрос попал к нужным мокам.
# Вызов GET-мока в пространстве sandbox
curl http://localhost:5770/stubs/sandbox/api/users/123
# Вызов POST-мока с JSON-телом
curl -X POST http://localhost:5770/stubs/sandbox/api/orders \
-H "Content-Type: application/json" \
-d '{"customerId": "cust-1", "items": [{"id": "item-1", "price": 29.99}]}'
Префиксы шаблонов в ответах
При построении ответов моков Mockarty поддерживает специальные префиксы для подстановки динамических данных:
| Префикс | Описание | Пример |
|---|---|---|
$.fake.* |
Данные, сгенерированные Faker | $.fake.UUID, $.fake.Email, $.fake.FirstName |
$.req.* |
Поля тела запроса | $.req.userId, $.req.order.items[0].id |
$.reqHeader.* |
Заголовки запроса | $.reqHeader.Authorization[0] |
$.queryParams.* |
Параметры запроса | $.queryParams.limit |
$.pathParam.* |
Параметры пути URL | $.pathParam.id (для маршрута /api/users/:id) |
$.namespace |
Имя текущего пространства | $.namespace |
$.gS.* |
Значения из глобального хранилища | $.gS.totalUsers |
$.cS.* |
Значения из хранилища цепочки | $.cS.orderId |
$.mS.* |
Значения из хранилища мока | $.mS.tempKey |
Пример с параметрами пути:
cURL
# Создание мока с извлечением параметров пути (пространство "sandbox" по умолчанию)
curl -X POST http://localhost:5770/api/v1/mocks \
-H "Content-Type: application/json" \
-d '{
"id": "get-user-by-id",
"namespace": "sandbox",
"http": {
"route": "/api/users/:id",
"httpMethod": "GET"
},
"response": {
"statusCode": 200,
"payload": {
"userId": "$.pathParam.id",
"name": "$.fake.FirstName",
"namespace": "$.namespace"
}
}
}'
# Вызываем
curl http://localhost:5770/stubs/sandbox/api/users/42
# Возвращает: {"userId": "42", "name": "Alice", "namespace": "sandbox"}
CLI
echo '{"id":"get-user-by-id","http":{"route":"/api/users/:id","httpMethod":"GET"},"response":{"statusCode":200,"payload":{"userId": "$.pathParam.id", "name": "$.fake.FirstName", "namespace": "$.namespace"}}}' | mockarty-cli mock create -f -
# Вызываем
curl http://localhost:5770/stubs/sandbox/api/users/42
Go
mock := mockarty.NewMockBuilder().
ID("get-user-by-id").
HTTP(func(h *mockarty.HTTPBuilder) {
h.Route("/api/users/:id").Method("GET")
}).
Response(func(r *mockarty.ResponseBuilder) {
r.Status(200).JSONBody(map[string]any{
"userId": "$.pathParam.id",
"name": "$.fake.FirstName",
"namespace": "$.namespace",
})
}).
Build()
_, err := client.Mocks().Create(context.Background(), mock)
Python
mock = (
MockBuilder.http("/api/users/:id", "GET")
.id("get-user-by-id")
.respond(200, body={
"userId": "$.pathParam.id",
"name": "$.fake.FirstName",
"namespace": "$.namespace",
})
.build()
)
client.mocks.create(mock)
Java
Mock mock = MockBuilder.http("/api/users/:id", "GET")
.id("get-user-by-id")
.respond(200, Map.of(
"userId", "$.pathParam.id",
"name", "$.fake.FirstName",
"namespace", "$.namespace"
))
.build();
client.mocks().create(mock);

Настройки автономных миссий пространства
GET /api/v1/missions/{id} возвращает карточку миссии и добавочный объект economics из неизменяемого журнала учёта именно этой миссии. В нём есть вызовы, токены и кэш модели, resources[], unpricedEvents и costs[] по каждой валюте. Перед использованием чисел проверяйте economics.available: false означает, что учёт прочитать не удалось, а не измеренный нулевой расход. Тот же ответ содержит executionBindingsAvailable и executionBindings[] — точные публичные доказательства дочерних выполнений, используемые при отмене. Недоступный список нельзя считать авторитетным пустым списком. MCP-клиенты получают тот же контракт через mission_get.
| Метод | Путь | Описание |
|---|---|---|
| GET | /api/v1/autotester/settings |
Прочитать автономность, бюджет, стену прогона, источники знаний и сроки хранения свидетельств для пространства вызывающего |
| PUT | /api/v1/autotester/settings |
Изменить эти настройки |
| GET | /api/v1/missions/settings/effective |
Посмотреть настройки, с которыми запустится миссия, и получить settingsDigest для проверки изменений перед запуском |
| POST | /api/v1/missions |
Запустить миссию; интерактивный клиент передаёт проверенный expectedSettingsDigest, а при изменении политики получает 409 mission_settings_changed |
| GET | /api/v1/missions/{id} |
Прочитать единую миссию, блокирующую публичную квитанцию, точные доказательства дочерних выполнений и учёт |
| POST | /api/v1/missions/{id}/cancel |
Надёжно отменить миссию; ответ содержит текущие точные доказательства дочерних выполнений, а причина возвращается как control.reason при каждом точном повторе |
| POST | /api/v1/missions/{id}/answer |
Надёжно ответить миссии в needs_input; после потери ответа повторите Idempotency-Key. Ответ хранится в миссии, но не попадает в публичную квитанцию и метаданные аудита |
Для двух retention-полей отсутствие ключа сохраняет текущий override пространства, явный null очищает его и включает наследование политики установки, а целое число от 1 до 3650 задаёт срок. Старые поля автономности, бюджета и источников знаний сохраняют семантику полной замены. GET возвращает ETag, PUT принимает If-Match для оптимистической конкуренции и Idempotency-Key для безопасного точного повтора (412 для устаревшей версии, 409 для конфликта ключа). Предпочитайте CLI или SDK: они читают и сохраняют текущие настройки, передают обе защиты и дают явную операцию наследования. Примеры CLI, Go, Python и Java приведены в разделе Автономные миссии: автоматизация безопасности и хранения пространства.
Для интерактивного запуска получите эффективные настройки непосредственно перед подтверждением и передайте их settingsDigest как expectedSettingsDigest в POST /api/v1/missions. Если человек задал окно уровня миссии, передайте его и в параметре runWindowMinutes предпросмотра, и тем же значением в data.settings.run_window_minutes тела запуска. Тогда digest охватывает точные значения, замораживаемые при старте, и их источники, включая это переопределение. Mockarty сравнивает digest в той же операции до сохранения миссии; несовпадение возвращает 409 и не создаёт миссию.
Если запускающий клиент уже разрешил цель или артефакт, он может записать эту идентичность приёма в targets[] или artifacts[]. Каждый элемент содержит kind, id, положительную revision и канонический digest sha256:<64 строчных шестнадцатеричных символа>. Чтение миссии возвращает запечатанные записи в pins[]. Эти поля сохраняют то, что наблюдал запускающий клиент; они не заменяют проверку конкретного провайдера непосредственно перед внешним эффектом.
Go
request.Targets = []mockarty.MissionRevisionReference{{
Kind: "repo", ID: "gitlab/mockarty", Revision: 41, Digest: commitDigest,
}}
Python
request.targets = [MissionRevisionReference(
kind="repo", id="gitlab/mockarty", revision=41, digest=commit_digest,
)]
Java
request.targets(List.of(new MissionRevisionReference()
.kind("repo").id("gitlab/mockarty").revision(41).digest(commitDigest)));
Проверка знаний агентов
Наблюдения агентов остаются кандидатами, пока уполномоченный рецензент не опубликует их. Откройте Миссии → Знания, чтобы перед решением проверить точное содержимое и метаданные, digest содержимого, источник, происхождение, уверенность, доказательство из миссии, связи и историю. Фильтр состояния позволяет вернуться к опубликованным, заменённым, истёкшим и отклонённым записям. По умолчанию отклонённые кандидаты хранятся 90 дней и никогда не попадают в контекст следующих миссий; кандидаты без решения истекают через 30 дней.
Передавайте версию из list или show и повторно используйте один ключ идемпотентности при ретрае того же решения. 409 Conflict означает, что кандидат уже изменён другим рецензентом: перечитайте его перед новым решением. supersedesId, contradictsIds и expiresAt применимы только к publish.
cURL
curl -H "X-API-Key: $MOCKARTY_API_KEY" \
'http://127.0.0.1:5770/api/v1/autotester/context/knowledge/review?state=candidate&limit=50'
curl -X POST -H "X-API-Key: $MOCKARTY_API_KEY" \
-H 'Content-Type: application/json' -H 'Idempotency-Key: review-k-42-v1' \
http://127.0.0.1:5770/api/v1/autotester/context/knowledge/review/k-42 \
-d '{"decision":"publish","expectedVersion":1,"reason":"Подтверждено связанным запуском"}'
CLI
mockarty-cli agent knowledge review list --state candidate --limit 50
mockarty-cli agent knowledge review list --state published --limit 50
mockarty-cli agent knowledge review show k-42
mockarty-cli agent knowledge review decide k-42 --decision publish \
--expected-version 1 --reason "Подтверждено связанным запуском" \
--idempotency-key review-k-42-v1
Go
page, err := client.Experience().ListReview(ctx, mockarty.ExperienceReviewListRequest{Limit: 50})
if err != nil { return err }
for _, candidate := range page.Items { fmt.Println(candidate.ID, candidate.Source) }
_, err = client.Experience().Review(ctx, "k-42", mockarty.ExperienceReviewRequest{
Decision: "publish", ExpectedVersion: 1,
Reason: "Подтверждено связанным запуском", IdempotencyKey: "review-k-42-v1",
})
Python
page = client.experience.list_review(limit=50)
for candidate in page.items:
print(candidate.id, candidate.source)
client.experience.review(
"k-42", decision="publish", expected_version=1,
reason="Подтверждено связанным запуском", idempotency_key="review-k-42-v1",
)
Java
client.experience().listReview("published", 50, null).getItems()
.forEach(item -> System.out.println(item.getId() + " " + item.getSource()));
client.experience().review("k-42", new ExperienceReviewRequest()
.decision("publish").expectedVersion(1)
.reason("Подтверждено связанным запуском").idempotencyKey("review-k-42-v1"));
Окружения delivery policy (администратор)
API окружений хранит неизменяемые ревизии политики. Он доступен только
администраторам и только когда Mockarty проверил отдельное authority-подключение
delivery policy. В строгом режиме runtime-узел не использует serving credential
как запасной путь для этих записей.
| Метод | Endpoint | Назначение |
|---|---|---|
GET |
/api/v1/admin/delivery-policy/environments |
Ограниченная страница (status, cursor, limit) |
GET |
/api/v1/admin/delivery-policy/environments/{id} |
Публичная проекция политики и строгий ETag |
POST |
/api/v1/admin/delivery-policy/environments |
Создать ревизию 1; нужен Idempotency-Key |
PUT |
/api/v1/admin/delivery-policy/environments/{id} |
Следующая ревизия; нужны If-Match и Idempotency-Key |
DELETE |
/api/v1/admin/delivery-policy/environments/{id} |
Отозвать; нужен If-Match |
GET |
/api/v1/admin/delivery-policy/grants/{id} |
Прочитать точную проекцию одобрения без секретных данных |
Ответы содержат метаданные и дайджесты политики, но никогда не содержат bearer
одобрения или seal. После 412 delivery_policy_precondition_failed перечитайте
окружение и повторяйте операцию только после проверки новой ревизии.
Проекция одобрения показывает точного исполнителя, проект, окружение, артефакт,
план, политику, операции и цели. Также она показывает срок, ссылки на аудит и
доказательство, неизменяемые лимиты одной операции и оставшиеся долговечные
совокупные лимиты окружения. usageObserved=false означает, что журнал допуска
ещё не создавался; это не утверждение о нулевом остатке.
Go
env, err := client.DeliveryPolicy().Create(ctx, mockarty.DeliveryPolicyEnvironmentRequest{
ID: "staging", ProjectID: "payments", Class: "staging", Profile: "standard",
AuditID: "change-123", EvidenceID: "review-123",
}, "payments-staging-v1")
Python
env = client.delivery_policy.create({
"id": "staging", "projectId": "payments", "class": "staging",
"profile": "standard", "auditId": "change-123", "evidenceId": "review-123",
}, idempotency_key="payments-staging-v1")
Java
Map<String, Object> env = client.deliveryPolicy().create(Map.of(
"id", "staging", "projectId", "payments", "class", "staging",
"profile", "standard", "auditId", "change-123", "evidenceId", "review-123"
), "payments-staging-v1");
Связанная документация
- Быстрый старт — запуск за 5 минут
- Справочник Faker-функций — генераторы динамических данных
- Руководство по JsonPath — извлечение и трансформация данных
- Система хранилищ — паттерны Global, Chain и Mock Store
- Нагрузочное тестирование — руководство по нагрузочному тестированию
- Фаззинг — руководство по фаззингу безопасности
- Рекордер — запись HTTP-трафика
- Руководство по Web UI — визуальный интерфейс
- Генератор серверов — генерация автономных серверов протоколов
- Вебхуки и колбэки — уведомления о событиях
- Docker и деплой — руководство по production-деплою