Files
multi-simadmin/openapi/multi-simadmin.v1.json

2164 lines
58 KiB
JSON

{
"openapi": "3.1.0",
"info": {
"title": "Multi SimAdmin Control Plane API",
"version": "1.0.0",
"description": "Versioned control-plane contract. It exposes registered structured operations, never an arbitrary upstream method/path proxy."
},
"servers": [
{
"url": "/",
"description": "Same-origin control plane; paths already include /api/v1."
}
],
"paths": {
"/api/v1/instances": {
"get": {
"operationId": "listInstances",
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/SortDirection"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": ["name", "status", "freshness", "updatedAt"]
},
"description": "Stable ordering; instance id ascending is the final tie-breaker."
},
{
"name": "search",
"in": "query",
"schema": {
"type": "string",
"maxLength": 200
}
},
{
"name": "capabilityStatus",
"in": "query",
"schema": {
"$ref": "#/components/schemas/CapabilityStatus"
}
},
{
"name": "freshness",
"in": "query",
"schema": {
"$ref": "#/components/schemas/SnapshotFreshness"
}
},
{
"name": "tag",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "credentialConfigured",
"in": "query",
"schema": {
"type": "boolean"
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstancePage"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "List registered instances"
},
"post": {
"operationId": "createInstance",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstanceInput"
}
}
}
},
"responses": {
"201": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
},
"ETag": {
"description": "Opaque entity tag containing the current resource revision.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Instance"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Create a registered instance"
}
},
"/api/v1/instances/{instanceId}": {
"get": {
"operationId": "getInstance",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
},
"ETag": {
"description": "Opaque entity tag containing the current resource revision.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Instance"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Get a registered instance"
},
"patch": {
"operationId": "updateInstance",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
},
{
"$ref": "#/components/parameters/IfMatch"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstancePatch"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
},
"ETag": {
"description": "Opaque entity tag containing the current resource revision.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Instance"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"412": {
"$ref": "#/components/responses/PreconditionFailed"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"x-precondition": "A matching If-Match revision is required.",
"summary": "Update a registered instance"
},
"delete": {
"operationId": "deleteInstance",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
},
{
"$ref": "#/components/parameters/IfMatch"
},
{
"$ref": "#/components/parameters/PreparationId"
},
{
"$ref": "#/components/parameters/ConfirmationToken"
}
],
"responses": {
"202": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"412": {
"$ref": "#/components/responses/PreconditionFailed"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"x-precondition": "A matching If-Match revision is required.",
"description": "R3 deletion cannot execute directly: it requires the one-time token and Preparation id returned by operations/prepare, bound to this instance, revision, and delete operation.",
"summary": "Delete a registered instance through confirmed execution"
}
},
"/api/v1/instances/{instanceId}/test-connection": {
"post": {
"operationId": "testInstanceConnection",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SessionMetadata"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Test an instance connection"
}
},
"/api/v1/instances/{instanceId}/login": {
"post": {
"operationId": "loginInstance",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LoginInput"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SessionMetadata"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Create an instance authentication session"
}
},
"/api/v1/instances/{instanceId}/logout": {
"post": {
"operationId": "logoutInstance",
"parameters": [
{
"name": "instanceId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/SessionMetadata"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Clear an instance authentication session"
}
},
"/api/v1/operations": {
"get": {
"operationId": "listOperations",
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/SortDirection"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": ["operationId", "risk", "capability"]
},
"description": "Stable ordering; operationId ascending is the final tie-breaker."
},
{
"name": "search",
"in": "query",
"schema": {
"type": "string",
"maxLength": 200
}
},
{
"name": "risk",
"in": "query",
"schema": {
"$ref": "#/components/schemas/RiskLevel"
}
},
{
"name": "capability",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "batchable",
"in": "query",
"schema": {
"type": "boolean"
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/OperationPage"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "List registered operations"
}
},
"/api/v1/operations/prepare": {
"post": {
"operationId": "prepareOperation",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PrepareOperationRequest"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Preparation"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Prepare and validate an operation"
}
},
"/api/v1/operations/execute": {
"post": {
"operationId": "executePreparedOperation",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ExecuteOperationRequest"
}
}
}
},
"responses": {
"202": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Execute a prepared operation"
}
},
"/api/v1/jobs": {
"get": {
"operationId": "listJobs",
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/SortDirection"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": ["createdAt", "status", "operationId"]
},
"description": "Stable ordering; job id ascending is the final tie-breaker."
},
{
"name": "status",
"in": "query",
"schema": {
"$ref": "#/components/schemas/JobStatus"
}
},
{
"name": "operationId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "rootJobId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "instanceId",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/JobPage"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "List jobs"
}
},
"/api/v1/jobs/{jobId}": {
"get": {
"operationId": "getJob",
"parameters": [
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Get a job"
}
},
"/api/v1/jobs/{jobId}/cancel": {
"post": {
"operationId": "cancelJob",
"parameters": [
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"202": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Request job cancellation"
}
},
"/api/v1/jobs/{jobId}/retry": {
"post": {
"operationId": "retryJob",
"parameters": [
{
"name": "jobId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RetryJobRequest"
}
}
}
},
"responses": {
"202": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Job"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Retry selected failed job items in a new job"
}
},
"/api/v1/audit": {
"get": {
"operationId": "listAuditEvents",
"parameters": [
{
"$ref": "#/components/parameters/Page"
},
{
"$ref": "#/components/parameters/PageSize"
},
{
"$ref": "#/components/parameters/SortDirection"
},
{
"name": "sort",
"in": "query",
"schema": {
"type": "string",
"enum": ["occurredAt", "action", "outcome"]
},
"description": "Stable ordering; audit event id ascending is the final tie-breaker."
},
{
"name": "actorId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "instanceId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "jobId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "operationId",
"in": "query",
"schema": {
"type": "string"
}
},
{
"name": "outcome",
"in": "query",
"schema": {
"$ref": "#/components/schemas/AuditOutcome"
}
},
{
"name": "occurredFrom",
"in": "query",
"schema": {
"type": "string",
"format": "date-time"
}
},
{
"name": "occurredTo",
"in": "query",
"schema": {
"type": "string",
"format": "date-time"
}
},
{
"name": "requestId",
"in": "query",
"schema": {
"type": "string"
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuditPage"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "List audit events"
}
},
"/api/v1/audit/{eventId}": {
"get": {
"operationId": "getAuditEvent",
"parameters": [
{
"name": "eventId",
"in": "path",
"required": true,
"schema": {
"type": "string",
"minLength": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/AuditEvent"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"summary": "Get an audit event"
}
},
"/api/v1/events": {
"get": {
"operationId": "streamEvents",
"responses": {
"200": {
"description": "Server-sent control-plane events",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"text/event-stream": {
"schema": {
"$ref": "#/components/schemas/EventEnvelope"
}
}
}
},
"400": {
"$ref": "#/components/responses/BadRequest"
},
"404": {
"$ref": "#/components/responses/NotFound"
},
"default": {
"$ref": "#/components/responses/Problem"
}
},
"parameters": [
{
"$ref": "#/components/parameters/LastEventId"
}
],
"summary": "Stream control-plane events"
}
}
},
"components": {
"schemas": {
"Revision": {
"type": "integer",
"minimum": 1,
"description": "Monotonically increasing positive resource revision."
},
"CapabilityStatus": {
"type": "string",
"enum": ["supported", "unsupported", "auth-required", "degraded", "unknown"]
},
"SnapshotFreshness": {
"type": "string",
"enum": ["fresh", "stale", "expired", "unknown"]
},
"RiskLevel": {
"type": "string",
"enum": ["R0", "R1", "R2", "R3"]
},
"ValidationIssue": {
"type": "object",
"additionalProperties": false,
"required": ["field", "code", "message"],
"properties": {
"field": {
"type": "string"
},
"code": {
"type": "string"
},
"message": {
"type": "string",
"description": "Redacted validation message; never contains submitted secret values."
}
}
},
"ProblemDetails": {
"type": "object",
"additionalProperties": false,
"required": ["type", "title", "status", "detail", "code", "requestId"],
"properties": {
"type": {
"type": "string",
"format": "uri-reference"
},
"title": {
"type": "string"
},
"status": {
"type": "integer",
"minimum": 400,
"maximum": 599
},
"detail": {
"type": "string"
},
"code": {
"type": "string"
},
"requestId": {
"type": "string"
},
"validation": {
"type": "array",
"items": {
"$ref": "#/components/schemas/ValidationIssue"
}
}
}
},
"PageMeta": {
"type": "object",
"required": ["page", "pageSize", "total"],
"properties": {
"page": {
"type": "integer",
"minimum": 1
},
"pageSize": {
"type": "integer",
"minimum": 1,
"maximum": 100
},
"total": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
},
"PasswordUpdate": {
"description": "Explicit password-reference update. Password is accepted only by the set variant and is never returned.",
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": ["action"],
"properties": {
"action": {
"const": "preserve"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["action", "password"],
"properties": {
"action": {
"const": "set"
},
"password": {
"type": "string",
"minLength": 1,
"writeOnly": true
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["action"],
"properties": {
"action": {
"const": "clear"
}
}
}
],
"discriminator": {
"propertyName": "action"
}
},
"InstanceInput": {
"type": "object",
"additionalProperties": false,
"required": ["name", "origin"],
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"origin": {
"type": "string",
"format": "uri"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"password": {
"$ref": "#/components/schemas/PasswordUpdate"
}
}
},
"InstancePatch": {
"type": "object",
"additionalProperties": false,
"minProperties": 1,
"properties": {
"name": {
"type": "string",
"minLength": 1
},
"origin": {
"type": "string",
"format": "uri"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"password": {
"$ref": "#/components/schemas/PasswordUpdate"
}
}
},
"Instance": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"name",
"origin",
"tags",
"revision",
"capabilityStatus",
"freshness",
"credentialConfigured"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"origin": {
"type": "string",
"format": "uri"
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"revision": {
"$ref": "#/components/schemas/Revision"
},
"capabilityStatus": {
"$ref": "#/components/schemas/CapabilityStatus"
},
"freshness": {
"$ref": "#/components/schemas/SnapshotFreshness"
},
"credentialConfigured": {
"type": "boolean"
}
}
},
"SessionMetadata": {
"type": "object",
"additionalProperties": false,
"required": ["instanceId", "authenticated", "checkedAt"],
"properties": {
"instanceId": {
"type": "string"
},
"authenticated": {
"type": "boolean"
},
"checkedAt": {
"type": "string",
"format": "date-time"
}
}
},
"LoginInput": {
"type": "object",
"additionalProperties": false,
"properties": {
"password": {
"type": "string",
"minLength": 1,
"writeOnly": true
}
},
"description": "Omit password to resolve a saved reference server-side; supplied password is one-shot input only."
},
"OperationCatalogEntry": {
"type": "object",
"additionalProperties": false,
"required": [
"operationId",
"title",
"risk",
"capability",
"batchable",
"parameterSchemaId"
],
"properties": {
"operationId": {
"type": "string"
},
"title": {
"type": "string"
},
"risk": {
"$ref": "#/components/schemas/RiskLevel"
},
"capability": {
"type": "string"
},
"batchable": {
"type": "boolean"
},
"parameterSchemaId": {
"type": "string",
"minLength": 1
}
},
"description": "Safe metadata projection from OperationRegistry; no upstream path or arbitrary method is exposed."
},
"OperationTarget": {
"type": "object",
"additionalProperties": false,
"required": ["instanceId"],
"properties": {
"instanceId": {
"type": "string"
},
"revision": {
"$ref": "#/components/schemas/Revision"
}
}
},
"PrepareOperationRequest": {
"type": "object",
"additionalProperties": false,
"required": ["operationId", "targets", "parameters"],
"properties": {
"operationId": {
"type": "string"
},
"targets": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/components/schemas/OperationTarget"
}
},
"parameters": {
"$ref": "#/components/schemas/RegisteredParameters"
}
}
},
"Preparation": {
"type": "object",
"additionalProperties": false,
"required": [
"id",
"status",
"operationId",
"risk",
"expiresAt",
"confirmationToken",
"confirmationPrompt",
"targetCount"
],
"properties": {
"id": {
"type": "string"
},
"operationId": {
"type": "string"
},
"risk": {
"$ref": "#/components/schemas/RiskLevel"
},
"expiresAt": {
"type": "string",
"format": "date-time"
},
"confirmationPrompt": {
"type": "string"
},
"targetCount": {
"type": "integer",
"minimum": 1
},
"status": {
"$ref": "#/components/schemas/PreparationStatus"
},
"confirmationToken": {
"type": "string",
"minLength": 20,
"description": "Opaque one-time confirmation credential. This is the sole intentional token-valued success response field; never log, audit, persist in browser storage, or return again."
}
},
"description": "Preflight-only record; it does not create a Job. The response delivers a short-lived one-time confirmationToken consumed with this preparation by execute."
},
"ExecuteOperationRequest": {
"type": "object",
"additionalProperties": false,
"required": ["preparationId", "confirmationToken"],
"properties": {
"preparationId": {
"type": "string"
},
"confirmationToken": {
"type": "string",
"writeOnly": true
}
},
"description": "Execution consumes a preparation-bound confirmation. Dangerous operations cannot bypass prepare."
},
"JobStatus": {
"type": "string",
"enum": [
"queued",
"running",
"cancelling",
"succeeded",
"partially-succeeded",
"failed",
"cancelled",
"unknown-result"
],
"description": "Transitions: queued -> running|cancelled; running -> cancelling|succeeded|partially-succeeded|failed|unknown-result; cancelling -> cancelled|failed|unknown-result. Terminal states are immutable."
},
"JobItemTerminalState": {
"type": "string",
"enum": ["succeeded", "failed", "skipped", "cancelled", "unknown-result"]
},
"JobItem": {
"type": "object",
"description": "Each item independently reaches one terminal state and may contain its own redacted error.",
"required": ["id", "targetId", "state"],
"properties": {
"id": {
"type": "string"
},
"targetId": {
"type": "string"
},
"state": {
"$ref": "#/components/schemas/JobItemTerminalState"
},
"sourceJobItemId": {
"type": "string"
},
"error": {
"$ref": "#/components/schemas/ProblemDetails"
}
},
"additionalProperties": false
},
"Attempt": {
"type": "object",
"description": "An Attempt terminal result is immutable. User retry creates a new Job and independent Attempt; bounded transport retries, when allowed, remain internal to this Attempt.",
"required": ["id", "state", "startedAt"],
"properties": {
"id": {
"type": "string"
},
"state": {
"$ref": "#/components/schemas/AttemptStatus"
},
"startedAt": {
"type": "string",
"format": "date-time"
},
"finishedAt": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"Job": {
"type": "object",
"description": "Terminal Job state, result, items, Attempts and event history are immutable. User retry always creates a new Job with retryOfJobId and rootJobId; successful items are never replayed.",
"required": ["id", "operationId", "status", "rootJobId", "items", "attempts", "createdAt"],
"properties": {
"id": {
"type": "string"
},
"operationId": {
"type": "string"
},
"status": {
"$ref": "#/components/schemas/JobStatus"
},
"retryOfJobId": {
"type": "string"
},
"rootJobId": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/JobItem"
}
},
"attempts": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Attempt"
}
},
"createdAt": {
"type": "string",
"format": "date-time"
}
},
"additionalProperties": false
},
"RetryJobRequest": {
"type": "object",
"additionalProperties": false,
"required": ["itemIds", "preparationId", "confirmationToken"],
"properties": {
"itemIds": {
"type": "array",
"minItems": 1,
"items": {
"type": "string"
}
},
"preparationId": {
"type": "string"
},
"confirmationToken": {
"type": "string",
"writeOnly": true
}
},
"description": "Select only retryable failed items. Creates a new Job; never mutates the source or replays successful items."
},
"AuditEvent": {
"type": "object",
"additionalProperties": false,
"required": ["id", "occurredAt", "actorId", "action", "outcome", "requestId"],
"properties": {
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"actorId": {
"type": "string"
},
"action": {
"type": "string"
},
"outcome": {
"$ref": "#/components/schemas/AuditOutcome"
},
"requestId": {
"type": "string"
},
"instanceId": {
"type": "string"
},
"jobId": {
"type": "string"
},
"parameterSummary": {
"type": "array",
"items": {
"$ref": "#/components/schemas/RedactedParameterSummaryItem"
},
"description": "Metadata-only, display-safe summary; never raw request values."
},
"itemId": {
"type": "string"
},
"attemptId": {
"type": "string"
},
"preparationId": {
"type": "string"
}
}
},
"PreparationStatus": {
"type": "string",
"enum": ["prepared", "consumed", "expired", "invalidated"]
},
"AttemptStatus": {
"type": "string",
"enum": ["running", "succeeded", "failed", "cancelled", "unknown-result"],
"description": "Attempt-specific state; it is independent from JobStatus."
},
"RegisteredParameters": {
"type": "object",
"additionalProperties": false,
"required": ["parameterSchemaId", "fields"],
"properties": {
"parameterSchemaId": {
"type": "string",
"minLength": 1,
"description": "Immutable schema id from OperationRegistry."
},
"fields": {
"type": "array",
"uniqueItems": true,
"items": {
"$ref": "#/components/schemas/RegisteredParameterValue"
},
"description": "Structured fields only; duplicate or unknown fieldId values are rejected."
}
}
},
"InstancePage": {
"type": "object",
"additionalProperties": false,
"required": ["items", "page"],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Instance"
}
},
"page": {
"$ref": "#/components/schemas/PageMeta"
}
}
},
"OperationPage": {
"type": "object",
"additionalProperties": false,
"required": ["items", "page"],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/OperationCatalogEntry"
}
},
"page": {
"$ref": "#/components/schemas/PageMeta"
}
}
},
"JobPage": {
"type": "object",
"additionalProperties": false,
"required": ["items", "page"],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/Job"
}
},
"page": {
"$ref": "#/components/schemas/PageMeta"
}
}
},
"AuditPage": {
"type": "object",
"additionalProperties": false,
"required": ["items", "page"],
"properties": {
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/AuditEvent"
}
},
"page": {
"$ref": "#/components/schemas/PageMeta"
}
}
},
"AuditOutcome": {
"type": "string",
"enum": ["succeeded", "failed", "partially-succeeded", "denied"]
},
"EventEnvelope": {
"description": "JSON encoded in each SSE data field. SSE id equals envelope id. Associations allow direct instance/job/item/attempt/audit correlation.",
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": ["kind", "id", "occurredAt", "requestId", "instanceId"],
"properties": {
"kind": {
"const": "instance"
},
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"requestId": {
"type": "string"
},
"instanceId": {
"type": "string"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["kind", "id", "occurredAt", "requestId", "jobId"],
"properties": {
"kind": {
"const": "job"
},
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"requestId": {
"type": "string"
},
"jobId": {
"type": "string"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["kind", "id", "occurredAt", "requestId", "jobId", "itemId"],
"properties": {
"kind": {
"const": "item"
},
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"requestId": {
"type": "string"
},
"jobId": {
"type": "string"
},
"itemId": {
"type": "string"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["kind", "id", "occurredAt", "requestId", "jobId", "attemptId"],
"properties": {
"kind": {
"const": "attempt"
},
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"requestId": {
"type": "string"
},
"jobId": {
"type": "string"
},
"attemptId": {
"type": "string"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["kind", "id", "occurredAt", "requestId", "auditEventId"],
"properties": {
"kind": {
"const": "audit"
},
"id": {
"type": "string"
},
"occurredAt": {
"type": "string",
"format": "date-time"
},
"requestId": {
"type": "string"
},
"auditEventId": {
"type": "string"
}
}
}
],
"discriminator": {
"propertyName": "kind"
}
},
"RegisteredParameterValue": {
"description": "One registry-addressed scalar/list field. The registry rejects unknown fieldId values and kind mismatches. Transport fields such as method, path, host, and port are never registered.",
"oneOf": [
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "string"
},
"value": {
"type": "string"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "number"
},
"value": {
"type": "number"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "boolean"
},
"value": {
"type": "boolean"
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "string-list"
},
"value": {
"type": "array",
"items": {
"type": "string"
}
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "number-list"
},
"value": {
"type": "array",
"items": {
"type": "number"
}
}
}
},
{
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "kind", "value"],
"properties": {
"fieldId": {
"type": "string",
"minLength": 1,
"pattern": "^[A-Za-z][A-Za-z0-9_.-]*$"
},
"kind": {
"const": "null"
},
"value": {
"type": "null"
}
}
}
],
"discriminator": {
"propertyName": "kind"
}
},
"RedactedParameterSummaryItem": {
"type": "object",
"additionalProperties": false,
"required": ["fieldId", "displayValue", "redacted"],
"properties": {
"fieldId": {
"type": "string"
},
"displayValue": {
"type": "string",
"description": "Safe display text only; secrets use the canonical redaction marker."
},
"redacted": {
"type": "boolean"
}
}
}
},
"parameters": {
"Page": {
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"default": 1
}
},
"PageSize": {
"name": "pageSize",
"in": "query",
"schema": {
"type": "integer",
"minimum": 1,
"maximum": 100,
"default": 25
}
},
"SortDirection": {
"name": "direction",
"in": "query",
"schema": {
"type": "string",
"enum": ["asc", "desc"],
"default": "asc"
}
},
"IfMatch": {
"name": "If-Match",
"in": "header",
"required": true,
"description": "ETag of the resource revision. Mismatch returns 412.",
"schema": {
"type": "string"
}
},
"PreparationId": {
"name": "X-Preparation-Id",
"in": "header",
"required": true,
"description": "Preparation bound to this exact R3 request.",
"schema": {
"type": "string",
"minLength": 1
}
},
"ConfirmationToken": {
"name": "X-Confirmation-Token",
"in": "header",
"required": true,
"description": "Opaque, short-lived, one-time confirmation returned by prepare and atomically consumed at execution entry. Sensitive header: never log, audit, trace, or persist.",
"schema": {
"type": "string",
"minLength": 20
},
"x-log-redaction": true
},
"LastEventId": {
"name": "Last-Event-ID",
"in": "header",
"required": false,
"description": "Resume strictly after this SSE event id. A missing/expired retention position produces a reset event or 409 rather than silently skipping events.",
"schema": {
"type": "string",
"minLength": 1
}
}
},
"headers": {},
"responses": {
"BadRequest": {
"description": "Invalid request",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"NotFound": {
"description": "Resource not found",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"PreconditionFailed": {
"description": "If-Match revision precondition failed",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
},
"Problem": {
"description": "Standard control-plane error",
"headers": {
"X-Request-Id": {
"description": "Correlation identifier for this response.",
"schema": {
"type": "string"
}
}
},
"content": {
"application/problem+json": {
"schema": {
"$ref": "#/components/schemas/ProblemDetails"
}
}
}
}
},
"securitySchemes": {
"ControlPlaneSession": {
"type": "apiKey",
"in": "cookie",
"name": "multi_simadmin_session",
"description": "HttpOnly, SameSite=Strict control-plane session cookie. The API is same-origin and loopback-bound."
}
}
},
"security": [
{
"ControlPlaneSession": []
}
]
}