{"openapi":"3.1.0","info":{"title":"Runyard API (runyard)","version":"0.52.0","description":"Self-hosted control plane for agent runs. The Web Hub, CLI, and MCP server all drive this same JSON API. Authenticate every request with `Authorization: Bearer shub_...`; tokens carry scopes (api, mcp, approvals, read, runner, admin) and the bootstrap token is full admin. A token with only the read scope is read-only: it can inspect state but satisfies no create/update/delete/run/approve endpoint. Operations are organized into groups — workflows, runs, work, approvals, automation, ci, library, distribution, admin, system — exposed as the tags below. The stable agent contract is /api/v1 (documented here as /v1 because the server URL is /api). Existing canonical /api paths are compatibility aliases for current clients, not deprecated. Compatibility paths carry x-stable-path in OpenAPI and X-Runyard-API-Stable-Path in responses; /api/v1 operations carry x-canonical-path back to the compatibility route. Breaking changes require a new major prefix, a written migration guide, at least 180 days of Deprecation notice, and Sunset headers at least 90 days before removal. Currently supported compatibility paths have no sunset date. Paths under /capabilities are deprecated legacy aliases of /workflows. Typical flow: discover workflows (GET /menu or /workflows), start a run (POST /workflows/{id}/run with executionMode local|remote and an Idempotency-Key), then poll /runs/{id} and read /runs/{id}/timeline, /logs, and /artifacts. Runs meter their model-call usage: per-call records stream as run.usage events and aggregate onto the run object as usage { totalTokens, promptTokens, completionTokens, costMicros, calls, byModel, byProvider } (see GET /runs/{id}/usage for records + budget). Run creation accepts an optional budget { maxTokens?, maxCostMicros? } (top-level field or input.budget); when metered usage reaches the ceiling the Hub emits run.budget.exceeded and terminates the run with the distinct terminal status budget_exceeded. Runs that need a human checkpoint enter waiting_approval and are resolved via /approvals/{id}/approve|reject|request-changes. Runs interrupted by a recoverable external condition (e.g. provider credits exhausted) park as the non-terminal status paused with pause metadata on run.pause; POST /runs/{id}/resume re-queues them and continues from the recorded engine checkpoint when one exists (body strategy 'rerun_from_scratch' discards the checkpoint and runner pin; a checkpoint the runner cannot find re-parks the run as paused with reason resume_failed). Every /api response includes RateLimit-Limit, RateLimit-Remaining, and RateLimit-Reset for the active bucket; 429 responses also include Retry-After. RateLimit-Remaining is the post-response count, RateLimit-Reset and Retry-After are whole seconds, and bucket names, keys, and client IPs are never exposed. Runner protocol requests use an isolated high-capacity bucket and keep mandatory idempotency behavior unchanged. Liveness endpoints (/healthz, /readyz, /api/version) and discovery copy (/llms.txt, this document) are unauthenticated and served from the repo root, not under /api."},"servers":[{"url":"http://runyard.synclave.net/api"}],"x-api-lifecycle":{"stableVersion":"v1","stablePrefix":"/api/v1","compatibilityPrefix":"/api","deprecationNoticeDays":180,"sunsetNoticeDays":90,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"ErrorResponse":{"type":"object","additionalProperties":true,"properties":{"error":{"type":"object","additionalProperties":true,"properties":{"code":{"type":"string"},"message":{"type":"string"},"status":{"type":"integer"},"details":{"type":"object","additionalProperties":true},"requestId":{"type":"string"}},"required":["code","message","status"]}},"required":["error"]},"ModelRoutingPolicy":{"type":"object","additionalProperties":true,"properties":{"version":{"type":"integer"},"updatedAt":{"type":"string"},"allRoutesExhausted":{"type":"string"},"targets":{"type":"array","items":{"type":"object","additionalProperties":true}},"aliases":{"type":"object","additionalProperties":true}}},"ModelRoutingPolicyResponse":{"type":"object","additionalProperties":true,"properties":{"policy":{"$ref":"#/components/schemas/ModelRoutingPolicy"},"validation":{"type":"object","additionalProperties":true},"catalog":{"type":"array","items":{"type":"object","additionalProperties":true}},"explanation":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"ModelRoutingUpdateRequest":{"type":"object","additionalProperties":true,"properties":{"policy":{"$ref":"#/components/schemas/ModelRoutingPolicy"}}},"ModelRoutingValidateResponse":{"type":"object","additionalProperties":true,"properties":{"ok":{"type":"boolean"},"errors":{"type":"array","items":{"type":"object","additionalProperties":true}},"warnings":{"type":"array","items":{"type":"object","additionalProperties":true}},"policy":{"$ref":"#/components/schemas/ModelRoutingPolicy"}}},"ModelRoutingSimulationRequest":{"type":"object","additionalProperties":true,"properties":{"alias":{"type":"string"},"requirements":{"type":"object","additionalProperties":true},"cursor":{"type":"object","additionalProperties":true},"failure":{"type":"object","additionalProperties":true}}},"ModelRoutingSimulationResponse":{"type":"object","additionalProperties":true,"properties":{"resolution":{"type":"object","additionalProperties":true},"usageLimited":{"type":"boolean"},"next":{"type":"object","additionalProperties":true},"attemptedRoutes":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"Workflow":{"type":"object","additionalProperties":true,"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"audience":{"type":"string","enum":["product","operations","internal"]},"inputSchema":{"type":"object","additionalProperties":true}}},"WorkflowListResponse":{"type":"object","additionalProperties":true,"properties":{"workflows":{"type":"array","items":{"$ref":"#/components/schemas/Workflow"}}}},"WorkflowResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"$ref":"#/components/schemas/Workflow"}},"required":["workflow"]},"Step":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"kind":{"type":"string","enum":["deterministic","deploy"]},"version":{"type":"string"},"sourcePath":{"type":"string"},"sourceHash":{"type":"string"},"tests":{"type":"array","items":{"type":"string"}},"inputSchema":{"type":"object","additionalProperties":true},"outputSchema":{"type":"object","additionalProperties":true},"sideEffects":{"type":"object","additionalProperties":true},"deploy":{"type":"object","additionalProperties":true},"dependents":{"type":"array","items":{"type":"string"}},"dependentCount":{"type":"integer"}}},"StepListResponse":{"type":"object","additionalProperties":true,"properties":{"steps":{"type":"array","items":{"$ref":"#/components/schemas/Step"}}}},"StepResponse":{"type":"object","additionalProperties":true,"properties":{"step":{"$ref":"#/components/schemas/Step"}},"required":["step"]},"LearningHypothesis":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"workflowSlug":{"type":"string"},"patternType":{"type":"string"},"title":{"type":"string"},"lifecycle":{"type":"string"},"confidence":{"type":"object","additionalProperties":true},"evidenceCount":{"type":"integer"},"occurrenceCount":{"type":"integer"},"expectedGain":{"type":"object","additionalProperties":true},"measuredGain":{"type":"object","additionalProperties":true}}},"LearningLedgerListResponse":{"type":"object","additionalProperties":true,"properties":{"learnings":{"type":"array","items":{"$ref":"#/components/schemas/LearningHypothesis"}},"workflow":{"type":"object","additionalProperties":true}}},"LearningLedgerDetailResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"object","additionalProperties":true},"hypothesis":{"$ref":"#/components/schemas/LearningHypothesis"},"evidence":{"type":"array","items":{"type":"object","additionalProperties":true}},"recommendations":{"type":"array","items":{"type":"object","additionalProperties":true}},"backtests":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"LearningCuratorRequest":{"type":"object","additionalProperties":true,"properties":{"dryRun":{"type":"boolean"},"limit":{"type":"integer"}}},"LearningCuratorResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"object","additionalProperties":true},"curator":{"type":"object","additionalProperties":true}}},"LearningBacktestRequest":{"type":"object","additionalProperties":true,"properties":{"recommendationId":{"type":"string"}}},"LearningBacktestResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"object","additionalProperties":true},"hypothesis":{"$ref":"#/components/schemas/LearningHypothesis"},"recommendation":{"type":"object","additionalProperties":true},"backtest":{"type":"object","additionalProperties":true}}},"LearningPromotionResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"object","additionalProperties":true},"hypothesis":{"$ref":"#/components/schemas/LearningHypothesis"},"linkedWorkItem":{"type":"object","additionalProperties":true},"workItem":{"type":"object","additionalProperties":true},"decisionInvariant":{"type":"array","items":{"type":"object","additionalProperties":true}},"idempotent":{"type":"boolean"}}},"WorkflowCreateRequest":{"type":"object","additionalProperties":true,"properties":{"slug":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"audience":{"type":"string","enum":["product","operations","internal"]},"workflow":{"type":"object","additionalProperties":true},"source":{"type":"string"}}},"WorkflowUpdateRequest":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"description":{"type":"string"},"audience":{"type":"string","enum":["product","operations","internal"]},"enabled":{"type":"boolean"},"workflow":{"type":"object","additionalProperties":true},"source":{"type":"string"}}},"WorkflowRunRequest":{"type":"object","additionalProperties":true,"properties":{"input":{"type":"object","additionalProperties":true},"executionMode":{"type":"string","enum":["local","remote"]},"negotiate":{"type":"boolean"},"budget":{"$ref":"#/components/schemas/RunBudget"},"workItemId":{"type":"string"},"responseEndpoint":{"type":"object","additionalProperties":true}}},"WorkflowPreflightRequest":{"type":"object","additionalProperties":true,"properties":{"input":{"type":"object","additionalProperties":true},"executionMode":{"type":"string","enum":["local","remote"]}}},"WorkflowLaunchPlanResponse":{"type":"object","additionalProperties":true,"properties":{"launchPlan":{"type":"object","additionalProperties":true}},"required":["launchPlan"]},"WorkflowDeleteResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"$ref":"#/components/schemas/Workflow"},"deleted":{"type":"boolean"}},"required":["workflow","deleted"]},"WorkflowSourceResponse":{"type":"object","additionalProperties":true,"properties":{"source":{"type":"string"},"metadata":{"type":"object","additionalProperties":true},"graph":{"type":"object","additionalProperties":true}}},"WorkflowVersionsResponse":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"object","additionalProperties":true},"versioningEnabled":{"type":"boolean"},"versions":{"type":"array","items":{"type":"string"}}}},"WorkflowRunResponse":{"type":"object","additionalProperties":true,"properties":{"negotiation":{"type":"object","additionalProperties":true},"draft":{"$ref":"#/components/schemas/RunDraft"},"run":{"$ref":"#/components/schemas/Run"},"statusUrl":{"type":"string"},"logsUrl":{"type":"string"},"artifactsUrl":{"type":"string"},"deepLink":{"type":"string"}}},"RunBudget":{"type":"object","additionalProperties":true,"properties":{"maxTokens":{"type":"integer","minimum":0},"maxCostMicros":{"type":"integer","minimum":0}}},"Run":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"workflow":{"type":"string"},"status":{"type":"string"},"input":{"type":"object","additionalProperties":true},"output":{"type":"object","additionalProperties":true},"error":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"usage":{"type":"object","additionalProperties":true},"attemptId":{"type":"string"},"attemptCount":{"type":"integer"}}},"RunAttempt":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"runId":{"type":"string"},"number":{"type":"integer"},"status":{"type":"string"},"kind":{"type":"string","enum":["initial","retry","recovery"]},"current":{"type":"boolean"},"recovery":{"type":"object","additionalProperties":true},"runnerId":{"type":"string"},"currentStep":{"type":"string"},"error":{"type":"string"},"output":{"type":"object","additionalProperties":true},"legacyRunId":{"type":"string"},"cleanupIntentId":{"type":"string"},"supersedeRequestedAt":{"type":"string","format":"date-time"},"supersededAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"}},"required":["id","runId","number","status"]},"RunAttemptsResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"attempts":{"type":"array","items":{"$ref":"#/components/schemas/RunAttempt"}},"currentAttemptId":{"type":"string"},"resolvedFrom":{"type":"string"}},"required":["run","attempts"]},"RunAttemptResponse":{"type":"object","additionalProperties":true,"properties":{"attempt":{"$ref":"#/components/schemas/RunAttempt"},"run":{"$ref":"#/components/schemas/Run"}},"required":["attempt","run"]},"RunRetryRequest":{"type":"object","additionalProperties":true,"properties":{"reason":{"type":"string"},"force":{"type":"boolean"},"failureClass":{"type":"string"},"workspaceHealthy":{"type":"boolean"},"baseDriftCompatible":{"type":"boolean"},"externalSideEffectsSafe":{"type":"boolean"},"sameCommitRetrySafe":{"type":"boolean"},"causedByCandidate":{"type":"boolean"},"repairBudgetExhausted":{"type":"boolean"}}},"RunRetryResponse":{"type":"object","additionalProperties":true,"properties":{"retried":{"type":"boolean"},"deduped":{"type":"boolean"},"recovering":{"type":"boolean"},"ciRecovery":{"type":"object","additionalProperties":true},"run":{"$ref":"#/components/schemas/Run"},"previousRun":{"$ref":"#/components/schemas/Run"},"attempt":{"$ref":"#/components/schemas/RunAttempt"},"previousAttempt":{"$ref":"#/components/schemas/RunAttempt"},"statusUrl":{"type":"string"},"deepLink":{"type":"string"}},"required":["run","attempt"]},"RunListResponse":{"type":"object","additionalProperties":true,"properties":{"runs":{"type":"array","items":{"$ref":"#/components/schemas/Run"}},"total":{"type":"integer"},"limit":{"type":"integer"},"nextCursor":{"type":"string"},"excludedCiCount":{"type":"integer"},"pool":{"type":"object","additionalProperties":true},"capability":{"type":"string"},"workflows":{"type":"array","items":{"type":"string"}},"filters":{"type":"object","additionalProperties":true}}},"LocalRepository":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"displayName":{"type":"string"},"canonicalPath":{"type":"string"},"sourceHost":{"type":"string"},"branch":{"type":"string"},"remoteUrl":{"type":"string"},"dirty":{"type":"boolean"},"approvalState":{"type":"string"},"archivedAt":{"type":"string"},"hiddenAt":{"type":"string"}}},"LocalRepositoryListResponse":{"type":"object","additionalProperties":true,"properties":{"repos":{"type":"array","items":{"$ref":"#/components/schemas/LocalRepository"}},"roots":{"type":"array","items":{"type":"string"}}}},"LocalRepositoryResponse":{"type":"object","additionalProperties":true,"properties":{"repo":{"$ref":"#/components/schemas/LocalRepository"},"runs":{"type":"array","items":{"$ref":"#/components/schemas/Run"}},"tree":{"type":"object","additionalProperties":true}}},"AttentionRunsResponse":{"type":"object","additionalProperties":true,"properties":{"attention":{"type":"object","additionalProperties":true},"counts":{"type":"object","additionalProperties":true},"generatedAt":{"type":"string","format":"date-time"}}},"RunDetailResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"attempts":{"type":"array","items":{"$ref":"#/components/schemas/RunAttempt"}},"currentAttemptId":{"type":"string"},"resolvedFrom":{"type":"string"},"events":{"type":"array","items":{"type":"object","additionalProperties":true}},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/Artifact"}},"relationships":{"type":"array","items":{"type":"object","additionalProperties":true}},"responseEndpoints":{"type":"array","items":{"type":"object","additionalProperties":true}},"budgetStop":{"type":"object","additionalProperties":true},"diagnostics":{"type":"object","additionalProperties":true},"logSummary":{"type":"object","additionalProperties":true},"pool":{"type":"object","additionalProperties":true}},"required":["run"]},"RunHandoffResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"type":"object","additionalProperties":true},"lifecycle":{"type":"object","additionalProperties":true},"approvals":{"type":"object","additionalProperties":true},"usage":{"type":"object","additionalProperties":true},"output":{"type":"object","additionalProperties":true},"artifacts":{"type":"object","additionalProperties":true},"diagnostics":{"type":"object","additionalProperties":true},"flow":{"type":"object","additionalProperties":true},"workItem":{"type":"object","additionalProperties":true},"links":{"type":"object","additionalProperties":true},"generatedAt":{"type":"string","format":"date-time"}},"required":["run","lifecycle","approvals","usage","output","artifacts","links","generatedAt"]},"RunDiagnosticsResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"diagnostics":{"type":"object","additionalProperties":true},"logSummary":{"type":"object","additionalProperties":true}},"required":["run","diagnostics"]},"UsageSummaryResponse":{"type":"object","additionalProperties":true,"properties":{"generatedAt":{"type":"string","format":"date-time"},"totals":{"type":"object","additionalProperties":true},"byWorkflow":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"RunEventsResponse":{"type":"object","additionalProperties":true,"properties":{"events":{"type":"array","items":{"type":"object","additionalProperties":true}},"attemptId":{"type":"string"},"resolvedFrom":{"type":"string"}}},"RunTimelineResponse":{"type":"object","additionalProperties":true,"properties":{"runId":{"type":"string"},"entries":{"type":"array","items":{"type":"object","additionalProperties":true}},"nextCursor":{"type":"string"}}},"RunFlowResponse":{"type":"object","additionalProperties":true,"properties":{"steps":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"RunUsageResponse":{"type":"object","additionalProperties":true,"properties":{"usage":{"type":"object","additionalProperties":true},"budget":{"$ref":"#/components/schemas/RunBudget"},"records":{"type":"array","items":{"type":"object","additionalProperties":true}}}},"RunResumeRequest":{"type":"object","additionalProperties":true,"properties":{"strategy":{"type":"string","enum":["smithers_resume","rerun_from_scratch"]}}},"RunRerunRequest":{"type":"object","additionalProperties":true,"properties":{"input":{"type":"object","additionalProperties":true},"executionMode":{"type":"string","enum":["local","remote"]}}},"RunForkRequest":{"type":"object","additionalProperties":true,"properties":{"frame":{"type":"integer","minimum":0},"inputOverrides":{"type":"object","additionalProperties":true},"resetNode":{"type":"string"},"label":{"type":"string"}},"required":["frame"]},"RunActionResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"warning":{"type":"string"}}},"RunPromotionResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"promotion":{"type":"object","additionalProperties":true}},"required":["run","promotion"]},"RunRerunResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"previousRun":{"$ref":"#/components/schemas/Run"},"retried":{"type":"boolean"},"attempt":{"$ref":"#/components/schemas/RunAttempt"},"previousAttempt":{"$ref":"#/components/schemas/RunAttempt"},"recovering":{"type":"boolean"},"ciRecovery":{"type":"object","additionalProperties":true},"statusUrl":{"type":"string"},"logsUrl":{"type":"string"},"artifactsUrl":{"type":"string"},"deepLink":{"type":"string"},"deduped":{"type":"boolean"}},"required":["run","previousRun"]},"RunDraft":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"workflow":{"type":"string"},"status":{"type":"string","enum":["ready","needs_input","blocked","submitted","discarded"]},"input":{"type":"object","additionalProperties":true},"preflight":{"type":"object","additionalProperties":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"RunDraftListResponse":{"type":"object","additionalProperties":true,"properties":{"drafts":{"type":"array","items":{"$ref":"#/components/schemas/RunDraft"}}}},"RunDraftResponse":{"type":"object","additionalProperties":true,"properties":{"draft":{"$ref":"#/components/schemas/RunDraft"}},"required":["draft"]},"RunDraftCreateRequest":{"type":"object","additionalProperties":true,"properties":{"workflow":{"type":"string"},"input":{"type":"object","additionalProperties":true},"executionMode":{"type":"string","enum":["local","remote"]}},"required":["workflow"]},"RunDraftUpdateRequest":{"type":"object","additionalProperties":true,"properties":{"input":{"type":"object","additionalProperties":true},"replaceInput":{"type":"boolean"},"executionMode":{"type":"string","enum":["local","remote"]},"runnerLocation":{"type":"string"}}},"RunDraftSubmitResponse":{"type":"object","additionalProperties":true,"properties":{"run":{"$ref":"#/components/schemas/Run"},"draft":{"$ref":"#/components/schemas/RunDraft"},"negotiation":{"type":"object","additionalProperties":true}}},"Schedule":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"name":{"type":"string"},"workflowSlug":{"type":"string"},"cron":{"type":"string"},"runAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"enabled":{"type":"boolean"},"nextRunAt":{"type":"string","format":"date-time"},"lastRunId":{"type":"string"}}},"ScheduleListResponse":{"type":"object","additionalProperties":true,"properties":{"schedules":{"type":"array","items":{"$ref":"#/components/schemas/Schedule"}}}},"ScheduleResponse":{"type":"object","additionalProperties":true,"properties":{"schedule":{"$ref":"#/components/schemas/Schedule"}},"required":["schedule"]},"ScheduleDeleteResponse":{"type":"object","additionalProperties":true,"properties":{"schedule":{"$ref":"#/components/schemas/Schedule"},"deleted":{"type":"boolean"}},"required":["schedule","deleted"]},"ScheduleCreateRequest":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"workflowSlug":{"type":"string"},"cron":{"type":"string"},"runAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"input":{"type":"object","additionalProperties":true},"enabled":{"type":"boolean"}},"required":["name","workflowSlug"]},"ScheduleUpdateRequest":{"type":"object","additionalProperties":true,"properties":{"name":{"type":"string"},"workflowSlug":{"type":"string"},"cron":{"type":"string"},"runAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"input":{"type":"object","additionalProperties":true},"enabled":{"type":"boolean"}}},"SchedulePreviewResponse":{"type":"object","additionalProperties":true,"properties":{"valid":{"type":"boolean"},"description":{"type":"string"},"next":{"type":"array","items":{"type":"string","format":"date-time"}},"error":{"type":"string"}}},"WorkItem":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"project":{"type":"string"},"owner":{"type":"string"},"linkedRuns":{"type":"array","items":{"$ref":"#/components/schemas/Run"}}}},"WorkItemListResponse":{"type":"object","additionalProperties":true,"properties":{"workItems":{"type":"array","items":{"$ref":"#/components/schemas/WorkItem"}}}},"WorkItemResponse":{"type":"object","additionalProperties":true,"properties":{"workItem":{"$ref":"#/components/schemas/WorkItem"},"drafts":{"type":"array","items":{"type":"object","additionalProperties":true}},"laneTriggers":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Server-owned lane-enter trigger metadata for status moves into auto-trigger lanes. Launch failures do not roll back the status PATCH; the ticket is moved to Needs decision with an actionable reason."}},"required":["workItem"]},"FactoryItemClaimNextRequest":{"type":"object","additionalProperties":true,"properties":{"boardSlug":{"type":"string"},"laneId":{"type":"string"},"project":{"type":"string"},"status":{"type":"string"},"statuses":{"type":"array","items":{"type":"string"}},"claimantLabel":{"type":"string"},"leaseMs":{"type":"number"}}},"FactoryItemClaimRenewRequest":{"type":"object","additionalProperties":true,"properties":{"leaseMs":{"type":"number"}}},"FactoryItemClaimReleaseRequest":{"type":"object","additionalProperties":true,"properties":{"reason":{"type":"string"}}},"FactoryItemClaimResponse":{"type":"object","additionalProperties":true,"properties":{"claimed":{"type":"boolean"},"workItem":{"$ref":"#/components/schemas/WorkItem"},"claim":{"type":"object","additionalProperties":true}}},"WorkItemStatusPreviewResponse":{"type":"object","additionalProperties":true,"properties":{"preview":{"type":"object","additionalProperties":true,"properties":{"workItem":{"$ref":"#/components/schemas/WorkItem"},"fromStatus":{"type":"string"},"toStatus":{"type":"string"},"policy":{"type":"object","additionalProperties":true},"laneTriggers":{"type":"array","items":{"type":"object","additionalProperties":true}}}}},"required":["preview"]},"WorkItemDetailResponse":{"type":"object","additionalProperties":true,"properties":{"workItem":{"$ref":"#/components/schemas/WorkItem"},"runs":{"type":"array","items":{"$ref":"#/components/schemas/Run"}},"approvals":{"type":"array","items":{"$ref":"#/components/schemas/Approval"}},"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/Artifact"}},"events":{"type":"array","items":{"type":"object","additionalProperties":true}},"originSignal":{"type":["object","null"],"additionalProperties":true}},"required":["workItem","runs","approvals","artifacts","events"]},"WorkItemDeleteResponse":{"type":"object","additionalProperties":true,"properties":{"workItem":{"$ref":"#/components/schemas/WorkItem"},"deleted":{"type":"boolean"}},"required":["workItem","deleted"]},"WorkItemLinkRunResponse":{"type":"object","additionalProperties":true,"properties":{"linked":{"type":"boolean"},"workItem":{"$ref":"#/components/schemas/WorkItem"},"runId":{"type":"string"}},"required":["linked","workItem","runId"]},"WorkItemCreateRequest":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string"},"description":{"type":"string"},"project":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"owner":{"type":"string"},"requester":{"type":"string"},"acceptanceCriteria":{"type":"string"},"nextAction":{"type":"string"},"blockedReason":{"type":"string"},"dueAt":{"type":"string","format":"date-time"}},"required":["title"]},"WorkItemUpdateRequest":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string"},"description":{"type":"string"},"project":{"type":"string"},"type":{"type":"string"},"status":{"type":"string"},"priority":{"type":"string"},"owner":{"type":"string"},"requester":{"type":"string"},"acceptanceCriteria":{"type":"string"},"nextAction":{"type":"string"},"blockedReason":{"type":"string"},"negotiate":{"type":"boolean","description":"When a status move enters a non-ready auto-trigger lane preflight, create a run draft instead of dispatching the lane workflow."},"dueAt":{"type":"string","format":"date-time"}}},"WorkItemLinkRunRequest":{"type":"object","additionalProperties":true,"properties":{"runId":{"type":"string"}},"required":["runId"]},"Artifact":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"runId":{"type":"string"},"name":{"type":"string"},"mimeType":{"type":"string"},"size":{"type":"integer","minimum":0},"createdAt":{"type":"string","format":"date-time"}}},"ArtifactListResponse":{"type":"object","additionalProperties":true,"properties":{"artifacts":{"type":"array","items":{"$ref":"#/components/schemas/Artifact"}}}},"Approval":{"type":"object","additionalProperties":true,"properties":{"id":{"type":"string"},"runId":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"status":{"type":"string","enum":["pending","approved","rejected","changes_requested","expired"]},"ask":{"type":"object","additionalProperties":true},"context":{"type":"object","additionalProperties":true,"description":"Bounded redacted presentation context for human decision surfaces, including linked work item/run and concrete decision effects when available."},"payloadSummary":{"type":"object","additionalProperties":true,"description":"Bounded redacted payload metadata; never raw artifact bodies or secrets."},"resolution":{"type":"object","additionalProperties":true},"createdAt":{"type":"string","format":"date-time"}}},"ApprovalListResponse":{"type":"object","additionalProperties":true,"properties":{"approvals":{"type":"array","items":{"$ref":"#/components/schemas/Approval"}}}},"ApprovalResponse":{"type":"object","additionalProperties":true,"properties":{"approval":{"$ref":"#/components/schemas/Approval"},"idempotent":{"type":"boolean"}},"required":["approval"]},"ApprovalCreateRequest":{"type":"object","additionalProperties":true,"properties":{"title":{"type":"string"},"description":{"type":"string"},"runId":{"type":"string"},"ask":{"type":"object","additionalProperties":true},"payload":{"type":"object","additionalProperties":true},"timeoutMs":{"type":"integer","minimum":0},"timeoutAt":{"type":"string","format":"date-time"},"fallback":{"type":"object","additionalProperties":true}},"required":["title","description","ask"]},"ApprovalDecisionRequest":{"type":"object","additionalProperties":true,"properties":{"comment":{"type":"string"}}},"ApprovalDecisionResponse":{"type":"object","additionalProperties":true,"properties":{"approval":{"$ref":"#/components/schemas/Approval"}},"required":["approval"]}}},"tags":[{"name":"workflows","description":"Define, inspect, preflight, and run workflows — the catalog of things this deployment can do."},{"name":"runs","description":"Observe and control executions: status, events, logs, diagnostics, timeline, artifacts, and run drafts."},{"name":"work","description":"Durable work items (tickets): the company work board — lifecycle lanes, linked runs, and ticket history."},{"name":"signals","description":"Signal intake: immutable connector observations, the accretive claims distilled from them, and promotion of a matured claim into work."},{"name":"approvals","description":"Human decision checkpoints: approval-compatible cards and their approve/reject/request-changes outcomes."},{"name":"automation","description":"Unattended triggers: schedules (cron and one-shot) and fixed authenticated workflow endpoints."},{"name":"ci","description":"Continuous integration on RunYard runners: connected repositories, GitHub webhook ingress, pipelines/jobs compiled onto canonical runs, and GitHub Checks reporting."},{"name":"repos","description":"Operator-approved local git repositories on the Hub host: discovery, approval, visibility, browsing, and run linkage."},{"name":"library","description":"Reusable building blocks: agent roles, skills, knowledge resources, and post-run hook profiles."},{"name":"distribution","description":"Moving workflows between Hubs: immutable source bundles and portable workflow package files."},{"name":"admin","description":"Operator administration: access tokens, secrets, audit log, failure alerts, and Hub self-update."},{"name":"system","description":"Deployment identity and infrastructure: health, version, menu, session, dashboard, runners, and the in-app assistant."}],"paths":{"/version":{"get":{"summary":"Product name, version, and instance name (unauthenticated)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/version","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/version"}},"/menu":{"get":{"summary":"Discover the Runyard MCP/CLI menu: tools, workflow catalog, and local/remote execution modes (same source as get_menu and /llms.txt)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/menu","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/menu"}},"/setup":{"get":{"summary":"Deployment identity for the login screen and Settings. Unauthenticated callers get a reduced payload (instance name, auth mode); the full payload requires a session.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/auth/token-login":{"post":{"summary":"Exchange an access token for a browser session cookie. The session carries exactly the token's scopes — no extra power.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/auth/telegram-webapp":{"post":{"summary":"Authenticate a Telegram WebApp session (approvals-scoped, narrower than a token session)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/auth/logout":{"post":{"summary":"Clear the browser session cookie","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/me":{"get":{"summary":"Describe the authenticated token: name and scopes","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/me","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/me"}},"/tokens":{"get":{"summary":"List access tokens (admin). Each entry carries secretGrants: env-var-safe NAMES only. NEVER exposes secret values.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/tokens","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/tokens"},"post":{"summary":"Issue a scoped access token (admin). Body: {name, scopes, secretGrants?, expiresInDays}. secretGrants is an env-var-safe list of secret NAMES this token may hand to a run via input.secretNames or dynamic harness selection (input.piApiKeyEnv); admin scope does NOT bypass this. Empty by default. Grants never expose values. GET /tokens/scopes describes the full vocabulary and presets.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/tokens","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/tokens"}},"/tokens/scopes":{"get":{"summary":"Describe the token scope vocabulary: what each scope grants, the named presets (everything, read-only, approvals-only, runner, admin), and the default scopes (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/tokens/scopes","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/tokens/scopes"}},"/tokens/{id}":{"patch":{"summary":"Rename an access token (admin). Body: {name}. This changes the human label only; token values, scopes, grants, and runner identity remain unchanged. Run origin labels are historical snapshots.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/tokens/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/tokens/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"summary":"Revoke an access token (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/tokens/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/tokens/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/audit":{"get":{"summary":"Read the audit log (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/audit","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/audit"}},"/alerts":{"get":{"summary":"List failure alerts (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/alerts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/alerts"}},"/update-status":{"get":{"summary":"Report whether a newer Hub release is available and the current update state (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/updates/status","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/updates/status"}},"/update/apply":{"post":{"summary":"Apply the available Hub update (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/updates/apply","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/updates/apply"}},"/secrets":{"get":{"summary":"List secret names and metadata, never values (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/secrets","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/secrets"}},"/secrets/{key}":{"put":{"summary":"Create/update an encrypted secret (admin). Body: {value, description?}","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/secrets/:key","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/secrets/{key}","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"summary":"Delete a secret (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/admin/secrets/:key","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/admin/secrets/{key}","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflow-endpoints":{"get":{"summary":"List configured authenticated workflow endpoints (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/endpoints","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/endpoints"},"post":{"summary":"Create/update an authenticated workflow endpoint (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/endpoints","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/endpoints"}},"/workflow-endpoints/{endpointSlug}":{"get":{"summary":"Describe a workflow endpoint (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/endpoints/:endpointSlug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/endpoints/{endpointSlug}","parameters":[{"name":"endpointSlug","in":"path","required":true,"schema":{"type":"string"}}]},"post":{"summary":"Submit data to a fixed authenticated workflow endpoint (per-endpoint secret, rate-limited, deduped)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/endpoints/:endpointSlug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/endpoints/{endpointSlug}","parameters":[{"name":"endpointSlug","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflow-bundles":{"get":{"summary":"List workflow source bundles (immutable, versioned, hash-addressed workflow source stored in the Hub DB). ?workflow=<slug> filters (legacy alias: ?capability=); listing never includes source bytes.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/bundles","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/bundles"},"post":{"summary":"Publish workflow source bytes as a new immutable bundle version (admin)","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/bundles","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/bundles"}},"/workflow-bundles/{id}":{"get":{"summary":"Get a workflow bundle, including its source code","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/bundles/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/bundles/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflow-packages/workflows/{id}/export":{"get":{"summary":"Export a workflow as a portable .runyard-workflow.json package file (admin). The file contains workflow source bytes, metadata, requirements, and content/workflow hashes; secret values are never included.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/packages/workflows/:id/export","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/packages/workflows/{id}/export","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflow-packages/capabilities/{id}/export":{"get":{"summary":"Legacy alias of /workflow-packages/workflows/{id}/export","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflow-packages/validate":{"post":{"summary":"Validate a workflow package file without importing it (admin). Accepts {workflowPackage} or the raw package JSON and checks schema, source hash, content hash, and size limits.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/packages/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/packages/validate"}},"/workflow-packages/preview":{"post":{"summary":"Preview importing a workflow package (admin). Accepts optional slug/targetSlug and returns the disabled workflow shape plus requirements report; no rows are written.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/packages/preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/packages/preview"}},"/workflow-packages/import":{"post":{"summary":"Import a workflow package file (admin). Publishes source as an immutable DB workflow bundle and upserts the workflow disabled by default for local configuration/preflight before enabling.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/distribution/packages/import","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/distribution/packages/import"}},"/dashboard":{"get":{"summary":"Dashboard summary: run counts by status, recent activity, and attention items (same data as the web Home header)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/dashboard","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/dashboard"}},"/operator-inbox":{"get":{"summary":"Unified read-only operator notifications feed: normalized runs, approvals, work items, runner pool, and queue items that need human attention","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/operator-inbox","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/operator-inbox"}},"/repo-options":{"get":{"summary":"List allowlisted Hub-local repos/projects and approved portable runner repository targets runs can target, without exposing raw runner paths","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/system/repo-options","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/system/repo-options"}},"/hooks":{"get":{"summary":"List post-run hook profiles. Non-admin callers see enabled profiles in a caller-safe shape; ?workflow=<slug> narrows to profiles that workflow may select via input.postRunHooks. Admins with ?all=1 see every profile with config + readiness.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/hooks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/hooks"},"post":{"summary":"Create/update a post-run hook profile (admin). Bounded per-kind config; secrets referenced by name only.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/hooks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/hooks"}},"/hooks/{slug}":{"get":{"summary":"Describe a hook profile","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/hooks/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/hooks/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update a hook profile (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/hooks/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/hooks/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/hooks/{slug}/validate":{"post":{"summary":"Dry-run readiness check for a hook profile (admin): reports hook_config_required with missing secret names only","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/hooks/:slug/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/hooks/{slug}/validate","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/steps":{"get":{"summary":"List deterministic step-library entries with versions, source hashes, side effects, and dependent workflows. This is distinct from model-directed skills.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/steps","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/steps","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string"}}]}},"/steps/{id}":{"get":{"summary":"Describe one deterministic step-library entry, including exact version, source hash, tests, side effects, deploy metadata, and dependents.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/steps/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/steps/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/steps/{id}/run":{"post":{"summary":"Invoke one deterministic step as a normal run record with authored intent, step version provenance, and ordinary run outcome/audit surfaces. Requires Idempotency-Key.","tags":["library"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/steps/:id/run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/steps/{id}/run","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunRequest"}}}}}},"/workflows":{"get":{"summary":"List workflows (?q= searches)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"includeAudience","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"summary":"Create workflow (admin). Custom workflows must carry source bytes or a workflow.bundleId; bare workflow.entry file paths are rejected.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreateRequest"}}}}}},"/workflows/{id}":{"get":{"summary":"Describe workflow and its input schema","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update workflow (admin)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateRequest"}}}}},"delete":{"summary":"Disable workflow (admin)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflows/{id}/learnings":{"get":{"summary":"List proposal-only Learning Ledger hypotheses for one workflow. Results are structurally scoped and contain bounded redacted evidence summaries only.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}},{"name":"includeStale","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}]}},"/workflows/{id}/learnings/{learningId}":{"get":{"summary":"Inspect one workflow Learning Ledger hypothesis with evidence, recommendations, lifecycle, confidence dimensions, and trace-backtest history.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings/:learningId","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings/{learningId}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}}]}},"/workflows/{id}/learnings/{learningId}/evidence":{"get":{"summary":"List bounded redacted evidence links for one workflow learning. Raw run/event truth remains linked by id and is not duplicated.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings/:learningId/evidence","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings/{learningId}/evidence","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}}]}},"/workflows/{id}/learnings/curate":{"post":{"summary":"Run the proposal-only Learning Ledger curator for one workflow. Default dryRun=true; no workflow source mutation, secret read, external write, release, or deploy.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningCuratorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings/curate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings/curate","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningCuratorRequest"}}}}}},"/workflows/{id}/learnings/{learningId}/backtest":{"post":{"summary":"Create a trace-only counterfactual backtest estimate for a workflow learning. Requires recurring evidence and labels estimates as non-causal.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningBacktestResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings/:learningId/backtest","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings/{learningId}/backtest","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningBacktestRequest"}}}}}},"/workflows/{id}/learnings/{learningId}/promote":{"post":{"summary":"Promote a recommended/backtested Learning Ledger hypothesis into one linked triaged factory proposal work item. Replays return the existing linked proposal and do not mutate workflow source, schedules, releases, deploys, secrets, or external systems.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPromotionResponse"}}}},"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPromotionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/learnings/:learningId/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/learnings/{learningId}/promote","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/workflows/{name}/versions":{"get":{"summary":"List versions seen from previous runs for a workflow","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:name/versions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{name}/versions","parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflows/{id}/source":{"get":{"summary":"Get workflow source, parsed metadata, sections, and graph","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowSourceResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/source","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/source","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/workflows/{id}/launch-plan":{"get":{"summary":"Build a read-only agent launch plan for a workflow. Query may include input JSON, where/executionMode, runnerLocation, and budget JSON. Returns workflow identity, input fields, Hub-local repo options, approved portable runner repository targets, hooks, runner availability, budget support, approval policy, and exact preflight/run payloads; no run or draft is created.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowLaunchPlanResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/launch-plan","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/launch-plan","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"input","in":"query","required":false,"schema":{"type":"string"}},{"name":"where","in":"query","required":false,"schema":{"type":"string"}},{"name":"executionMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"runnerLocation","in":"query","required":false,"schema":{"type":"string"}},{"name":"budget","in":"query","required":false,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}},{"name":"learningHintsLimit","in":"query","required":false,"schema":{"type":"string"}}]}},"/workflows/{id}/run":{"post":{"summary":"Run workflow. Body: {input, executionMode: local|remote}. For agent-created runs, input.title is recommended as a short human-readable run title for run lists, approval cards, and handoff. improve.repoDir selects an allowlisted runner-local repo for same-host workflows; remote-capable repo runs should use input.repositorySource with provider/repository/full commitSha so a portable-checkout runner materializes the exact SHA. Accepts an optional responseEndpoint ({type: http|telegram, config}) so the caller can have the terminal-state reply delivered when the run finishes. Polling /runs/{id} remains the canonical fallback. Pass negotiate: true to preflight first. Requires Idempotency-Key.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/run","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunRequest"}}}}}},"/workflows/{id}/preflight":{"post":{"summary":"Dry-run deterministic run preparation. Body: {input, executionMode}. Returns compatibility status ready|needs_input|blocked plus outcome/reasonCode/provenance, normalized/defaulted input, questions, blockers, warnings, checks, and nextAction. Capacity gaps are queued warnings; safety/authority boundaries remain blocked. Nothing is created or enqueued.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/workflows/:id/preflight","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/workflows/{id}/preflight","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowPreflightRequest"}}}}}},"/capabilities":{"get":{"summary":"Legacy alias of GET /workflows","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true},"post":{"summary":"Legacy alias of POST /workflows","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true}},"/capabilities/{id}":{"get":{"summary":"Legacy alias of GET /workflows/{id}","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Legacy alias of PATCH /workflows/{id}","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/capabilities/{name}/versions":{"get":{"summary":"Legacy alias of GET /workflows/{name}/versions","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}]}},"/capabilities/{id}/source":{"get":{"summary":"Legacy alias of GET /workflows/{id}/source","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/capabilities/{id}/run":{"post":{"summary":"Legacy alias of POST /workflows/{id}/run","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/capabilities/{id}/preflight":{"post":{"summary":"Legacy alias of POST /workflows/{id}/preflight","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"deprecated","deprecated":true,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"deprecated":true,"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/run-drafts":{"get":{"summary":"List run drafts (filter: status, workflow). A draft is a proposed run that has NOT been enqueued; its status mirrors the latest preflight until submitted or discarded.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"workflow","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"summary":"Create a run draft and preflight it. Body: {workflow, input, executionMode}. Returns 201 with the draft (status ready|needs_input|blocked, preflight report, questions to answer).","tags":["runs"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftCreateRequest"}}}}}},"/run-drafts/{id}":{"get":{"summary":"Get a run draft with its latest preflight report","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Answer questions / edit a draft: body.input is shallow-merged into the draft input (null deletes a key; replaceInput: true replaces it), executionMode/runnerLocation update options; the draft is re-preflighted and its status updated.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftUpdateRequest"}}}}}},"/run-drafts/{id}/submit":{"post":{"summary":"Submit a run draft: re-preflights and enqueues the real run only when ready (202 with {run, draft}); otherwise 422 (needs_input) or 409 (blocked) with the refreshed negotiation state and no run created. Requires Idempotency-Key.","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftSubmitResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts/:id/submit","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts/{id}/submit","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/run-drafts/{id}/discard":{"post":{"summary":"Discard an open run draft (abandon the negotiation)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/drafts/:id/discard","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/drafts/{id}/discard","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/schedules":{"get":{"summary":"List schedules (cron jobs) with enabled/disabled/broken state, next/last run, current last-run status, and a human-readable preview","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules"},"post":{"summary":"Create a schedule (admin). Body: {name, workflowSlug, cron|runAt, timezone, input, enabled}. Enabled schedules reject missing or disabled workflows. Cron schedules fire recurringly; runAt fires once. Fires honor the workflow's approval policy.","tags":["automation"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleCreateRequest"}}}}}},"/schedules/preview":{"get":{"summary":"Validate a cron expression (query: cron, timezone) and return a description plus the next fire times","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePreviewResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/preview","parameters":[{"name":"cron","in":"query","required":false,"schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string"}}]}},"/schedules/{id}":{"get":{"summary":"Get a schedule","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update a schedule (admin). Enabling rejects missing or disabled workflows.","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleUpdateRequest"}}}}},"delete":{"summary":"Delete a schedule (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/schedules/{id}/enable":{"post":{"summary":"Enable a schedule (admin). Rejects missing or disabled workflows.","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id/enable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}/enable","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/schedules/{id}/disable":{"post":{"summary":"Disable a schedule (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id/disable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}/disable","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/schedules/{id}/run-now":{"post":{"summary":"Fire a schedule immediately without changing its cadence, creating a run with Scheduled provenance. Requires Idempotency-Key.","tags":["automation"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/automation/schedules/:id/run-now","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/automation/schedules/{id}/run-now","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/agents":{"get":{"summary":"List reusable agent roles","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/agents","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/agents"},"post":{"summary":"Create an agent role (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/agents","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/agents"}},"/agents/{slug}":{"patch":{"summary":"Update an agent role (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/agents/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/agents/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/skills":{"get":{"summary":"List skills","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/skills","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/skills"},"post":{"summary":"Create a skill (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/skills","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/skills"}},"/skills/{slug}":{"patch":{"summary":"Update a skill (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/skills/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/skills/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/knowledge":{"get":{"summary":"List knowledge resources (?q= searches)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/knowledge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/knowledge"},"post":{"summary":"Create a knowledge resource (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/knowledge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/knowledge"}},"/knowledge/{slug}":{"patch":{"summary":"Update a knowledge resource (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/library/knowledge/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/library/knowledge/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/repos":{"get":{"summary":"Composed repo-centric list: local git repositories joined with CI-connected repositories (activity + attention + CI enablement), for the unified Repos surface.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/repos"}},"/repos/{id}":{"get":{"summary":"Composed repo detail: joined local + CI repository row, recent pipelines, and linked runs, for the unified Repos surface.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/repos/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos":{"get":{"summary":"List operator-discovered local git repositories on approved Hub host roots. Hidden and archived repos are omitted unless explicitly included.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos","parameters":[{"name":"includeArchived","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"includeHidden","in":"query","required":false,"schema":{"type":"boolean"}}]}},"/local-repos/refresh":{"post":{"summary":"Explicitly refresh the bounded local repository discovery index under configured approved roots.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/refresh","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/refresh"}},"/local-repos/{id}":{"get":{"summary":"Get one canonical local repository plus recent linked runs.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos/{id}/browse":{"get":{"summary":"Browse a bounded, read-only filenames-and-metadata tree contained inside one canonical local repository.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/browse","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/browse","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"path","in":"query","required":false,"schema":{"type":"string"}}]}},"/local-repos/{id}/archive":{"post":{"summary":"Archive a local repository from the active UI/index without changing execution approval.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/archive","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/archive","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos/{id}/restore":{"post":{"summary":"Restore a hidden or archived local repository to the active UI/index.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/restore","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/restore","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos/{id}/approve":{"post":{"summary":"Approve a discovered local repository for future run targeting. UI visibility and execution approval are distinct states.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/approve","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/approve","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos/{id}/revoke":{"post":{"summary":"Revoke run targeting approval for a local repository without deleting its index record.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/revoke","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/revoke","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/local-repos/{id}/hide":{"post":{"summary":"Hide a local repository from the active UI/index without granting or revoking execution approval.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/local-repos/:id/hide","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/local-repos/{id}/hide","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs":{"get":{"summary":"List runs (filter by status, q, workflow)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"workflow","in":"query","required":false,"schema":{"type":"string"}}]}},"/runs/attention":{"get":{"summary":"The operator triage queue: runs whose next step is a human action — paused (resume them), waiting for approval (decide), or stopped at their budget in the last 7 days (raise the budget and rerun) — plus counts including pending approval cards","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttentionRunsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/attention","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/attention"}},"/signals":{"get":{"summary":"List signals — accretive claims that work may be needed, held off the boards until they mature. Filters: state, connector, project, kind, surface, q, limit.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals"},"post":{"summary":"Upsert a signal candidate with its supporting observation. Merges onto an existing signal when the normalized statement matches, so analysers never fork duplicates.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals"}},"/signal-observations/analysed":{"post":{"summary":"Mark observations as analysed so the next analyser run does not reprocess them","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/observations/analysed","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/observations/analysed"}},"/signals/{id}":{"get":{"summary":"Get a signal with its evidence ledger and hydrated observations","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Edit a signal statement, classification, or dismiss it with a reason","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/signals/{id}/promote":{"post":{"summary":"Promote a signal into a work item on its project board, carrying the evidence ledger. Idempotent — an already-promoted signal returns its existing ticket.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/:id/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/{id}/promote","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/signals/promote-mature":{"post":{"summary":"Promote every signal that passed the maturity gate and has no ticket yet, capped per call. Used by pipelines configured for full automation.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/promote-mature","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/promote-mature"}},"/signals/{id}/merge":{"post":{"summary":"Merge a signal into another, moving its evidence to the target","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/:id/merge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/{id}/merge","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/signal-observations":{"get":{"summary":"List raw connector observations, including ones the relevance prefilter did not queue","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/observations","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/observations"},"post":{"summary":"Ingest connector observations, idempotent on content hash","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/observations","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/observations"}},"/signal-connectors":{"get":{"summary":"Connector health: observation counts by state per connector","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/signals/connectors","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/signals/connectors"}},"/run-views":{"get":{"summary":"List deployment-global saved Runs filter views","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/views","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/views"},"post":{"summary":"Create a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/views","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/views"}},"/run-views/{id}":{"get":{"summary":"Get a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/views/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/views/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"delete":{"summary":"Delete a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/views/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/usage/summary":{"get":{"summary":"Cross-run metered usage rollup for a time window (?days=, default 30, max 365): fleet totals (tokens, costMicros, calls, meteredRuns), a per-workflow breakdown sorted by spend, and how many runs stopped at their budget","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/usage/summary","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/usage/summary","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer"}}]}},"/runs/{id}":{"get":{"summary":"Get run: status, outputs, error, Smithers engineDetail (launcher/startedBy plus partial child failures), and responseEndpoints[] delivery state","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/handoff":{"get":{"summary":"Get a bounded agent handoff pack for a run: lifecycle, next action, approvals, usage, output summary, Smithers engine detail, artifacts, diagnostics, flow, work-item link, and deep links","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunHandoffResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/handoff","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/handoff","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/events":{"get":{"summary":"Get run events","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunEventsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/events","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/events","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attemptId","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"summary":"Append run event (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/events/stream":{"get":{"summary":"Live run events over Server-Sent Events: replays persisted events after ?afterSeq= (or the Last-Event-ID header), then tails live with id:<seq> frames, keepalive comments, and a final run-terminal frame before closing on a terminal run. Backs `runyard run --follow` / `runyard logs --follow`; poll /runs/{id}/events for the same data","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/events/stream","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/events/stream","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/log-summary":{"get":{"summary":"Get the run's log summary on its own (also embedded in /runs/{id} and /runs/{id}/diagnostics)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/log-summary","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/log-summary","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/diagnostics":{"get":{"summary":"Get diagnostics and log summary for a run","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDiagnosticsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/diagnostics","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/diagnostics","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/logs":{"get":{"summary":"Get run log lines","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/logs","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/logs","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/timeline":{"get":{"summary":"Get a unified ascending run timeline built from status transitions, events, and artifacts. Supports since=<iso> and limit=<n>; used by `runyard tail`.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimelineResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/timeline","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/timeline","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}]}},"/runs/{id}/flow":{"get":{"summary":"Execution flow: the workflow's static step graph with this run's events folded on — one state per step (pending/active/done/failed/waiting/cancelled/skipped), timings, and pending approvals. Degrades to an event-derived stepper when no source graph exists.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunFlowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/flow","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/flow","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/usage":{"get":{"summary":"Get the run's metered model-call usage: aggregate totals (tokens, costMicros, byModel/byProvider), the optional budget, and per-call usage records","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunUsageResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/usage","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/usage","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"post":{"summary":"Record one metered model-call usage record for a run and fold it into the run's usage aggregate; enforces the run budget (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/events/batch":{"post":{"summary":"Append an ordered batch of run events with per-record validation and engine-event duplicate reporting (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/usage/batch":{"post":{"summary":"Record an ordered batch of metered model-call usage records, preserving requestId idempotency and enforcing the run budget after each accepted record (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/start":{"post":{"summary":"Mark a claimed run as started (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/runner-state":{"post":{"summary":"Record runner-observed Smithers process lifecycle state without appending a user-facing run event (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/engine-approval-applies":{"post":{"summary":"Enqueue a durable Smithers engine-approval application for a resolved Hub card (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/engine-approval-applies/claim":{"post":{"summary":"Claim due durable Smithers engine-approval applications with a lease (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/engine-approval-applies/{applyId}/complete":{"post":{"summary":"Mark a durable Smithers engine-approval application applied (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"applyId","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/engine-approval-applies/{applyId}/retry":{"post":{"summary":"Persist retry state for a failed Smithers engine-approval application (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"applyId","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/complete":{"post":{"summary":"Complete a run with outputs (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/fail":{"post":{"summary":"Fail a run with an error (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/cancel":{"post":{"summary":"Cancel a queued or running run","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/cancel","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/cancel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/pause":{"post":{"summary":"Pause an active run for a recoverable external interruption (credits/quota exhausted, provider limit, manual). Body mode defaults to 'immediate', which cancels the Smithers run at its checkpoint and frees the runner slot quickly. mode 'graceful' records status pause_requested, asks Smithers to finish the active task, keeps the runner slot until Smithers parks, then records status paused with the checkpoint for resume.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/pause","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/pause","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/model-routing/failover":{"post":{"summary":"Advance the persisted Smithers model-routing cursor after an allowance-limit failure, then either queue an automatic checkpoint retry on the next target or park the run as provider_limited when every eligible route is exhausted","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/resume":{"post":{"summary":"Resume a paused run: re-queues the same run and continues from the recorded Smithers checkpoint when one exists (otherwise it re-runs from scratch, flagged in the response). Body accepts strategy 'rerun_from_scratch' to discard the checkpoint and runner pin, or 'smithers_resume' to insist on the checkpoint (409 when none is recorded); the response warns when the checkpoint's runner is offline","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/resume","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/resume","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResumeRequest"}}}}}},"/runs/{id}/rerun":{"post":{"summary":"Re-run the run. Same (or omitted) input retries the SAME stable run as a new immutable attempt — keep polling the id you already have; an edited input starts a new linked run. force:true supersedes a still-active attempt first","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/rerun","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/rerun","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunRequest"}}}}}},"/runs/{id}/fork":{"post":{"summary":"Fork a failed Smithers-backed run from a persisted engine frame. Body: {frame, inputOverrides?, resetNode?, label?}; inputOverrides may only set public workflow input keys, and the new Hub run records lineage to the source Hub run, Smithers run id, and frame","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/fork","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/fork","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunForkRequest"}}}}}},"/runs/{id}/retry":{"post":{"summary":"Retry/recover the run as a new immutable attempt on the SAME stable run id (never a second public run). Body: {reason?, force?, failureClass?, workspaceHealthy?, ...} classify the recovery strategy; force:true supersedes a still-active attempt. 409 when an attempt is active and force is not set","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRetryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/retry","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/retry","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRetryRequest"}}}}}},"/runs/{id}/attempts":{"get":{"summary":"List the run's immutable execution attempts (current + prior failed/superseded tries) with per-attempt status, recovery reason, runner, timestamps, and failure evidence","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAttemptsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/attempts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/attempts","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/attempts/{attemptId}":{"get":{"summary":"Get one immutable attempt of the run (attempt-scoped diagnostics: archived input, output, error, runner state, cleanup intent)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAttemptResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/attempts/:attemptId","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/attempts/{attemptId}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attemptId","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/attempts/{attemptId}/cancel":{"post":{"summary":"Acknowledge/cancel a SUPERSEDED attempt (runner supersession ack; also the operator escape hatch). The logical run is untouched and releases its replacement attempt; cancelling the current attempt means cancelling the run — use /runs/{id}/cancel","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attemptId","in":"path","required":true,"schema":{"type":"string"}}]}},"/runs/{id}/promote":{"post":{"summary":"Merge a successful isolated worktree run into its target branch, run gates, push, and clean up the branch/worktree","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunPromotionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/promote","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/factory-items":{"get":{"summary":"List work items (tickets) with linked-run rollups. Filters: status, project, owner, type, q, limit; archived items are hidden unless includeArchived=true or status=archived.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"project","in":"query","required":false,"schema":{"type":"string"}},{"name":"owner","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"includeArchived","in":"query","required":false,"schema":{"type":"boolean"}}]},"post":{"summary":"Create a work item (ticket). Factory proposals in triaged get one product-decision card; waiting/blocked tickets with explicit blockers get one open implementation-exception card. Body: {title, description?, project?, type?, status?, priority?, owner?, requester?, acceptanceCriteria?, evaluationGates?, affectedSurfaces?, risks?, implementationPrompt?, nextAction?, blockedReason?, dueAt?}.","tags":["work"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemCreateRequest"}}}}}},"/factory-items/by-slug/{slug}":{"get":{"summary":"Get a factory item by its human-readable slug","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/by-slug/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/by-slug/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/factory-items/{id}":{"get":{"summary":"Get a work item with its linked runs, their approvals and artifacts, and the ticket history","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update a work item: any create field, including moving status across the board. Lane entry reconciles product/implementation-exception decision invariants, then configured trigger.mode=auto lanes launch workflows from the server for Web/API/CLI/MCP callers and return laneTriggers metadata. Pass negotiate:true on a status move to save a non-ready auto-trigger preflight as a run draft instead of dispatching a doomed run.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemUpdateRequest"}}}}},"delete":{"summary":"Delete a work item (admin). Linked runs survive unlinked; prefer status=archived to keep ticket history.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/factory-items/{id}/spec.md":{"get":{"summary":"Get the Factory Item's canonical structured spec fields as a deterministic Markdown projection. Returns ETag and X-RunYard-Revision headers derived from the item version; operational metadata such as status, owner, priority, runs, approvals, and history is excluded from the editable document.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id/spec.md","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}/spec.md","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"put":{"summary":"Conditionally save a Factory Item spec.md document back into the existing structured spec fields. Requires If-Match or X-RunYard-Revision from GET /api/factory-items/{id}/spec.md; stale saves return 409 with current server content and successful saves append factory item history.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id/spec.md","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}/spec.md","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/factory-items/{id}/status-preview":{"get":{"summary":"Preview a work-item status move without writing. Returns transition policy results plus destination lane, trigger mode, resolved workflow, synthesized input, duplicate/live-run suppression, and deterministic preflight for auto-trigger lanes.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemStatusPreviewResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id/status-preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}/status-preview","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"toStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"fromStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"boardSlug","in":"query","required":false,"schema":{"type":"string"}}]}},"/factory-items/claim-next":{"post":{"summary":"Atomically claim the next unleased Factory Item for an agent pull workflow. Body: {boardSlug?, laneId?, project?, status?, statuses?, claimantLabel?, leaseMs?}. Returns 204 when no eligible item is available.","tags":["work"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"204":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/claim-next","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/claim-next","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimNextRequest"}}}}}},"/factory-item-claims/{claimId}/renew":{"post":{"summary":"Renew an active Factory Item claim lease without moving the ticket or launching lane-triggered runs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/item-claims/:claimId/renew","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/item-claims/{claimId}/renew","parameters":[{"name":"claimId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimRenewRequest"}}}}}},"/factory-item-claims/{claimId}/release":{"post":{"summary":"Release an active Factory Item claim lease without moving the ticket or launching lane-triggered runs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/item-claims/:claimId/release","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/item-claims/{claimId}/release","parameters":[{"name":"claimId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimReleaseRequest"}}}}}},"/factory-items/{id}/link-run":{"post":{"summary":"Link a run to this work item. Body: {runId}. A run belongs to at most one ticket; relinking moves it (the old ticket keeps an unlink event). Requires Idempotency-Key.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id/link-run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}/link-run","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunRequest"}}}}}},"/factory-items/{id}/unlink-run":{"post":{"summary":"Unlink a run from this work item. Body: {runId}. Requires Idempotency-Key.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/items/:id/unlink-run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/items/{id}/unlink-run","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunRequest"}}}}}},"/boards":{"get":{"summary":"List boards: durable configured views over work items (lane definitions, project scope, default workflow launch suggestions). One board is the instance default.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards"},"post":{"summary":"Create a board. Body: {slug, title, description?, project?, lanes?, defaultWorkflows?, runSuccessStatus?, isDefault?}. Lanes default to the standard seven-column factory layout; project scopes membership ('' = all work items). A lane may include trigger {mode: none|suggest|confirm|auto, workflow?, label?, description?, input?}. runSuccessStatus defaults to review; shipped enables autonomous success.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards"}},"/boards/{slug}":{"get":{"summary":"Get one board with its lane definitions (including per-lane ticket counts) and the decorated work items in its scope. includeArchived=true adds archived tickets.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]},"patch":{"summary":"Update a board: title, description, project scope, lane definitions/triggers, defaultWorkflows, runSuccessStatus, isDefault. Slug is immutable.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/board-definitions":{"get":{"summary":"List boards as portable definition summaries: slug, title, lane count, project scope, and whether a transition policy is set.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/board-definitions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/board-definitions"}},"/board-definitions/examples/{slug}":{"get":{"summary":"Deprecated. Concrete board/factory definitions are durable Hub state, not Git-shipped examples.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/board-definitions/examples/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/board-definitions/examples/{slug}","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/boards/{slug}/definition":{"get":{"summary":"Export a board as a portable definition document: lanes, statuses, guards, triggers, transition policy, defaultWorkflows. Round-trips through /api/board-definitions/import.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards/:slug/definition","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards/{slug}/definition","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/boards/{slug}/transitions":{"get":{"summary":"Describe a board's transition policy: every allowed cross-lane move, who can drive it (manual, workflow, run origin, actor id/role), and the message returned when denied.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards/:slug/transitions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards/{slug}/transitions","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/boards/{slug}/transitions/check":{"post":{"summary":"Preflight a proposed move against a board's transition policy without mutating anything. Body: {fromStatus, toStatus, actorRole?, workflowSlug?, runOrigin?, runId?}.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/boards/:slug/transitions/check","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/boards/{slug}/transitions/check","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}]}},"/board-definitions/validate":{"post":{"summary":"Validate a portable board definition document without importing it. Returns {valid, definition?, preview: {laneCount, scheduleCount, transitions}, error?}.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/board-definitions/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/board-definitions/validate"}},"/board-definitions/import":{"post":{"summary":"Import a board definition — create the board when new, update lanes/triggers/policy when a board with the same slug exists, and reconcile any embedded schedule hookups by slug so re-imports never duplicate cron jobs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/factory/board-definitions/import","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/factory/board-definitions/import"}},"/ci/webhooks/github":{"post":{"summary":"GitHub App webhook ingress: HMAC signature verified over the raw body BEFORE parsing, delivery-id dedupe with payload-hash conflict detection, and explicit event routing (push, pull_request, check_run rerequested, installation sync). Unauthenticated by design — the signature is the authentication.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/ci/github-app":{"get":{"summary":"GitHub App configuration health: app id, API base, key/secret presence — never secret values.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/github-app","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/github-app"}},"/ci/repos":{"get":{"summary":"List CI-connected repositories (with installation identity) and their enablement + trust policy. enabled=1 filters to CI-enabled repos.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos"}},"/ci/repos/sync":{"post":{"summary":"Sync installations and repositories from the GitHub App (admin). Recovery path for missed installation webhooks and first-time setup; never auto-enables CI on a repo.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/sync","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/sync"}},"/ci/repos/{id}":{"get":{"summary":"Get one connected repository (row id, or full name via ?repo=owner/name) with its recent pipelines.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/repos/{id}/enable":{"post":{"summary":"Enable CI for a connected repository. Repositories are connected disabled by default; nothing runs until an operator or a ci:admin agent opts in.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/:id/enable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/{id}/enable","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/repos/{id}/disable":{"post":{"summary":"Disable CI for a connected repository. In-flight pipelines finish; new events are ignored.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/:id/disable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/{id}/disable","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/repos/{id}/trust":{"patch":{"summary":"Update a repository's trust policy. Body: {level: trusted|untrusted, allowNative?, runnerTags?}. allowNative requires level=trusted AND the runner's own RUNYARD_RUNNER_CI_NATIVE opt-in; fork PRs are always untrusted regardless.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/:id/trust","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/{id}/trust","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/repos/{id}/config":{"get":{"summary":"Inspect the validated .runyard/ci.yml at the trusted default branch (or ?ref=). Unlike other CI reads this pulls file content from the (possibly private) repository with the App credential, so it requires a write-capable scope — read-only tokens see hub state only.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/repos/:id/config","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/repos/{id}/config","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/dispatch":{"post":{"summary":"Manually dispatch CI for a connected repository. Body: {repo, ref?} — ref defaults to the default branch and is resolved to an exact sha; the run tests that pinned revision with config loaded from the same trusted revision.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/dispatch","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/dispatch"}},"/ci/pipelines":{"get":{"summary":"List recent CI pipelines (?repo= filters by connected repository; limit up to 200) with parent-run status links.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/pipelines","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/pipelines"}},"/ci/pipelines/{id}":{"get":{"summary":"Get one CI pipeline (by pipeline id or parent run id): trigger provenance, trusted config source sha, tested-checkout semantics, job DAG with live run states, and GitHub check reporting state.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/pipelines/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/pipelines/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/pipelines/{id}/cancel":{"post":{"summary":"Cancel a CI pipeline: the parent run is cancelled, dispatched job runs are cancelled (runners observe and kill their process groups), and pending jobs never start.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/pipelines/:id/cancel","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/pipelines/{id}/cancel","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/pipelines/{id}/rerun":{"post":{"summary":"Rerun a pipeline: a fresh pipeline with the original trigger provenance (rerunOfPipelineId) against the same SHAs. The original stays intact as evidence; the rerun supersedes it on the shared concurrency key.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/pipelines/:id/rerun","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/pipelines/{id}/rerun","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/pipelines/{id}/sync-checks":{"post":{"summary":"Operator reconciliation after a GitHub Checks reporter outage: reset the bounded retry counters for this pipeline's checks and resync them (admin).","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/pipelines/:id/sync-checks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/pipelines/{id}/sync-checks","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/ci/deliveries":{"get":{"summary":"Webhook delivery ledger diagnostics (admin): per-delivery status (accepted/ignored/duplicate/conflict/invalid), bounded detail, and pipeline linkage. Retention is bounded (RUNYARD_CI_DELIVERY_RETENTION_MS).","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/deliveries","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/deliveries"}},"/ci/diagnostics":{"get":{"summary":"CI operator counters (admin): webhook signature failures/duplicates since boot, 24h delivery totals, active pipelines, queued jobs + max queue latency, and pipelines with retrying check syncs. Low-cardinality by design.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/ci/diagnostics","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/ci/diagnostics"}},"/ci/runs/{id}/git-credential":{"post":{"summary":"Mint a short-lived, repository-scoped, read-only git credential for a claimed CI job's checkout (runner protocol). Never stored; run events carry metadata only.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/gateway/openai/v1/chat/completions":{"post":{"summary":"OpenAI-compatible chat-completions proxy for gateway-metered runs: authenticates the per-run gateway token, enforces the run budget before forwarding, calls the run's configured upstream with the Hub-held key, and records usage from the provider response","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/gateway/anthropic/v1/messages":{"post":{"summary":"Anthropic-compatible messages proxy for gateway-metered runs: same per-run token auth, budget enforcement, Hub-held upstream key, and usage capture as the OpenAI-compatible route","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/runs/{id}/artifacts":{"get":{"summary":"List run artifacts","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/runs/:id/artifacts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/runs/{id}/artifacts","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]},"post":{"summary":"Upload artifact (runner protocol)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/artifacts":{"get":{"summary":"List/search artifacts across runs (?q= searches)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/artifacts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/artifacts","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}}]}},"/artifacts/{id}/download":{"get":{"summary":"Stream an artifact's bytes as an attachment; HTML/SVG render inline is blocked by Content-Disposition","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/artifacts/:id/download","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/artifacts/{id}/download","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/git/{id}/info/refs":{"get":{"summary":"Advertise refs for a Hub-hosted repository (git smart HTTP, read-only)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/git/{id}/git-upload-pack":{"post":{"summary":"Serve a git fetch/clone for a Hub-hosted repository (read-only)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/git/{id}/git-receive-pack":{"post":{"summary":"Always refused — Hub-hosted repositories are served read-only","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/approvals":{"get":{"summary":"List approvals. Filters: ?status=pending|resolved, kind, workflow, runId, timer=expired|due|hasTimer; resolved cards carry the decision in their resolution field.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}}]},"post":{"summary":"Create an approval card for a human decision. Body: {title, description, runId?, ask: {action, reason, audience}, timeoutMs?/timeoutAt? + fallback? for timed approvals}.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalCreateRequest"}}}}}},"/approvals/{id}":{"get":{"summary":"Get a single approval card","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals/{id}","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/approvals/{id}/approve":{"post":{"summary":"Approve request. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals/:id/approve","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals/{id}/approve","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}}}},"/approvals/{id}/reject":{"post":{"summary":"Reject request. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals/:id/reject","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals/{id}/reject","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}}}},"/approvals/{id}/request-changes":{"post":{"summary":"Request changes. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals/:id/request-changes","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals/{id}/request-changes","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}}}},"/approvals/{id}/choose":{"post":{"summary":"Answer with one of the card's declared named options. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"compatibility","deprecated":false,"stablePath":"/api/v1/approvals/:id/choose","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-stable-path":"/v1/approvals/{id}/choose","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/runners/register":{"post":{"summary":"Register runner (runner protocol)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/runners":{"get":{"summary":"List registered runners, heartbeat state, capacity, active slots, and pool summary","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/runners/engine-doctor":{"get":{"summary":"Read-only Smithers engine doctor across runners: effective version, pin drift, stale heartbeat, recent preflight failures, and 0.30 contract readiness","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/runners/{id}/repo-targets/{targetId}/approve":{"post":{"summary":"Approve a specific runner-advertised portable repository target for future assignment. Approval is Hub-owned admin state and cannot be supplied by runner heartbeat. Requires Idempotency-Key.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/runners/{id}/repo-targets/{targetId}/revoke":{"post":{"summary":"Revoke a specific runner-advertised portable repository target for new assignments while preserving existing run provenance. Requires Idempotency-Key.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"targetId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/runners/{id}/engine-doctor":{"get":{"summary":"Read-only Smithers engine doctor for one runner","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runners/{id}/heartbeat":{"post":{"summary":"Runner heartbeat (runner protocol)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runners/{id}/next-run":{"get":{"summary":"Claim next run for runner (runner protocol)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/delegations":{"get":{"summary":"List redacted public runner-scoped signing delegations","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}},"post":{"summary":"Register or rotate a runner-scoped delegated signing key","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/delegations/audit":{"get":{"summary":"List append-only delegated-key history","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/delegations/{id}/revoke":{"post":{"summary":"Revoke a delegated signing key without deleting verification history","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/runners/{id}/cleanup-intents/claim":{"post":{"summary":"Claim queued runner-owned cleanup intents with a lease (runner protocol)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/runners/{id}/cleanup-intents/{intentId}/complete":{"post":{"summary":"Report durable completion or retention for a runner cleanup intent","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"intentId","in":"path","required":true,"schema":{"type":"string"}}]}},"/runners/{id}/cleanup-intents/{intentId}/fail":{"post":{"summary":"Report retryable or terminal failure for a runner cleanup intent","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"intentId","in":"path","required":true,"schema":{"type":"string"}}]}},"/chat/status":{"get":{"summary":"In-app Assistant status: Hermes harness readiness (or opt-in HTTP provider config)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/chat":{"post":{"summary":"Legacy web-only in-app Assistant fallback. Body: {messages, context}. Answers first; legacy button actions are not exposed through MCP.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/chat/implementation":{"post":{"summary":"Start a durable gated implementation run after explicit operator confirmation.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/chat/results/{id}":{"get":{"summary":"Poll a support-chat durable run result for tab-scoped delivery.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/copilot/status":{"get":{"summary":"Operator copilot status: configured provider plus the persisted fast/deep model-role policy.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/copilot/conversations":{"get":{"summary":"List the caller's copilot conversations (admins see all).","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}},"post":{"summary":"Create a copilot conversation. Body: {title?, context?}.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/copilot/conversations/{id}":{"get":{"summary":"Read a copilot conversation; terminal run results are materialized exactly once on read.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/copilot/conversations/{id}/messages":{"post":{"summary":"Send a copilot message. Routed fast/confirm/handoff by the orchestration policy; durable work uses the canonical run path.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/copilot/conversations/{id}/actions/{actionId}/confirm":{"post":{"summary":"Confirm a proposed copilot action. The server re-validates references and scopes, then executes exactly once; duplicates return the stored outcome.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"actionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/copilot/conversations/{id}/actions/{actionId}/reject":{"post":{"summary":"Decline a proposed copilot action. Idempotent: a settled action keeps its stored outcome.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"actionId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}]}},"/copilot/conversations/{id}/archive":{"post":{"summary":"Archive a copilot conversation.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/model-routing":{"get":{"summary":"Inspect the effective canonical model-routing policy, fallback chains, safe health metadata, and validation state.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingPolicyResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}},"put":{"summary":"Persist an admin-scoped model-routing policy after validation; secret values are rejected.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingPolicyResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingUpdateRequest"}}}}}},"/model-routing/validate":{"post":{"summary":"Validate a proposed model-routing policy without saving it.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingValidateResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingUpdateRequest"}}}}}},"/model-routing/simulate":{"post":{"summary":"Simulate logical model resolution and allowance-limit failover without calling a provider.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingSimulationResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingSimulationRequest"}}}}}},"/model-routing/explain":{"get":{"summary":"Explain the effective target resolution for a logical model alias or role.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelRoutingSimulationResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"alias","in":"query","required":false,"schema":{"type":"string"}},{"name":"tools","in":"query","required":false,"schema":{"type":"string"}}]}},"/copilot/model-policy":{"get":{"summary":"Read the copilot model-role policy and the connected-model catalog (safe metadata only).","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}},"post":{"summary":"Persist the copilot model-role policy. Roles must name connected catalog entries.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/copilot/model-policy/recommend":{"post":{"summary":"Recommend fast/deep model roles from connected providers; schema-validated with a deterministic fallback.","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."}}},"/telegram/deliveries/{id}/retry":{"post":{"summary":"Manually retry a failed Telegram decision delivery without changing the underlying approval.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"unversioned","deprecated":false,"policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}]}},"/v1/system/version":{"get":{"summary":"Product name, version, and instance name (unauthenticated)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/version","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/version"}},"/v1/system/menu":{"get":{"summary":"Discover the Runyard MCP/CLI menu: tools, workflow catalog, and local/remote execution modes (same source as get_menu and /llms.txt)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/menu","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/menu"}},"/v1/system/me":{"get":{"summary":"Describe the authenticated token: name and scopes","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/me","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/me"}},"/v1/admin/tokens":{"get":{"summary":"List access tokens (admin). Each entry carries secretGrants: env-var-safe NAMES only. NEVER exposes secret values.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/tokens","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/tokens"},"post":{"summary":"Issue a scoped access token (admin). Body: {name, scopes, secretGrants?, expiresInDays}. secretGrants is an env-var-safe list of secret NAMES this token may hand to a run via input.secretNames or dynamic harness selection (input.piApiKeyEnv); admin scope does NOT bypass this. Empty by default. Grants never expose values. GET /tokens/scopes describes the full vocabulary and presets.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/tokens","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/tokens"}},"/v1/admin/tokens/scopes":{"get":{"summary":"Describe the token scope vocabulary: what each scope grants, the named presets (everything, read-only, approvals-only, runner, admin), and the default scopes (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/tokens/scopes","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/tokens/scopes"}},"/v1/admin/tokens/{id}":{"patch":{"summary":"Rename an access token (admin). Body: {name}. This changes the human label only; token values, scopes, grants, and runner identity remain unchanged. Run origin labels are historical snapshots.","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/tokens/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/tokens/{id}"},"delete":{"summary":"Revoke an access token (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/tokens/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/tokens/{id}"}},"/v1/admin/audit":{"get":{"summary":"Read the audit log (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/audit","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/audit"}},"/v1/admin/alerts":{"get":{"summary":"List failure alerts (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/alerts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/alerts"}},"/v1/admin/updates/status":{"get":{"summary":"Report whether a newer Hub release is available and the current update state (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/update-status","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/update-status"}},"/v1/admin/updates/apply":{"post":{"summary":"Apply the available Hub update (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/update/apply","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/update/apply"}},"/v1/admin/secrets":{"get":{"summary":"List secret names and metadata, never values (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/secrets","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/secrets"}},"/v1/admin/secrets/{key}":{"put":{"summary":"Create/update an encrypted secret (admin). Body: {value, description?}","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/secrets/:key","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/secrets/{key}"},"delete":{"summary":"Delete a secret (admin)","tags":["admin"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/secrets/:key","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/secrets/{key}"}},"/v1/automation/endpoints":{"get":{"summary":"List configured authenticated workflow endpoints (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-endpoints","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-endpoints"},"post":{"summary":"Create/update an authenticated workflow endpoint (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-endpoints","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-endpoints"}},"/v1/automation/endpoints/{endpointSlug}":{"get":{"summary":"Describe a workflow endpoint (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-endpoints/:endpointSlug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"endpointSlug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflow-endpoints/{endpointSlug}"},"post":{"summary":"Submit data to a fixed authenticated workflow endpoint (per-endpoint secret, rate-limited, deduped)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-endpoints/:endpointSlug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"endpointSlug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflow-endpoints/{endpointSlug}"}},"/v1/distribution/bundles":{"get":{"summary":"List workflow source bundles (immutable, versioned, hash-addressed workflow source stored in the Hub DB). ?workflow=<slug> filters (legacy alias: ?capability=); listing never includes source bytes.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-bundles","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-bundles"},"post":{"summary":"Publish workflow source bytes as a new immutable bundle version (admin)","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-bundles","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-bundles"}},"/v1/distribution/bundles/{id}":{"get":{"summary":"Get a workflow bundle, including its source code","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-bundles/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflow-bundles/{id}"}},"/v1/distribution/packages/workflows/{id}/export":{"get":{"summary":"Export a workflow as a portable .runyard-workflow.json package file (admin). The file contains workflow source bytes, metadata, requirements, and content/workflow hashes; secret values are never included.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-packages/workflows/:id/export","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflow-packages/workflows/{id}/export"}},"/v1/distribution/packages/validate":{"post":{"summary":"Validate a workflow package file without importing it (admin). Accepts {workflowPackage} or the raw package JSON and checks schema, source hash, content hash, and size limits.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-packages/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-packages/validate"}},"/v1/distribution/packages/preview":{"post":{"summary":"Preview importing a workflow package (admin). Accepts optional slug/targetSlug and returns the disabled workflow shape plus requirements report; no rows are written.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-packages/preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-packages/preview"}},"/v1/distribution/packages/import":{"post":{"summary":"Import a workflow package file (admin). Publishes source as an immutable DB workflow bundle and upserts the workflow disabled by default for local configuration/preflight before enabling.","tags":["distribution"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflow-packages/import","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/workflow-packages/import"}},"/v1/system/dashboard":{"get":{"summary":"Dashboard summary: run counts by status, recent activity, and attention items (same data as the web Home header)","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/dashboard","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/dashboard"}},"/v1/system/operator-inbox":{"get":{"summary":"Unified read-only operator notifications feed: normalized runs, approvals, work items, runner pool, and queue items that need human attention","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/operator-inbox","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/operator-inbox"}},"/v1/system/repo-options":{"get":{"summary":"List allowlisted Hub-local repos/projects and approved portable runner repository targets runs can target, without exposing raw runner paths","tags":["system"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/repo-options","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/repo-options"}},"/v1/library/hooks":{"get":{"summary":"List post-run hook profiles. Non-admin callers see enabled profiles in a caller-safe shape; ?workflow=<slug> narrows to profiles that workflow may select via input.postRunHooks. Admins with ?all=1 see every profile with config + readiness.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/hooks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/hooks"},"post":{"summary":"Create/update a post-run hook profile (admin). Bounded per-kind config; secrets referenced by name only.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/hooks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/hooks"}},"/v1/library/hooks/{slug}":{"get":{"summary":"Describe a hook profile","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/hooks/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/hooks/{slug}"},"patch":{"summary":"Update a hook profile (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/hooks/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/hooks/{slug}"}},"/v1/library/hooks/{slug}/validate":{"post":{"summary":"Dry-run readiness check for a hook profile (admin): reports hook_config_required with missing secret names only","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/hooks/:slug/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/hooks/{slug}/validate"}},"/v1/library/steps":{"get":{"summary":"List deterministic step-library entries with versions, source hashes, side effects, and dependent workflows. This is distinct from model-directed skills.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/steps","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"kind","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/steps"}},"/v1/library/steps/{id}":{"get":{"summary":"Describe one deterministic step-library entry, including exact version, source hash, tests, side effects, deploy metadata, and dependents.","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/steps/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/steps/{id}"}},"/v1/library/steps/{id}/run":{"post":{"summary":"Invoke one deterministic step as a normal run record with authored intent, step version provenance, and ordinary run outcome/audit surfaces. Requires Idempotency-Key.","tags":["library"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/steps/:id/run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunRequest"}}}},"x-canonical-path":"/steps/{id}/run"}},"/v1/workflows":{"get":{"summary":"List workflows (?q= searches)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"includeAudience","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/workflows"},"post":{"summary":"Create workflow (admin). Custom workflows must carry source bytes or a workflow.bundleId; bare workflow.entry file paths are rejected.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowCreateRequest"}}}},"x-canonical-path":"/workflows"}},"/v1/workflows/{id}":{"get":{"summary":"Describe workflow and its input schema","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}"},"patch":{"summary":"Update workflow (admin)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowUpdateRequest"}}}},"x-canonical-path":"/workflows/{id}"},"delete":{"summary":"Disable workflow (admin)","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}"}},"/v1/workflows/{id}/learnings":{"get":{"summary":"List proposal-only Learning Ledger hypotheses for one workflow. Results are structurally scoped and contain bounded redacted evidence summaries only.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}},{"name":"includeStale","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"x-canonical-path":"/workflows/{id}/learnings"}},"/v1/workflows/{id}/learnings/{learningId}":{"get":{"summary":"Inspect one workflow Learning Ledger hypothesis with evidence, recommendations, lifecycle, confidence dimensions, and trace-backtest history.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings/:learningId","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}/learnings/{learningId}"}},"/v1/workflows/{id}/learnings/{learningId}/evidence":{"get":{"summary":"List bounded redacted evidence links for one workflow learning. Raw run/event truth remains linked by id and is not duplicated.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningLedgerDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings/:learningId/evidence","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}/learnings/{learningId}/evidence"}},"/v1/workflows/{id}/learnings/curate":{"post":{"summary":"Run the proposal-only Learning Ledger curator for one workflow. Default dryRun=true; no workflow source mutation, secret read, external write, release, or deploy.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningCuratorResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings/curate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningCuratorRequest"}}}},"x-canonical-path":"/workflows/{id}/learnings/curate"}},"/v1/workflows/{id}/learnings/{learningId}/backtest":{"post":{"summary":"Create a trace-only counterfactual backtest estimate for a workflow learning. Requires recurring evidence and labels estimates as non-causal.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningBacktestResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings/:learningId/backtest","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningBacktestRequest"}}}},"x-canonical-path":"/workflows/{id}/learnings/{learningId}/backtest"}},"/v1/workflows/{id}/learnings/{learningId}/promote":{"post":{"summary":"Promote a recommended/backtested Learning Ledger hypothesis into one linked triaged factory proposal work item. Replays return the existing linked proposal and do not mutate workflow source, schedules, releases, deploys, secrets, or external systems.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPromotionResponse"}}}},"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LearningPromotionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/learnings/:learningId/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"learningId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":false,"schema":{"type":"string","maxLength":255},"description":"Client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"x-canonical-path":"/workflows/{id}/learnings/{learningId}/promote"}},"/v1/workflows/{name}/versions":{"get":{"summary":"List versions seen from previous runs for a workflow","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowVersionsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:name/versions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{name}/versions"}},"/v1/workflows/{id}/source":{"get":{"summary":"Get workflow source, parsed metadata, sections, and graph","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowSourceResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/source","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}/source"}},"/v1/workflows/{id}/launch-plan":{"get":{"summary":"Build a read-only agent launch plan for a workflow. Query may include input JSON, where/executionMode, runnerLocation, and budget JSON. Returns workflow identity, input fields, Hub-local repo options, approved portable runner repository targets, hooks, runner availability, budget support, approval policy, and exact preflight/run payloads; no run or draft is created.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowLaunchPlanResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/launch-plan","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"input","in":"query","required":false,"schema":{"type":"string"}},{"name":"where","in":"query","required":false,"schema":{"type":"string"}},{"name":"executionMode","in":"query","required":false,"schema":{"type":"string"}},{"name":"runnerLocation","in":"query","required":false,"schema":{"type":"string"}},{"name":"budget","in":"query","required":false,"schema":{"type":"string"}},{"name":"tenant","in":"query","required":false,"schema":{"type":"string"}},{"name":"learningHintsLimit","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/workflows/{id}/launch-plan"}},"/v1/workflows/{id}/run":{"post":{"summary":"Run workflow. Body: {input, executionMode: local|remote}. For agent-created runs, input.title is recommended as a short human-readable run title for run lists, approval cards, and handoff. improve.repoDir selects an allowlisted runner-local repo for same-host workflows; remote-capable repo runs should use input.repositorySource with provider/repository/full commitSha so a portable-checkout runner materializes the exact SHA. Accepts an optional responseEndpoint ({type: http|telegram, config}) so the caller can have the terminal-state reply delivered when the run finishes. Polling /runs/{id} remains the canonical fallback. Pass negotiate: true to preflight first. Requires Idempotency-Key.","tags":["workflows"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunRequest"}}}},"x-canonical-path":"/workflows/{id}/run"}},"/v1/workflows/{id}/preflight":{"post":{"summary":"Dry-run deterministic run preparation. Body: {input, executionMode}. Returns compatibility status ready|needs_input|blocked plus outcome/reasonCode/provenance, normalized/defaulted input, questions, blockers, warnings, checks, and nextAction. Capacity gaps are queued warnings; safety/authority boundaries remain blocked. Nothing is created or enqueued.","tags":["workflows"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/workflows/:id/preflight","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowPreflightRequest"}}}},"x-canonical-path":"/workflows/{id}/preflight"}},"/v1/runs/drafts":{"get":{"summary":"List run drafts (filter: status, workflow). A draft is a proposed run that has NOT been enqueued; its status mirrors the latest preflight until submitted or discarded.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"workflow","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/run-drafts"},"post":{"summary":"Create a run draft and preflight it. Body: {workflow, input, executionMode}. Returns 201 with the draft (status ready|needs_input|blocked, preflight report, questions to answer).","tags":["runs"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftCreateRequest"}}}},"x-canonical-path":"/run-drafts"}},"/v1/runs/drafts/{id}":{"get":{"summary":"Get a run draft with its latest preflight report","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/run-drafts/{id}"},"patch":{"summary":"Answer questions / edit a draft: body.input is shallow-merged into the draft input (null deletes a key; replaceInput: true replaces it), executionMode/runnerLocation update options; the draft is re-preflighted and its status updated.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftUpdateRequest"}}}},"x-canonical-path":"/run-drafts/{id}"}},"/v1/runs/drafts/{id}/submit":{"post":{"summary":"Submit a run draft: re-preflights and enqueues the real run only when ready (202 with {run, draft}); otherwise 422 (needs_input) or 409 (blocked) with the refreshed negotiation state and no run created. Requires Idempotency-Key.","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftSubmitResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts/:id/submit","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"x-canonical-path":"/run-drafts/{id}/submit"}},"/v1/runs/drafts/{id}/discard":{"post":{"summary":"Discard an open run draft (abandon the negotiation)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDraftResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-drafts/:id/discard","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/run-drafts/{id}/discard"}},"/v1/automation/schedules":{"get":{"summary":"List schedules (cron jobs) with enabled/disabled/broken state, next/last run, current last-run status, and a human-readable preview","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/schedules"},"post":{"summary":"Create a schedule (admin). Body: {name, workflowSlug, cron|runAt, timezone, input, enabled}. Enabled schedules reject missing or disabled workflows. Cron schedules fire recurringly; runAt fires once. Fires honor the workflow's approval policy.","tags":["automation"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleCreateRequest"}}}},"x-canonical-path":"/schedules"}},"/v1/automation/schedules/preview":{"get":{"summary":"Validate a cron expression (query: cron, timezone) and return a description plus the next fire times","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SchedulePreviewResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"cron","in":"query","required":false,"schema":{"type":"string"}},{"name":"timezone","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/schedules/preview"}},"/v1/automation/schedules/{id}":{"get":{"summary":"Get a schedule","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/schedules/{id}"},"patch":{"summary":"Update a schedule (admin). Enabling rejects missing or disabled workflows.","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleUpdateRequest"}}}},"x-canonical-path":"/schedules/{id}"},"delete":{"summary":"Delete a schedule (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/schedules/{id}"}},"/v1/automation/schedules/{id}/enable":{"post":{"summary":"Enable a schedule (admin). Rejects missing or disabled workflows.","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id/enable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/schedules/{id}/enable"}},"/v1/automation/schedules/{id}/disable":{"post":{"summary":"Disable a schedule (admin)","tags":["automation"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id/disable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/schedules/{id}/disable"}},"/v1/automation/schedules/{id}/run-now":{"post":{"summary":"Fire a schedule immediately without changing its cadence, creating a run with Scheduled provenance. Requires Idempotency-Key.","tags":["automation"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkflowRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/schedules/:id/run-now","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"x-canonical-path":"/schedules/{id}/run-now"}},"/v1/library/agents":{"get":{"summary":"List reusable agent roles","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/agents","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/agents"},"post":{"summary":"Create an agent role (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/agents","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/agents"}},"/v1/library/agents/{slug}":{"patch":{"summary":"Update an agent role (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/agents/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/agents/{slug}"}},"/v1/library/skills":{"get":{"summary":"List skills","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/skills","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/skills"},"post":{"summary":"Create a skill (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/skills","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/skills"}},"/v1/library/skills/{slug}":{"patch":{"summary":"Update a skill (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/skills/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/skills/{slug}"}},"/v1/library/knowledge":{"get":{"summary":"List knowledge resources (?q= searches)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/knowledge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/knowledge"},"post":{"summary":"Create a knowledge resource (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/knowledge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/knowledge"}},"/v1/library/knowledge/{slug}":{"patch":{"summary":"Update a knowledge resource (admin)","tags":["library"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/knowledge/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/knowledge/{slug}"}},"/v1/repos":{"get":{"summary":"Composed repo-centric list: local git repositories joined with CI-connected repositories (activity + attention + CI enablement), for the unified Repos surface.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/repos"}},"/v1/repos/{id}":{"get":{"summary":"Composed repo detail: joined local + CI repository row, recent pipelines, and linked runs, for the unified Repos surface.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/repos/{id}"}},"/v1/local-repos":{"get":{"summary":"List operator-discovered local git repositories on approved Hub host roots. Hidden and archived repos are omitted unless explicitly included.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"includeArchived","in":"query","required":false,"schema":{"type":"boolean"}},{"name":"includeHidden","in":"query","required":false,"schema":{"type":"boolean"}}],"x-canonical-path":"/local-repos"}},"/v1/local-repos/refresh":{"post":{"summary":"Explicitly refresh the bounded local repository discovery index under configured approved roots.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/refresh","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/local-repos/refresh"}},"/v1/local-repos/{id}":{"get":{"summary":"Get one canonical local repository plus recent linked runs.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}"}},"/v1/local-repos/{id}/browse":{"get":{"summary":"Browse a bounded, read-only filenames-and-metadata tree contained inside one canonical local repository.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/browse","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"path","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/browse"}},"/v1/local-repos/{id}/archive":{"post":{"summary":"Archive a local repository from the active UI/index without changing execution approval.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/archive","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/archive"}},"/v1/local-repos/{id}/restore":{"post":{"summary":"Restore a hidden or archived local repository to the active UI/index.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/restore","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/restore"}},"/v1/local-repos/{id}/approve":{"post":{"summary":"Approve a discovered local repository for future run targeting. UI visibility and execution approval are distinct states.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/approve","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/approve"}},"/v1/local-repos/{id}/revoke":{"post":{"summary":"Revoke run targeting approval for a local repository without deleting its index record.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LocalRepositoryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/revoke","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/revoke"}},"/v1/local-repos/{id}/hide":{"post":{"summary":"Hide a local repository from the active UI/index without granting or revoking execution approval.","tags":["repos"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/local-repos/:id/hide","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/local-repos/{id}/hide"}},"/v1/runs":{"get":{"summary":"List runs (filter by status, q, workflow)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"workflow","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/runs"}},"/v1/runs/attention":{"get":{"summary":"The operator triage queue: runs whose next step is a human action — paused (resume them), waiting for approval (decide), or stopped at their budget in the last 7 days (raise the budget and rerun) — plus counts including pending approval cards","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttentionRunsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/attention","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/runs/attention"}},"/v1/signals":{"get":{"summary":"List signals — accretive claims that work may be needed, held off the boards until they mature. Filters: state, connector, project, kind, surface, q, limit.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signals"},"post":{"summary":"Upsert a signal candidate with its supporting observation. Merges onto an existing signal when the normalized statement matches, so analysers never fork duplicates.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signals"}},"/v1/signals/observations/analysed":{"post":{"summary":"Mark observations as analysed so the next analyser run does not reprocess them","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signal-observations/analysed","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signal-observations/analysed"}},"/v1/signals/{id}":{"get":{"summary":"Get a signal with its evidence ledger and hydrated observations","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/signals/{id}"},"patch":{"summary":"Edit a signal statement, classification, or dismiss it with a reason","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/signals/{id}"}},"/v1/signals/{id}/promote":{"post":{"summary":"Promote a signal into a work item on its project board, carrying the evidence ledger. Idempotent — an already-promoted signal returns its existing ticket.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals/:id/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/signals/{id}/promote"}},"/v1/signals/promote-mature":{"post":{"summary":"Promote every signal that passed the maturity gate and has no ticket yet, capped per call. Used by pipelines configured for full automation.","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals/promote-mature","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signals/promote-mature"}},"/v1/signals/{id}/merge":{"post":{"summary":"Merge a signal into another, moving its evidence to the target","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signals/:id/merge","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/signals/{id}/merge"}},"/v1/signals/observations":{"get":{"summary":"List raw connector observations, including ones the relevance prefilter did not queue","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signal-observations","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signal-observations"},"post":{"summary":"Ingest connector observations, idempotent on content hash","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signal-observations","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signal-observations"}},"/v1/signals/connectors":{"get":{"summary":"Connector health: observation counts by state per connector","tags":["signals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/signal-connectors","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/signal-connectors"}},"/v1/runs/views":{"get":{"summary":"List deployment-global saved Runs filter views","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-views","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/run-views"},"post":{"summary":"Create a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-views","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/run-views"}},"/v1/runs/views/{id}":{"get":{"summary":"Get a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/run-views/{id}"},"patch":{"summary":"Update a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/run-views/{id}"},"delete":{"summary":"Delete a deployment-global saved Runs filter view","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/run-views/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/run-views/{id}"}},"/v1/usage/summary":{"get":{"summary":"Cross-run metered usage rollup for a time window (?days=, default 30, max 365): fleet totals (tokens, costMicros, calls, meteredRuns), a per-workflow breakdown sorted by spend, and how many runs stopped at their budget","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageSummaryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/usage/summary","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer"}}],"x-canonical-path":"/usage/summary"}},"/v1/runs/{id}":{"get":{"summary":"Get run: status, outputs, error, Smithers engineDetail (launcher/startedBy plus partial child failures), and responseEndpoints[] delivery state","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}"}},"/v1/runs/{id}/handoff":{"get":{"summary":"Get a bounded agent handoff pack for a run: lifecycle, next action, approvals, usage, output summary, Smithers engine detail, artifacts, diagnostics, flow, work-item link, and deep links","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunHandoffResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/handoff","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/handoff"}},"/v1/runs/{id}/events":{"get":{"summary":"Get run events","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunEventsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/events","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attemptId","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/events"}},"/v1/runs/{id}/events/stream":{"get":{"summary":"Live run events over Server-Sent Events: replays persisted events after ?afterSeq= (or the Last-Event-ID header), then tails live with id:<seq> frames, keepalive comments, and a final run-terminal frame before closing on a terminal run. Backs `runyard run --follow` / `runyard logs --follow`; poll /runs/{id}/events for the same data","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/events/stream","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/events/stream"}},"/v1/runs/{id}/log-summary":{"get":{"summary":"Get the run's log summary on its own (also embedded in /runs/{id} and /runs/{id}/diagnostics)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/log-summary","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/log-summary"}},"/v1/runs/{id}/diagnostics":{"get":{"summary":"Get diagnostics and log summary for a run","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDiagnosticsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/diagnostics","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/diagnostics"}},"/v1/runs/{id}/logs":{"get":{"summary":"Get run log lines","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/logs","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/logs"}},"/v1/runs/{id}/timeline":{"get":{"summary":"Get a unified ascending run timeline built from status transitions, events, and artifacts. Supports since=<iso> and limit=<n>; used by `runyard tail`.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTimelineResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/timeline","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}}],"x-canonical-path":"/runs/{id}/timeline"}},"/v1/runs/{id}/flow":{"get":{"summary":"Execution flow: the workflow's static step graph with this run's events folded on — one state per step (pending/active/done/failed/waiting/cancelled/skipped), timings, and pending approvals. Degrades to an event-derived stepper when no source graph exists.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunFlowResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/flow","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/flow"}},"/v1/runs/{id}/usage":{"get":{"summary":"Get the run's metered model-call usage: aggregate totals (tokens, costMicros, byModel/byProvider), the optional budget, and per-call usage records","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunUsageResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/usage","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/usage"}},"/v1/runs/{id}/cancel":{"post":{"summary":"Cancel a queued or running run","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/cancel","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/cancel"}},"/v1/runs/{id}/pause":{"post":{"summary":"Pause an active run for a recoverable external interruption (credits/quota exhausted, provider limit, manual). Body mode defaults to 'immediate', which cancels the Smithers run at its checkpoint and frees the runner slot quickly. mode 'graceful' records status pause_requested, asks Smithers to finish the active task, keeps the runner slot until Smithers parks, then records status paused with the checkpoint for resume.","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/pause","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/pause"}},"/v1/runs/{id}/resume":{"post":{"summary":"Resume a paused run: re-queues the same run and continues from the recorded Smithers checkpoint when one exists (otherwise it re-runs from scratch, flagged in the response). Body accepts strategy 'rerun_from_scratch' to discard the checkpoint and runner pin, or 'smithers_resume' to insist on the checkpoint (409 when none is recorded); the response warns when the checkpoint's runner is offline","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunActionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/resume","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunResumeRequest"}}}},"x-canonical-path":"/runs/{id}/resume"}},"/v1/runs/{id}/rerun":{"post":{"summary":"Re-run the run. Same (or omitted) input retries the SAME stable run as a new immutable attempt — keep polling the id you already have; an edited input starts a new linked run. force:true supersedes a still-active attempt first","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/rerun","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunRequest"}}}},"x-canonical-path":"/runs/{id}/rerun"}},"/v1/runs/{id}/fork":{"post":{"summary":"Fork a failed Smithers-backed run from a persisted engine frame. Body: {frame, inputOverrides?, resetNode?, label?}; inputOverrides may only set public workflow input keys, and the new Hub run records lineage to the source Hub run, Smithers run id, and frame","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRerunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/fork","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunForkRequest"}}}},"x-canonical-path":"/runs/{id}/fork"}},"/v1/runs/{id}/retry":{"post":{"summary":"Retry/recover the run as a new immutable attempt on the SAME stable run id (never a second public run). Body: {reason?, force?, failureClass?, workspaceHealthy?, ...} classify the recovery strategy; force:true supersedes a still-active attempt. 409 when an attempt is active and force is not set","tags":["runs"],"responses":{"202":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRetryResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/retry","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunRetryRequest"}}}},"x-canonical-path":"/runs/{id}/retry"}},"/v1/runs/{id}/attempts":{"get":{"summary":"List the run's immutable execution attempts (current + prior failed/superseded tries) with per-attempt status, recovery reason, runner, timestamps, and failure evidence","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAttemptsResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/attempts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/attempts"}},"/v1/runs/{id}/attempts/{attemptId}":{"get":{"summary":"Get one immutable attempt of the run (attempt-scoped diagnostics: archived input, output, error, runner state, cleanup intent)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunAttemptResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/attempts/:attemptId","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"attemptId","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/attempts/{attemptId}"}},"/v1/runs/{id}/promote":{"post":{"summary":"Merge a successful isolated worktree run into its target branch, run gates, push, and clean up the branch/worktree","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunPromotionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/promote","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/promote"}},"/v1/factory/items":{"get":{"summary":"List work items (tickets) with linked-run rollups. Filters: status, project, owner, type, q, limit; archived items are hidden unless includeArchived=true or status=archived.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"project","in":"query","required":false,"schema":{"type":"string"}},{"name":"owner","in":"query","required":false,"schema":{"type":"string"}},{"name":"type","in":"query","required":false,"schema":{"type":"string"}},{"name":"q","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer"}},{"name":"includeArchived","in":"query","required":false,"schema":{"type":"boolean"}}],"x-canonical-path":"/factory-items"},"post":{"summary":"Create a work item (ticket). Factory proposals in triaged get one product-decision card; waiting/blocked tickets with explicit blockers get one open implementation-exception card. Body: {title, description?, project?, type?, status?, priority?, owner?, requester?, acceptanceCriteria?, evaluationGates?, affectedSurfaces?, risks?, implementationPrompt?, nextAction?, blockedReason?, dueAt?}.","tags":["work"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemCreateRequest"}}}},"x-canonical-path":"/factory-items"}},"/v1/factory/items/by-slug/{slug}":{"get":{"summary":"Get a factory item by its human-readable slug","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/by-slug/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/by-slug/{slug}"}},"/v1/factory/items/{id}":{"get":{"summary":"Get a work item with its linked runs, their approvals and artifacts, and the ticket history","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemDetailResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/{id}"},"patch":{"summary":"Update a work item: any create field, including moving status across the board. Lane entry reconciles product/implementation-exception decision invariants, then configured trigger.mode=auto lanes launch workflows from the server for Web/API/CLI/MCP callers and return laneTriggers metadata. Pass negotiate:true on a status move to save a non-ready auto-trigger preflight as a run draft instead of dispatching a doomed run.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemUpdateRequest"}}}},"x-canonical-path":"/factory-items/{id}"},"delete":{"summary":"Delete a work item (admin). Linked runs survive unlinked; prefer status=archived to keep ticket history.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemDeleteResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/{id}"}},"/v1/factory/items/{id}/spec.md":{"get":{"summary":"Get the Factory Item's canonical structured spec fields as a deterministic Markdown projection. Returns ETag and X-RunYard-Revision headers derived from the item version; operational metadata such as status, owner, priority, runs, approvals, and history is excluded from the editable document.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id/spec.md","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/{id}/spec.md"},"put":{"summary":"Conditionally save a Factory Item spec.md document back into the existing structured spec fields. Requires If-Match or X-RunYard-Revision from GET /api/factory-items/{id}/spec.md; stale saves return 409 with current server content and successful saves append factory item history.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id/spec.md","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/{id}/spec.md"}},"/v1/factory/items/{id}/status-preview":{"get":{"summary":"Preview a work-item status move without writing. Returns transition policy results plus destination lane, trigger mode, resolved workflow, synthesized input, duplicate/live-run suppression, and deterministic preflight for auto-trigger lanes.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemStatusPreviewResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id/status-preview","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"toStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"fromStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"boardSlug","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/factory-items/{id}/status-preview"}},"/v1/factory/items/claim-next":{"post":{"summary":"Atomically claim the next unleased Factory Item for an agent pull workflow. Body: {boardSlug?, laneId?, project?, status?, statuses?, claimantLabel?, leaseMs?}. Returns 204 when no eligible item is available.","tags":["work"],"responses":{"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"204":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/claim-next","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimNextRequest"}}}},"x-canonical-path":"/factory-items/claim-next"}},"/v1/factory/item-claims/{claimId}/renew":{"post":{"summary":"Renew an active Factory Item claim lease without moving the ticket or launching lane-triggered runs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-item-claims/:claimId/renew","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"claimId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimRenewRequest"}}}},"x-canonical-path":"/factory-item-claims/{claimId}/renew"}},"/v1/factory/item-claims/{claimId}/release":{"post":{"summary":"Release an active Factory Item claim lease without moving the ticket or launching lane-triggered runs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-item-claims/:claimId/release","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"claimId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FactoryItemClaimReleaseRequest"}}}},"x-canonical-path":"/factory-item-claims/{claimId}/release"}},"/v1/factory/items/{id}/link-run":{"post":{"summary":"Link a run to this work item. Body: {runId}. A run belongs to at most one ticket; relinking moves it (the old ticket keeps an unlink event). Requires Idempotency-Key.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id/link-run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunRequest"}}}},"x-canonical-path":"/factory-items/{id}/link-run"}},"/v1/factory/items/{id}/unlink-run":{"post":{"summary":"Unlink a run from this work item. Body: {runId}. Requires Idempotency-Key.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/factory-items/:id/unlink-run","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkItemLinkRunRequest"}}}},"x-canonical-path":"/factory-items/{id}/unlink-run"}},"/v1/factory/boards":{"get":{"summary":"List boards: durable configured views over work items (lane definitions, project scope, default workflow launch suggestions). One board is the instance default.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/boards"},"post":{"summary":"Create a board. Body: {slug, title, description?, project?, lanes?, defaultWorkflows?, runSuccessStatus?, isDefault?}. Lanes default to the standard seven-column factory layout; project scopes membership ('' = all work items). A lane may include trigger {mode: none|suggest|confirm|auto, workflow?, label?, description?, input?}. runSuccessStatus defaults to review; shipped enables autonomous success.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/boards"}},"/v1/factory/boards/{slug}":{"get":{"summary":"Get one board with its lane definitions (including per-lane ticket counts) and the decorated work items in its scope. includeArchived=true adds archived tickets.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/boards/{slug}"},"patch":{"summary":"Update a board: title, description, project scope, lane definitions/triggers, defaultWorkflows, runSuccessStatus, isDefault. Slug is immutable.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/boards/{slug}"}},"/v1/factory/board-definitions":{"get":{"summary":"List boards as portable definition summaries: slug, title, lane count, project scope, and whether a transition policy is set.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/board-definitions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/board-definitions"}},"/v1/factory/board-definitions/examples/{slug}":{"get":{"summary":"Deprecated. Concrete board/factory definitions are durable Hub state, not Git-shipped examples.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/board-definitions/examples/:slug","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/board-definitions/examples/{slug}"}},"/v1/factory/boards/{slug}/definition":{"get":{"summary":"Export a board as a portable definition document: lanes, statuses, guards, triggers, transition policy, defaultWorkflows. Round-trips through /api/board-definitions/import.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards/:slug/definition","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/boards/{slug}/definition"}},"/v1/factory/boards/{slug}/transitions":{"get":{"summary":"Describe a board's transition policy: every allowed cross-lane move, who can drive it (manual, workflow, run origin, actor id/role), and the message returned when denied.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards/:slug/transitions","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/boards/{slug}/transitions"}},"/v1/factory/boards/{slug}/transitions/check":{"post":{"summary":"Preflight a proposed move against a board's transition policy without mutating anything. Body: {fromStatus, toStatus, actorRole?, workflowSlug?, runOrigin?, runId?}.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/boards/:slug/transitions/check","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/boards/{slug}/transitions/check"}},"/v1/factory/board-definitions/validate":{"post":{"summary":"Validate a portable board definition document without importing it. Returns {valid, definition?, preview: {laneCount, scheduleCount, transitions}, error?}.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/board-definitions/validate","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/board-definitions/validate"}},"/v1/factory/board-definitions/import":{"post":{"summary":"Import a board definition — create the board when new, update lanes/triggers/policy when a board with the same slug exists, and reconcile any embedded schedule hookups by slug so re-imports never duplicate cron jobs.","tags":["work"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/board-definitions/import","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/board-definitions/import"}},"/v1/ci/github-app":{"get":{"summary":"GitHub App configuration health: app id, API base, key/secret presence — never secret values.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/github-app","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/github-app"}},"/v1/ci/repos":{"get":{"summary":"List CI-connected repositories (with installation identity) and their enablement + trust policy. enabled=1 filters to CI-enabled repos.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/repos"}},"/v1/ci/repos/sync":{"post":{"summary":"Sync installations and repositories from the GitHub App (admin). Recovery path for missed installation webhooks and first-time setup; never auto-enables CI on a repo.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/sync","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/repos/sync"}},"/v1/ci/repos/{id}":{"get":{"summary":"Get one connected repository (row id, or full name via ?repo=owner/name) with its recent pipelines.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/repos/{id}"}},"/v1/ci/repos/{id}/enable":{"post":{"summary":"Enable CI for a connected repository. Repositories are connected disabled by default; nothing runs until an operator or a ci:admin agent opts in.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/:id/enable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/repos/{id}/enable"}},"/v1/ci/repos/{id}/disable":{"post":{"summary":"Disable CI for a connected repository. In-flight pipelines finish; new events are ignored.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/:id/disable","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/repos/{id}/disable"}},"/v1/ci/repos/{id}/trust":{"patch":{"summary":"Update a repository's trust policy. Body: {level: trusted|untrusted, allowNative?, runnerTags?}. allowNative requires level=trusted AND the runner's own RUNYARD_RUNNER_CI_NATIVE opt-in; fork PRs are always untrusted regardless.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/:id/trust","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/repos/{id}/trust"}},"/v1/ci/repos/{id}/config":{"get":{"summary":"Inspect the validated .runyard/ci.yml at the trusted default branch (or ?ref=). Unlike other CI reads this pulls file content from the (possibly private) repository with the App credential, so it requires a write-capable scope — read-only tokens see hub state only.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/repos/:id/config","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/repos/{id}/config"}},"/v1/ci/dispatch":{"post":{"summary":"Manually dispatch CI for a connected repository. Body: {repo, ref?} — ref defaults to the default branch and is resolved to an exact sha; the run tests that pinned revision with config loaded from the same trusted revision.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/dispatch","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/dispatch"}},"/v1/ci/pipelines":{"get":{"summary":"List recent CI pipelines (?repo= filters by connected repository; limit up to 200) with parent-run status links.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/pipelines","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/pipelines"}},"/v1/ci/pipelines/{id}":{"get":{"summary":"Get one CI pipeline (by pipeline id or parent run id): trigger provenance, trusted config source sha, tested-checkout semantics, job DAG with live run states, and GitHub check reporting state.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/pipelines/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/pipelines/{id}"}},"/v1/ci/pipelines/{id}/cancel":{"post":{"summary":"Cancel a CI pipeline: the parent run is cancelled, dispatched job runs are cancelled (runners observe and kill their process groups), and pending jobs never start.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/pipelines/:id/cancel","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/pipelines/{id}/cancel"}},"/v1/ci/pipelines/{id}/rerun":{"post":{"summary":"Rerun a pipeline: a fresh pipeline with the original trigger provenance (rerunOfPipelineId) against the same SHAs. The original stays intact as evidence; the rerun supersedes it on the shared concurrency key.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/pipelines/:id/rerun","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/pipelines/{id}/rerun"}},"/v1/ci/pipelines/{id}/sync-checks":{"post":{"summary":"Operator reconciliation after a GitHub Checks reporter outage: reset the bounded retry counters for this pipeline's checks and resync them (admin).","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/pipelines/:id/sync-checks","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/ci/pipelines/{id}/sync-checks"}},"/v1/ci/deliveries":{"get":{"summary":"Webhook delivery ledger diagnostics (admin): per-delivery status (accepted/ignored/duplicate/conflict/invalid), bounded detail, and pipeline linkage. Retention is bounded (RUNYARD_CI_DELIVERY_RETENTION_MS).","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/deliveries","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/deliveries"}},"/v1/ci/diagnostics":{"get":{"summary":"CI operator counters (admin): webhook signature failures/duplicates since boot, 24h delivery totals, active pipelines, queued jobs + max queue latency, and pipelines with retrying check syncs. Low-cardinality by design.","tags":["ci"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/ci/diagnostics","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"x-canonical-path":"/ci/diagnostics"}},"/v1/runs/{id}/artifacts":{"get":{"summary":"List run artifacts","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/runs/:id/artifacts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/runs/{id}/artifacts"}},"/v1/artifacts":{"get":{"summary":"List/search artifacts across runs (?q= searches)","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArtifactListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/artifacts","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/artifacts"}},"/v1/artifacts/{id}/download":{"get":{"summary":"Stream an artifact's bytes as an attachment; HTML/SVG render inline is blocked by Content-Disposition","tags":["runs"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/artifacts/:id/download","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/artifacts/{id}/download"}},"/v1/approvals":{"get":{"summary":"List approvals. Filters: ?status=pending|resolved, kind, workflow, runId, timer=expired|due|hasTimer; resolved cards carry the decision in their resolution field.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalListResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"x-canonical-path":"/approvals"},"post":{"summary":"Create an approval card for a human decision. Body: {title, description, runId?, ask: {action, reason, audience}, timeoutMs?/timeoutAt? + fallback? for timed approvals}.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"201":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalCreateRequest"}}}},"x-canonical-path":"/approvals"}},"/v1/approvals/{id}":{"get":{"summary":"Get a single approval card","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals/:id","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"x-canonical-path":"/approvals/{id}"}},"/v1/approvals/{id}/approve":{"post":{"summary":"Approve request. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals/:id/approve","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}},"x-canonical-path":"/approvals/{id}/approve"}},"/v1/approvals/{id}/reject":{"post":{"summary":"Reject request. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals/:id/reject","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}},"x-canonical-path":"/approvals/{id}/reject"}},"/v1/approvals/{id}/request-changes":{"post":{"summary":"Request changes. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals/:id/request-changes","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionRequest"}}}},"x-canonical-path":"/approvals/{id}/request-changes"}},"/v1/approvals/{id}/choose":{"post":{"summary":"Answer with one of the card's declared named options. Requires Idempotency-Key.","tags":["approvals"],"responses":{"200":{"description":"Successful response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}}},"429":{"description":"Rate limit exceeded","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}},"Retry-After":{"description":"Whole seconds to wait before retrying a 429 response.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"default":{"description":"Error response","headers":{"X-Runyard-API-Version":{"description":"Stable API contract version for this response.","schema":{"type":"string","example":"v1"}},"X-Runyard-API-Lifecycle":{"description":"Lifecycle state of the requested path.","schema":{"type":"string","enum":["stable","compatibility","deprecated","unversioned"]}},"X-Runyard-API-Stable-Path":{"description":"Stable /api/v1 path for compatibility aliases when one exists.","schema":{"type":"string"}},"Deprecation":{"description":"Present only when the requested route is deprecated.","schema":{"type":"string"}},"Sunset":{"description":"Present only when a deprecated route has a scheduled removal date.","schema":{"type":"string","format":"date-time"}},"RateLimit-Limit":{"description":"Maximum requests accepted by the active fixed-window bucket.","schema":{"type":"integer","minimum":0}},"RateLimit-Remaining":{"description":"Requests remaining in the active bucket after this response; 0 on 429.","schema":{"type":"integer","minimum":0}},"RateLimit-Reset":{"description":"Whole seconds until the active bucket resets. Bucket names, keys, and client IPs are never exposed.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"x-api-version":"v1","x-api-lifecycle":{"version":"v1","stability":"stable","deprecated":false,"canonicalPath":"/api/approvals/:id/choose","policy":"/api/v1 is the stable agent contract. Existing canonical /api paths are compatibility aliases and remain supported for existing clients. A breaking change requires a new major API prefix, a written migration guide, at least 180 days of deprecation notice, and Sunset headers at least 90 days before removal. Supported canonical /api compatibility aliases are not deprecated and have no sunset date."},"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","maxLength":255},"description":"Required client-supplied idempotency key. Same key and same request replays the original response; same key with a different request returns 409."}],"x-canonical-path":"/approvals/{id}/choose"}}}}