Документация Справочник API

Справочник 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-теста под уже существующим именем.

Конструктор — заполненная форма


Содержание

  1. Аутентификация
  2. API управления моками (публичный)
  3. API пространств имён
  4. API хранилищ
  5. API шаблонов
  6. Руководство по CI/CD интеграции
  7. API тестирования API
  8. API нагрузочного тестирования
  9. API фаззинга
  10. API рекордера
  11. API контрактного тестирования
  12. API Chaos Engineering
  13. API администрирования
  14. Утилиты
  15. Вызов HTTP-мока
  16. Настройки автономных миссий пространства
  17. Проверка знаний агентов
  18. Окружения delivery policy (администратор)
  19. Связанная документация

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");

Связанная документация