From 742db76d7833a6801ad7578cfd326b397505cc0d Mon Sep 17 00:00:00 2001 From: zacmiller26 Date: Mon, 28 Sep 2026 11:43:24 -0700 Subject: [PATCH] feat: adopt spec 1.24.1 (per-stage iterations, targetError) --- DESIGN.md | 9 ++++++++- openapi.json | 2 +- src/generated/openapi.d.ts | 4 ++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index ee5aa2f..5546da6 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -1,4 +1,4 @@ -# Simmit TypeScript SDK: v1 Design (revision 2.14) +# Simmit TypeScript SDK: v1 Design (revision 2.15) Scope: public surface and foundations only, a design proposal, not an implementation. Convention reference: `anthropic-sdk-typescript`; where this doc is silent, that SDK's idiom is @@ -546,6 +546,13 @@ excluded (as in §9): downloading/parsing the report bytes and the versioned v2/ ## CHANGELOG +rev 2.14 → rev 2.15 (spec 1.24.1): + +- Re-vendor (additive, non-breaking). The result summary's `multiStage.stages[]` entries gain + optional `iterations` (total iterations the stage's profilesets ran, excluding the headline + actor's own) and `targetError` (the `target_error` the stage ran at). Flows through the + generated types (`JobResult`), no hand-written change. + rev 2.13 → rev 2.14 (spec 1.23.0): - Re-vendor (additive, non-breaking). `ArtifactKind` gains `profileset_results` (`profilesets.json`) diff --git a/openapi.json b/openapi.json index 92650af..9bfa71d 100644 --- a/openapi.json +++ b/openapi.json @@ -1 +1 @@ -{"openapi":"3.1.0","info":{"title":"Simmit API","version":"1.23.0"},"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Opaque API key","description":"Secret API key issued in the dashboard, sent as a Bearer token."}},"schemas":{"WebhookEvent":{"type":"object","properties":{"kind":{"type":"string","enum":["job.terminal"],"description":"Event type."},"version":{"type":"string","enum":["v1"],"description":"Payload schema version."},"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the event was created.","example":"2026-03-25T12:00:00.000Z"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"The job ID.","example":"519253542012420096"},"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"],"description":"Terminal job status."},"statusReason":{"type":["string","null"],"description":"Human-readable reason string, or null."}},"required":["id","status","statusReason"]}},"required":["kind","version","timestamp","payload"]},"JobLinks":{"type":"object","properties":{"share":{"type":"string","format":"uri","description":"URL to a hosted page for this job. Shows live status while the job is queued or running, and the full report once it completes. Returns `404` after retention expires."},"manifest":{"type":"string","format":"uri","description":"URL to the manifest JSON for the latest attempt. Only present once the job reaches a terminal status. Returns `404` after retention expires. May change between responses if the job is retried."}},"required":["share"]}},"parameters":{}},"paths":{"/v1/simc/jobs":{"post":{"operationId":"createJob","summary":"Submit a new SimC sim","description":"Submits a new SimC sim to the queue. Returns immediately with a job ID; the sim runs asynchronously. Use the ID to poll status, fetch the final result, and download any artifacts.\n\nSubmitting reserves credits from your balance: a small starting reservation that grows as the sim runs, plus any priority fee. Actual usage is reconciled on completion and unused reserved credits are refunded. See \"Credits → Job budgets\" in the documentation for details.","tags":["SimC"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7E](?:[\\x20-\\x7E]*[\\x21-\\x7E])?$","description":"Optional client-supplied key (≤255 printable-ASCII chars) for safe retries. Reusing the same key with the same payload returns the original job; reusing it with a different payload returns 409. `metadata` is excluded from the payload comparison. Keys are scoped to your API key and this endpoint, and do not expire."},"required":false,"description":"Optional client-supplied key (≤255 printable-ASCII chars) for safe retries. Reusing the same key with the same payload returns the original job; reusing it with a different payload returns 409. `metadata` is excluded from the payload comparison. Keys are scoped to your API key and this endpoint, and do not expire.","name":"idempotency-key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"build":{"type":"object","properties":{"channel":{"type":"string","enum":["nightly","weekly","latest"],"description":"SimC build channel to run."},"gitBranch":{"type":"string","enum":["midnight"],"description":"Optional SimC git branch to override the channel's default."},"id":{"type":"string","format":"uuid","description":"Pin this job to a specific build: a build ID, as returned in `build.id` on any job response or by `GET /v1/simc/builds`. Available on plans that include build pinning. The build must be from the last 30 days and on the requested branch; if it is unavailable when the job runs, the job falls back to `channel`."}},"required":["channel"],"additionalProperties":false},"profile":{"type":"object","properties":{"text":{"type":"string","description":"SimC profile text to execute (the content you would normally paste into a local simc run). Maximum 2 MB (UTF-8 encoded)."}},"required":["text"],"additionalProperties":false},"runtime":{"type":"object","properties":{"multiStage":{"type":"boolean","description":"Opt-in to multistage execution with automatic culling between stages. When false or omitted, the sim runs in a single pass."},"maxCredits":{"type":"integer","exclusiveMinimum":0,"description":"Optional spend cap for this job, in credits. A job that reaches it is stopped with `errorCode` `max_credits_reached` and billed the cap. The ceiling applied is returned in the response as `runtime.ceiling.maxCredits`; the maximum is `plan.maxCreditsPerJob` on `GET /v1/simc/usage`."},"maxRuntimeSeconds":{"type":"integer","exclusiveMinimum":0,"deprecated":true,"description":"Deprecated: use `maxCredits`. Interpreted as a spend cap of this many seconds at the basis rate of 32 credits per second (`maxCredits = maxRuntimeSeconds × 32`). Do not send both fields."},"maxQueueSeconds":{"type":"integer","exclusiveMinimum":0,"description":"Maximum time this job may wait in the queue before being auto-cancelled, in seconds. Defaults to your plan's queue window when omitted; see `plan.defaultQueueSeconds` and the `plan.maxQueueSeconds` maximum on `GET /v1/simc/usage`. The ceiling applied is returned in the response as `runtime.ceiling.queueSeconds`."}},"additionalProperties":false,"description":"Execution options for this job. Multistage execution is skipped if your input contains unsupported patterns or directives.","example":{"multiStage":true}},"priority":{"type":"string","enum":["background","standard","high"],"default":"standard","description":"Queue priority for this job. Higher priority runs first; same-priority jobs run in submission order. `high` adds a flat per-job fee only when it would buy a faster start, reported in `runtime.priorityFeeCredits`."},"metadata":{"type":"object","additionalProperties":{"type":"string","maxLength":500},"description":"Opaque metadata echoed back unchanged for your own correlation or labels (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution.","example":{"requestId":"req_12345","profileSource":"addon-export","characterRef":"us-illidan-niike"}},"credentials":{"type":"object","properties":{"bnetClientId":{"type":"string","minLength":1,"maxLength":256,"description":"Battle.net API client ID. Must be provided together with `bnetClientSecret`. Lets SimC perform armory and guild imports, and resolve item data in your profile that is missing from the current build."},"bnetClientSecret":{"type":"string","minLength":1,"maxLength":256,"description":"Battle.net API client secret. Must be provided together with `bnetClientId`."}},"additionalProperties":false,"description":"Optional per-job credentials. Used only for this job and never persisted."},"webhook":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string","enum":["job.terminal"]},"minItems":1,"description":"Webhook event types to subscribe to for this job.","example":["job.terminal"]}},"required":["events"],"additionalProperties":false,"description":"Optional webhook subscription settings for this job. Delivery URL and signing secret come from your webhook configuration."},"artifacts":{"type":"object","properties":{"html":{"type":"boolean","description":"Whether to generate an HTML report. Defaults to `false`."},"csv":{"type":"boolean","description":"Whether to generate a CSV result table (`result.csv`): one row per actor, then one row per profileset. Defaults to `false`."},"json":{"type":"object","properties":{"version":{"type":"string","enum":["2","3"],"description":"JSON report schema version. `2` = stable v2.0.0, `3` = v3.0.0-alpha1 (experimental). Defaults to `2`."}},"additionalProperties":false,"description":"JSON report options. A JSON report is always generated; use this to select the schema version."}},"additionalProperties":false,"description":"Controls which output formats are produced. Omit for the default (JSON v2 only). Logs and input artifacts are always produced. For multistage runs, HTML is generated only for the final stage.","example":{"html":true,"csv":true,"json":{"version":"2"}}}},"required":["build","profile"],"additionalProperties":false}}}},"responses":{"200":{"description":"Sim accepted and queued.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-RateLimit-Limit":{"schema":{"type":"string","description":"Your account ceiling for job submissions per minute."},"required":true,"description":"Your account ceiling for job submissions per minute."},"X-RateLimit-Remaining":{"schema":{"type":"string","description":"Submissions you can still make in the current minute."},"required":true,"description":"Submissions you can still make in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"string","description":"Unix epoch seconds when your remaining submissions refill."},"required":true,"description":"Unix epoch seconds when your remaining submissions refill."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"X-Idempotent-Replay":{"schema":{"type":"string","enum":["true"],"description":"Present and equal to `true` only when the response is a replay of an earlier submission with the same `idempotency-key`. Absent on fresh submissions, including the first request that consumed the key."},"required":false,"description":"Present and equal to `true` only when the response is a replay of an earlier submission with the same `idempotency-key`. Absent on fresh submissions, including the first request that consumed the key."}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"id":{"type":"string","minLength":18,"maxLength":18},"runtime":{"type":"object","properties":{"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in the credit reservation. `0` when no fee applied."}},"required":["ceiling"]},"links":{"$ref":"#/components/schemas/JobLinks"},"warnings":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["iterations_clamped","target_error_floored"],"description":"Machine-readable warning category. `iterations_clamped` for `iterations=` values above the platform safety cap; `target_error_floored` for `target_error=` values below the platform safety floor."},"line":{"type":"integer","exclusiveMinimum":0,"description":"1-indexed line number in your input."},"requested":{"type":"number","description":"The value as written in your input."},"applied":{"type":"number","description":"The clamped or floored value the sim runs with."},"message":{"type":"string","description":"Human-readable explanation paired with `kind`."}},"required":["kind","line","requested","applied","message"]},"description":"Warnings about your input. Omitted when there are none. The job still runs at the clamped or floored value."},"deprecations":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The deprecated request field, for example `runtime.maxRuntimeSeconds`."},"message":{"type":"string","description":"How the value was interpreted and which field replaces it."},"docsUrl":{"type":"string","format":"uri","description":"Documentation for the replacement field."}},"required":["field","message","docsUrl"]},"description":"Notices about deprecated request fields your submission used. Omitted when there are none. The job is unaffected."}},"required":["success","id","runtime","links"]}}}},"400":{"description":"Your request was missing required input or failed validation. See `error` for the specific issue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"402":{"description":"The request was rejected because your account has insufficient credits or is inactive. See `code` and `meta` for details. For credit shortfalls, `meta.maxAffordableCredits` indicates the largest `runtime.maxCredits` your current balance can cover.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"properties":{"reason":{"type":"string"},"ceilingMaxCredits":{"type":"number","description":"The per-job credit ceiling the rejected submission would have run under: your `runtime.maxCredits` if set, otherwise the plan ceiling."},"maxAffordableCredits":{"type":"number","description":"Largest `runtime.maxCredits` your current balance covers (after any priority fee)."},"ceilingRuntimeSeconds":{"type":"number","deprecated":true,"description":"Deprecated: `ceilingMaxCredits` expressed in seconds at the basis rate of 32 credits per second."},"maxAffordableRuntimeSeconds":{"type":"number","deprecated":true,"description":"Deprecated: `maxAffordableCredits` expressed in seconds at the basis rate of 32 credits per second."},"docsUrl":{"type":"string","format":"uri","description":"Link to the relevant credits/billing docs for this rejection."}},"required":["reason"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"The supplied `idempotency-key` was previously used with a different request payload. `meta.originalJobId` is the id of the job that originally consumed the key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["idempotency_key_reuse"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["idempotency_key_reuse"]},"originalJobId":{"type":"string","description":"ID of the job that originally consumed this idempotency key."},"docsUrl":{"type":"string","format":"uri"}},"required":["reason","originalJobId"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"413":{"description":"Your request body exceeds the 3 MB maximum. A profile over 2 MB returns code `profile_too_large` instead.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"422":{"description":"Your input was rejected. `code` is `input_sanitized_rejected` when your profile contains directives Simmit does not allow, `too_many_variants` when it expands past your account variant limit, `build_pin_not_allowed` when your plan does not include build pinning, or `build_pin_unavailable` when the pinned `build.id` cannot be used. `meta.message` explains the rejection.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["input_sanitized_rejected","too_many_variants","build_pin_not_allowed","build_pin_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["input_sanitized_rejected","too_many_variants","build_pin_not_allowed","build_pin_unavailable"]},"message":{"type":"string","description":"Human-readable explanation of why the input was rejected."},"docsUrl":{"type":"string","format":"uri","description":"Link to the documentation for this rejection."},"blocked":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer"},"text":{"type":"string"}},"required":["line","text"]},"description":"A sample of rejected lines. The full count may exceed the sample — see `blockedCount` and `blockedTruncated`."},"blockedCount":{"type":"integer","description":"Total number of rejected lines."},"blockedTruncated":{"type":"boolean","description":"`true` when more lines were rejected than included in `blocked`."},"totalVariants":{"type":"integer","description":"Simulated variants your input expands to, counting `profileset`, `copy`, and `set` directives."},"maxVariants":{"type":"integer","description":"Maximum simulated variants per sim for your account."},"upgradeUrl":{"type":"string","format":"uri","description":"Link to your account page, where an upgrade can be requested."},"buildId":{"type":"string","format":"uuid","description":"The rejected `build.id`."},"maxPinAgeDays":{"type":"integer","description":"Maximum age of a pinnable build, in days."}},"required":["reason","message","docsUrl","blocked","blockedCount","blockedTruncated"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"429":{"description":"Your account has exceeded its request rate or in-flight job limit. See `code` and `meta` for the specific cause. `Retry-After` carries the next-attempt time.","headers":{"Retry-After":{"schema":{"type":"string","description":"Seconds to wait before retrying."},"required":true,"description":"Seconds to wait before retrying."},"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":false,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":false,"description":"Your account ceiling for in-flight jobs."},"X-RateLimit-Limit":{"schema":{"type":"string","description":"Your account ceiling for job submissions per minute."},"required":false,"description":"Your account ceiling for job submissions per minute."},"X-RateLimit-Remaining":{"schema":{"type":"string","description":"Submissions you can still make in the current minute."},"required":false,"description":"Submissions you can still make in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"string","description":"Unix epoch seconds when your remaining submissions refill."},"required":false,"description":"Unix epoch seconds when your remaining submissions refill."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["rate_limit_exceeded"]},"meta":{"type":"object","properties":{"scope":{"type":"string","enum":["developer"]}},"required":["scope"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["max_active_jobs_exceeded"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["max_active_jobs_exceeded"]},"maxActiveJobs":{"type":"integer","description":"Maximum number of jobs your account can have in flight."},"activeJobs":{"type":"integer","description":"Jobs your account had in flight when this request was rejected."}},"required":["reason","maxActiveJobs","activeJobs"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}]}}}},"503":{"description":"Your sim was not accepted right now. `code` indicates the cause: `queue_unavailable` when the queue is full or paused, `queue_health_unknown` when queue health cannot be confirmed, `secret_store_unavailable` when per-job credentials supplied with the request could not be stored, or `api_maintenance` during planned maintenance. `Retry-After` carries the next-attempt time.","headers":{"Retry-After":{"schema":{"type":"string","description":"Seconds to wait before retrying."},"required":true,"description":"Seconds to wait before retrying."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["queue_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["queue_unavailable"]},"queueHealth":{"type":"string","description":"Reason the queue is currently rejecting submissions."}},"required":["reason","queueHealth"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["queue_health_unknown"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["queue_health_unknown"]},"laneId":{"type":"string"}},"required":["reason","laneId"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["secret_store_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["secret_store_unavailable"]}},"required":["reason"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["api_maintenance"]},"meta":{"type":"object","properties":{"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying."}},"required":["retryAfterSeconds"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}]}}}}}},"get":{"operationId":"listJobs","summary":"List your recent SimC jobs","description":"Returns your recent SimC jobs, newest first. Older jobs fall outside the retention window and are not returned.","tags":["SimC"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of jobs to return. Defaults to 25, max 100."},"required":false,"description":"Maximum number of jobs to return. Defaults to 25, max 100.","name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":512,"description":"Opaque pagination cursor from a previous list response (`page.nextCursor`)."},"required":false,"description":"Opaque pagination cursor from a previous list response (`page.nextCursor`).","name":"cursor","in":"query"}],"responses":{"200":{"description":"Your recent SimC jobs, newest first.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"jobs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]},"createdAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted. Not used for scheduling or sim execution."},"buildId":{"type":["string","null"],"description":"Build identifier. Use `GET /v1/simc/builds/{id}` for the full build record."},"links":{"$ref":"#/components/schemas/JobLinks"}},"required":["id","status","createdAt","completedAt","errorCode","metadata","buildId","links"]}},"page":{"type":"object","properties":{"limit":{"type":"integer"},"hasMore":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"since":{"type":"string","format":"date-time","description":"Earliest timestamp included in this response. Jobs before this time are not returned."}},"required":["limit","hasMore","nextCursor","since"]}},"required":["jobs","page"]}}}},"400":{"description":"Invalid cursor or query parameter.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/builds":{"get":{"operationId":"listBuilds","summary":"List available SimC builds","tags":["SimC"],"responses":{"200":{"description":"Available SimC builds, grouped by channel.","content":{"application/json":{"schema":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time"},"builds":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","enum":["nightly","weekly","latest"]},"gitBranch":{"type":"string","description":"Git branch this build was produced from."},"repo":{"type":"string","description":"Source repository for this SimC build."},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"simcVersion":{"type":["string","null"],"description":"SimC program version for this build (e.g. `1205-01`). Null when not recorded."},"gameData":{"type":["object","null"],"properties":{"live":{"type":"object","properties":{"version":{"type":"string","description":"Live WoW game version (e.g. `12.0.7.68453`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the live game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"]},"ptr":{"type":["object","null"],"properties":{"version":{"type":"string","description":"PTR WoW game version (e.g. `12.1.0.68569`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the PTR game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"],"description":"PTR game version and hotfix date, or null if this build has no PTR data."}},"required":["live","ptr"],"description":"The live and PTR WoW game versions this build simulates against. Null when not recorded."},"id":{"type":"string","format":"uuid","description":"Unique identifier for this build."},"createdAt":{"type":"string","format":"date-time","description":"When this build was created."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed from gate checks: pass = all gated checks green, partial = gate checks green but other failures exist, fail = gate checks failed (fallback build), unknown = CI data unavailable."},"checks":{"type":"object","properties":{"total":{"type":"integer"},"passed":{"type":"integer"},"failed":{"type":"integer"}},"required":["total","passed","failed"]},"failures":{"type":"array","items":{"type":"string"},"description":"Names of check runs with non-success conclusions (failure, cancelled, timed_out, action_required). Full GitHub job names as-is."},"gatedOn":{"type":"array","items":{"type":"string"},"description":"Glob patterns describing which checks were used as the build gate."},"retrievedAt":{"type":"string","format":"date-time","description":"When CI state was fetched from GitHub."}},"required":["status","checks","failures","gatedOn","retrievedAt"],"description":"Upstream CI status for this commit, with per-check details. Null when CI data is unavailable."},"profiles":{"type":["object","null"],"properties":{"manifest":{"type":"array","items":{"type":"string"},"description":"Profile filenames this build accepts in submitted profile text (e.g. `MID1_Mage_Arcane.simc`). Reference one in your profile text on its own line or as `input=`. Sorted lexicographically."}},"required":["manifest"],"description":"Bundled profiles available for this build. See https://docs.simmit.com/api/bundled-profiles for more."}},"required":["channel","gitBranch","repo","commit","simcVersion","gameData","id","createdAt","ci","profiles"]}}},"required":["generatedAt","builds"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/builds/{id}":{"get":{"operationId":"getBuild","summary":"Get a SimC build","description":"Returns a SimC build by ID, including older builds no longer current on any channel. `GET /v1/simc/builds` lists only the current build per channel. Returns `404` once the build has been removed from retention.","tags":["SimC"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Build ID, as returned in `build.id` on any job response."},"required":true,"description":"Build ID, as returned in `build.id` on any job response.","name":"id","in":"path"}],"responses":{"200":{"description":"Full SimC build details.","content":{"application/json":{"schema":{"type":"object","properties":{"gitBranch":{"type":"string","description":"Git branch this build was produced from."},"repo":{"type":"string","description":"Source repository for this SimC build."},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"simcVersion":{"type":["string","null"],"description":"SimC program version for this build (e.g. `1205-01`). Null when not recorded."},"gameData":{"type":["object","null"],"properties":{"live":{"type":"object","properties":{"version":{"type":"string","description":"Live WoW game version (e.g. `12.0.7.68453`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the live game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"]},"ptr":{"type":["object","null"],"properties":{"version":{"type":"string","description":"PTR WoW game version (e.g. `12.1.0.68569`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the PTR game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"],"description":"PTR game version and hotfix date, or null if this build has no PTR data."}},"required":["live","ptr"],"description":"The live and PTR WoW game versions this build simulates against. Null when not recorded."},"id":{"type":"string","format":"uuid","description":"Unique identifier for this build."},"createdAt":{"type":"string","format":"date-time","description":"When this build was created."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed from gate checks: pass = all gated checks green, partial = gate checks green but other failures exist, fail = gate checks failed (fallback build), unknown = CI data unavailable."},"checks":{"type":"object","properties":{"total":{"type":"integer"},"passed":{"type":"integer"},"failed":{"type":"integer"}},"required":["total","passed","failed"]},"failures":{"type":"array","items":{"type":"string"},"description":"Names of check runs with non-success conclusions (failure, cancelled, timed_out, action_required). Full GitHub job names as-is."},"gatedOn":{"type":"array","items":{"type":"string"},"description":"Glob patterns describing which checks were used as the build gate."},"retrievedAt":{"type":"string","format":"date-time","description":"When CI state was fetched from GitHub."}},"required":["status","checks","failures","gatedOn","retrievedAt"],"description":"Upstream CI status for this commit, with per-check details. Null when CI data is unavailable."},"profiles":{"type":["object","null"],"properties":{"manifest":{"type":"array","items":{"type":"string"},"description":"Profile filenames this build accepts in submitted profile text (e.g. `MID1_Mage_Arcane.simc`). Reference one in your profile text on its own line or as `input=`. Sorted lexicographically."}},"required":["manifest"],"description":"Bundled profiles available for this build. See https://docs.simmit.com/api/bundled-profiles for more."}},"required":["gitBranch","repo","commit","simcVersion","gameData","id","createdAt","ci","profiles"],"description":"Full build record. Same fields as items in `GET /v1/simc/builds`, minus `channel`."}}}},"400":{"description":"Invalid build ID format (must be a UUID).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Build not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}":{"get":{"operationId":"getJob","summary":"Get a SimC job record","description":"Returns the full record for a SimC job, including timestamps, runtime details, metadata, and build info. For lightweight polling while a sim runs, use `GET /v1/simc/jobs/{id}/status` instead.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Full SimC job record.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]},"priority":{"type":"string","enum":["background","standard","high"],"description":"Effective priority the job is running at."},"createdAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"completedAt":{"type":["string","null"],"format":"date-time"},"cancelRequestedAt":{"type":["string","null"],"format":"date-time","description":"When a cancel was requested. Null when no cancel has been requested."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"statusReason":{"type":["string","null"],"description":"Human-readable explanation for the terminal status, paired with `errorCode`."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code."},"retentionDays":{"type":["integer","null"],"minimum":1,"description":"Number of days artifacts are retained after `completedAt`. After this window, artifact endpoints return `410`."},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution."},"runtime":{"type":"object","properties":{"simDurationMs":{"type":["number","null"],"description":"SimC process wall-clock time in milliseconds. Excludes setup and teardown time. Null if the job has not completed or the sim did not start."},"totalDurationMs":{"type":["number","null"],"description":"Total wall-clock time from job start to completion (milliseconds). Includes sim execution, artifact generation, and post-processing. Null when the job has not yet run."},"creditsConsumed":{"type":["integer","null"],"description":"Credits charged for this job, including any priority fee. `0` for terminal jobs with no billable work. Null until the job reaches a terminal state."},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in `creditsConsumed` when the job is billed. `0` when no fee applied. View the current fee from `GET /v1/simc/usage` under `plan.priorityFeeCredits.high`."},"creditsPerSecond":{"type":["number","null"],"description":"Metering rate applied to this run, in credits per second of SimC runtime: `creditsConsumed` is this rate times `simDurationMs` rounded up to whole seconds, plus `priorityFeeCredits`. Null until the job is assigned to a machine."},"vcpus":{"type":["integer","null"],"description":"vCPU count of the machine this run executed on. Null before execution."},"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]}},"required":["simDurationMs","totalDurationMs","creditsConsumed","priorityFeeCredits","creditsPerSecond","vcpus","ceiling"]},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."},"build":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid","description":"Build ID. `GET /v1/simc/builds/{id}` returns the full build record."},"channel":{"type":"string","enum":["nightly","weekly","latest"]},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed CI status for the build commit. See GET /v1/simc/builds for full check details."},"failed":{"type":"integer","description":"Number of CI checks with non-success conclusions (failure, cancelled, timed_out, action_required). See GET /v1/simc/builds for check names."}},"required":["status","failed"],"description":"Compact upstream CI summary (status and failure count) for this commit. The full per-check breakdown is on `GET /v1/simc/builds/{id}`. Null when CI data is unavailable."}},"required":["id","channel","commit","ci"]},"links":{"$ref":"#/components/schemas/JobLinks"}},"required":["id","status","priority","createdAt","startedAt","completedAt","cancelRequestedAt","errorCode","statusReason","simcExitCode","retentionDays","metadata","runtime","retried","build","links"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/result":{"get":{"operationId":"getJobResult","summary":"Get a SimC job result","description":"Returns the full result payload for a finished SimC job — summary metrics, runtime info, and artifact references. Available once the job reaches a terminal status (`completed`, `failed`, `cancelled`, or `timed_out`).","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Full result payload for a finished job.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"]},"priority":{"type":"string","enum":["background","standard","high"],"description":"Effective priority the job is running at."},"createdAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"completedAt":{"type":["string","null"],"format":"date-time"},"cancelRequestedAt":{"type":["string","null"],"format":"date-time","description":"When a cancel was requested. Null when no cancel has been requested."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"statusReason":{"type":["string","null"],"description":"Human-readable explanation for the terminal status, paired with `errorCode`."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code."},"retentionDays":{"type":["integer","null"],"minimum":1,"description":"Number of days artifacts are retained after `completedAt`. After this window, artifact endpoints return `410`."},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution."},"runtime":{"type":"object","properties":{"simDurationMs":{"type":["number","null"],"description":"SimC process wall-clock time in milliseconds. Excludes setup and teardown time. Null if the job has not completed or the sim did not start."},"totalDurationMs":{"type":["number","null"],"description":"Total wall-clock time from job start to completion (milliseconds). Includes sim execution, artifact generation, and post-processing. Null when the job has not yet run."},"creditsConsumed":{"type":["integer","null"],"description":"Credits charged for this job, including any priority fee. `0` for terminal jobs with no billable work. Null until the job reaches a terminal state."},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in `creditsConsumed` when the job is billed. `0` when no fee applied. View the current fee from `GET /v1/simc/usage` under `plan.priorityFeeCredits.high`."},"creditsPerSecond":{"type":["number","null"],"description":"Metering rate applied to this run, in credits per second of SimC runtime: `creditsConsumed` is this rate times `simDurationMs` rounded up to whole seconds, plus `priorityFeeCredits`. Null until the job is assigned to a machine."},"vcpus":{"type":["integer","null"],"description":"vCPU count of the machine this run executed on. Null before execution."},"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]}},"required":["simDurationMs","totalDurationMs","creditsConsumed","priorityFeeCredits","creditsPerSecond","vcpus","ceiling"]},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."},"build":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid","description":"Build ID. `GET /v1/simc/builds/{id}` returns the full build record."},"channel":{"type":"string","enum":["nightly","weekly","latest"]},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed CI status for the build commit. See GET /v1/simc/builds for full check details."},"failed":{"type":"integer","description":"Number of CI checks with non-success conclusions (failure, cancelled, timed_out, action_required). See GET /v1/simc/builds for check names."}},"required":["status","failed"],"description":"Compact upstream CI summary (status and failure count) for this commit. The full per-check breakdown is on `GET /v1/simc/builds/{id}`. Null when CI data is unavailable."}},"required":["id","channel","commit","ci"]},"links":{"$ref":"#/components/schemas/JobLinks"},"result":{"type":"object","properties":{"summary":{"type":["object","null"],"properties":{"metric":{"type":"string","enum":["dps","raid_dps"],"description":"The metric that `mean` and `mean_error` are reported in and that profilesets are ranked by. `dps` is the main actor's own damage. `raid_dps` is the group's combined damage, returned when your input sets `profileset_metric=raid_dps`; `mainActor.mean` is then the group total."},"mainActor":{"type":["object","null"],"properties":{"name":{"type":"string","description":"Actor name as defined in your profile."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."},"profilesets":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"description":"Total number of profilesets in the sim result. When this exceeds the length of `results`, the array was truncated to the top 200 entries by DPS. The `profileset_results` artifact carries the full set."},"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Profileset name as defined in your input."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."},"stage":{"type":"integer","exclusiveMinimum":0,"description":"For multistage runs, the highest stage this profileset reached. Earlier stages run at a coarser `target_error`, so their results carry a larger `mean_error`. `1` for single-pass runs."}},"required":["name","mean","mean_error","mean_stddev","stage"]},"description":"Profileset sweep entries, ranked by DPS (highest first). Truncated to the top 200 entries — see `count` and the `profileset_results` artifact for the full set."}},"required":["count","results"],"description":"Profileset sweep results scoped to this actor (mirrors SimC's `sim.profilesets` block shape). Omitted when no profileset results are available — either the input declared no profilesets, or none were produced."}},"required":["name","mean","mean_error","mean_stddev"],"description":"Result for the headline actor (selected by SimC's `profileset_main_actor_index` directive, default `0`)."},"talents":{"type":"string","description":"The talent build the run simulated for the headline actor, as an in-game export string. Omitted when the run produced no report."},"gear":{"type":"array","items":{"type":"object","properties":{"slot":{"type":"string","description":"SimC slot name (`head`, `neck`, …, `main_hand`, `off_hand`)."},"id":{"type":"integer","exclusiveMinimum":0,"description":"The item id."},"name":{"type":"string","description":"SimC's snake_case item name."},"ilevel":{"type":"integer","exclusiveMinimum":0,"description":"The fully resolved item level the item was simulated at."},"bonusIds":{"type":"array","items":{"type":"integer"},"description":"Bonus ids applied to the item."},"gemIds":{"type":"array","items":{"type":"integer"},"description":"Item ids of socketed gems."},"enchantId":{"type":"integer","description":"The item's enchant id."},"craftedStatIds":{"type":"array","items":{"type":"integer"},"description":"A crafted item's chosen stat ids."}},"required":["slot","id","name"]},"description":"The headline actor's equipped items, in the report's slot order. Each entry carries the ids the item was simulated with. Omitted when the run produced no report."},"actors":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"description":"Total number of actors in the comparison. When this exceeds the length of `results`, the array was truncated to the top 200 entries by DPS. The `actor_results` artifact carries the full set."},"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Actor name as defined in your profile."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."}},"required":["name","mean","mean_error","mean_stddev"]},"description":"Per-actor entries, ranked by DPS (highest first). Truncated to the top 200 entries — see `count` and the `actor_results` artifact for the full set."}},"required":["count","results"],"description":"Per-actor results for a `copy=` comparison, where each actor runs as its own sim. Includes the baseline actor. Omitted for profileset sweeps and single-profile runs."},"iterations":{"type":"integer","exclusiveMinimum":0,"description":"The per-actor iteration count the run used. Omitted for multistage runs, which use a per-stage schedule."},"multiStage":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether multistage execution ran."},"reason":{"type":"string","enum":["disabled_by_option","unsupported_stage_sensitive_directive","unsupported_copy_set_only","unsupported_mixed_profileset_copy_set","no_variants_in_input","unsupported_multi_actor","no_profileset_candidates","below_min_candidates","eligible_profileset_only"],"description":"Why multistage execution did or did not run."},"stages":{"type":"array","items":{"type":"object","properties":{"stage":{"type":"integer","exclusiveMinimum":0,"description":"Stage number (1-indexed)."},"label":{"type":"string","description":"Human-readable stage name (`initial`, `intermediate`, `final`)."},"profilesets":{"type":"integer","minimum":0,"description":"Number of profilesets executed in this stage."},"culled":{"type":"integer","minimum":0,"description":"Number of profilesets eliminated at the end of this stage based on ranking. `0` for the last executed stage."}},"required":["stage","label","profilesets","culled"]},"description":"Per-stage funnel for multistage execution, in execution order. Empty for single-pass runs."}},"required":["enabled","reason","stages"],"description":"Multistage execution metadata."}},"required":["metric","mainActor","multiStage"]},"artifacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"url":{"type":"string","format":"uri","description":"Stable public URL for downloading this artifact. Valid for the full retention window of the job."},"kind":{"type":"string","enum":["html_report","json_report","csv_report","profileset_results","actor_results","input","stdout_log","stderr_log"],"description":"Machine-readable artifact category. `html_report`: HTML report. `json_report`: JSON results. `csv_report`: flat DPS table (`result.csv`), one row per actor then one row per profileset. `profileset_results`: every profileset in the run (`profilesets.json`), ranked by the sim metric in the same row shape the result summary uses — present whenever a sweep produced results, and the way to read past the summary's top 200. `actor_results`: every actor of a `copy=`/`set=` comparison (`actors.json`), ranked the same way in the same row shape as the summary's `actors` block — present only for those runs, and the way to read past that block's top 200. `input`: the exact SimC input your job ran. `stdout_log` / `stderr_log`: SimC logs; consecutive duplicate lines in `stderr_log` are collapsed with a repeat count. For multistage runs, html and json artifacts repeat once per stage — identify them by `kind` together with `stage`."},"mimeType":{"type":"string","enum":["application/json","text/html","text/csv","text/plain"],"description":"MIME type of the artifact content, drawn from a fixed set: `application/json`, `text/html`, `text/csv`, or `text/plain`."},"stage":{"type":["integer","null"],"exclusiveMinimum":0,"description":"Stage number for multistage execution artifacts (1-indexed). Null for single-run jobs or artifacts not associated with a specific multistage stage."}},"required":["id","url","kind","mimeType","stage"]}}},"required":["summary","artifacts"]}},"required":["id","status","priority","createdAt","startedAt","completedAt","cancelRequestedAt","errorCode","statusReason","simcExitCode","retentionDays","metadata","runtime","retried","build","links","result"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"Result not ready. The job has not reached a terminal status yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["result_not_ready"]},"meta":{"type":"object","properties":{"status":{"type":"string","enum":["pending","queued","starting","running"]}},"required":["status"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"422":{"description":"Result unavailable. The job is terminal but no result payload was produced.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["result_unavailable"]},"meta":{"type":"object","properties":{"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"]}},"required":["status"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/profile":{"get":{"operationId":"getJobProfile","summary":"Get a SimC job’s submitted profile","description":"Returns the SimC profile text you submitted with the job. Available at any point in the job’s lifecycle, including while the job is queued or running.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The SimC profile text you submitted with the job.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":["string","null"],"description":"The exact SimC profile text you submitted with this job. `null` if no profile text is stored for the job."}},"required":["text"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/status":{"get":{"operationId":"getJobStatus","summary":"Poll a SimC job status","description":"Returns the current status, queue position, and progress for a SimC job. Designed for polling while a sim runs. Use `include` to add optional fields like `logEntries`.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Comma-separated list of optional fields to include. Supported: `logEntries` (structured log entries from stdout and stderr for running jobs)."},"required":false,"description":"Comma-separated list of optional fields to include. Supported: `logEntries` (structured log entries from stdout and stderr for running jobs).","name":"include","in":"query"}],"responses":{"200":{"description":"Current status, queue position, and progress for the job.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"],"description":"Current job status. Terminal values: completed, failed, cancelled, timed_out."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null],"description":"Machine-readable error code for the terminal state. Null when the job is not terminal or completed successfully."},"statusReason":{"type":["string","null"],"description":"Human-readable explanation paired with `errorCode`. Null when the job is not terminal or no additional detail is available."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code. Null when the job is not terminal."},"queue":{"type":["object","null"],"properties":{"queuedAt":{"type":"string","format":"date-time","description":"When this job entered the queue. For a retried job, this reflects the current attempt, not the original submission."},"estimatedStartSeconds":{"type":["number","null"],"description":"Estimated seconds until this job begins running. Updated on each poll; not a guarantee. Null when no estimate is available."},"estimatedStartUpdatedAt":{"type":["string","null"],"format":"date-time","description":"When the underlying wait-time estimate was last refreshed. Null when no estimate is available."}},"required":["queuedAt","estimatedStartSeconds","estimatedStartUpdatedAt"]},"progress":{"type":"object","properties":{"percent":{"type":["number","null"],"minimum":0,"maximum":100,"description":"Estimated completion percentage (0–100). Null when not yet running."},"stage":{"type":["object","null"],"properties":{"current":{"type":"integer","exclusiveMinimum":0,"description":"Current stage (1-indexed)."},"total":{"type":"integer","exclusiveMinimum":0,"description":"Total number of stages in this run."},"label":{"type":"string","description":"Human-readable name of the current stage (for example \"initial\", \"intermediate\", \"final\")."},"percent":{"type":"number","minimum":0,"maximum":100,"description":"Estimated completion percentage (0–100) within the current stage."}},"required":["current","total","label","percent"],"description":"Stage progress detail while the job is running. Null before the job starts and once it reaches a terminal state. Single-pass jobs report `{ current: 1, total: 1, label: \"initial\" }`."}},"required":["percent","stage"]},"logEntries":{"type":["array","null"],"items":{"type":"object","properties":{"source":{"type":"string","enum":["stdout","stderr"],"description":"Which stream the line came from. `stderr` carries SimC warnings, errors, and notes; `stdout` carries sim output, progress markers, and results."},"message":{"type":"string","description":"The log line text."},"ts":{"type":"number","description":"Epoch milliseconds (UTC) when this line was captured."}},"required":["source","message","ts"]},"description":"Recent log lines from SimC stdout and stderr while the job is running. Full logs are available as artifacts once the job completes. Null when not running or not requested via `include=logEntries`."},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"updatedAt":{"type":["string","null"],"format":"date-time"},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."}},"required":["status","errorCode","statusReason","simcExitCode","queue","progress","logEntries","startedAt","updatedAt","retried"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/artifacts/{id}/url":{"get":{"operationId":"getArtifactUrl","summary":"Get a SimC artifact URL","description":"Returns a stable public URL for a SimC job artifact (HTML report, JSON report, raw log, etc.), valid for the artifact's full retention window. Use this when you need to control the final fetch URL yourself.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"A stable public URL for downloading the artifact. Valid for the artifact's full retention window.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Artifact not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"410":{"description":"The artifact has expired and is no longer available.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/cancel":{"post":{"operationId":"cancelJob","summary":"Cancel a SimC job","description":"Cancels one of your SimC jobs. Jobs that have not started running end immediately. Jobs already in flight are signaled to stop; poll `GET /v1/simc/jobs/{id}/status` to observe the transition to `cancelled`. Repeat calls return the same response.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cancel accepted. `status` is `cancelled` when the job ended before running, or `cancel_requested` when the job was already running and has been signaled to stop.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"id":{"type":"string"},"status":{"type":"string","enum":["cancelled"],"description":"The job ended before it started running and is fully cancelled."}},"required":["success","id","status"]},{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"id":{"type":"string"},"status":{"type":"string","enum":["cancel_requested"],"description":"The job was already running and has been signaled to stop. Poll `GET /v1/simc/jobs/{id}` to observe the transition to `cancelled`."},"cancelRequestedAt":{"type":"string","format":"date-time","description":"When the cancel was requested."}},"required":["success","id","status","cancelRequestedAt"]}]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"Job has already reached a terminal status.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["job_not_cancellable"]},"meta":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]}},"required":["id","status"]}},"required":["error","code","meta"]}}}}}}},"/v1/simc/usage":{"get":{"operationId":"getUsage","summary":"Get your usage summary","description":"Returns your usage for the current period along with a live snapshot of queued and in-flight jobs. For your credit balance, see `GET /v1/simc/credits`.","tags":["Usage"],"responses":{"200":{"description":"Your usage summary.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"period":{"type":"object","properties":{"start":{"type":["string","null"],"format":"date-time","description":"UTC start of the usage period."},"end":{"type":["string","null"],"format":"date-time","description":"UTC end of the usage period."},"simsRun":{"type":"integer","description":"Completed sims in the current period."},"avgRuntimeSeconds":{"type":["number","null"],"description":"Average runtime in seconds for completed sims in the current period."},"readsUsed":{"type":["number","null"],"description":"API read requests consumed in the current period."},"readsLimit":{"type":["number","null"],"description":"Maximum read requests allowed in the current period. Null means no cap."},"readsCapResetAt":{"type":["string","null"],"format":"date-time","description":"When the current reads cap resets."}},"required":["start","end","simsRun","avgRuntimeSeconds","readsUsed","readsLimit","readsCapResetAt"]},"snapshot":{"type":"object","properties":{"activeJobs":{"type":["integer","null"],"description":"Number of jobs currently in flight. The ceiling is `plan.maxActiveJobs`."},"queuedJobs":{"type":["integer","null"],"description":"Number of jobs currently queued."},"runningJobs":{"type":["integer","null"],"description":"Number of jobs currently running or starting."}},"required":["activeJobs","queuedJobs","runningJobs"]},"plan":{"type":"object","properties":{"maxActiveJobs":{"type":["integer","null"],"description":"Maximum jobs your account can have in flight."},"maxCreditsPerJob":{"type":["integer","null"],"description":"Per-job credit ceiling: the largest spend cap (`runtime.maxCredits`) a submission may request, and the most a submission without one can spend."},"defaultCreditsPerJob":{"type":["integer","null"],"description":"The same per-job ceiling as `maxCreditsPerJob`, kept for compatibility."},"maxRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCreditsPerJob`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"defaultRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: `defaultCreditsPerJob` expressed in seconds at the basis rate of 32 credits per second."},"maxQueueSeconds":{"type":["integer","null"],"description":"Maximum time in seconds a job may wait in the queue before being cancelled."},"defaultQueueSeconds":{"type":["integer","null"],"description":"Default queue wait per job in seconds."},"creditsPerSecond":{"type":"integer","minimum":1,"description":"Metering rate for your jobs, in credits per second of SimC runtime. Usage accrues at this rate while a sim runs, so a spend cap of `runtime.maxCredits` buys about `maxCredits / creditsPerSecond` seconds. The rate applied to a finished run is reported on the job as `runtime.creditsPerSecond`."},"vcpuPerJob":{"type":"integer","minimum":1,"description":"vCPUs allocated to each job. Determines how fast a sim completes; billing uses `creditsPerSecond`."},"maxSimcVariants":{"type":["integer","null"],"description":"Maximum simc variants (profilesets, copies, sets) allowed per job. Null means no cap."},"pool":{"type":"string","enum":["standard","warm","dedicated"],"description":"Compute pool your jobs run on. `standard` runs on on-demand capacity, so a job may wait for a machine to boot. `warm` keeps an always-on floor of capacity. `dedicated` is capacity reserved for your account on a custom plan."},"priorityFeeCredits":{"type":"object","properties":{"high":{"type":"integer","minimum":0}},"description":"Per-job priority fee in credits, by priority. Added to the base compute cost for jobs submitted at `high` only when it would buy a faster start."}},"required":["maxActiveJobs","maxCreditsPerJob","defaultCreditsPerJob","maxRuntimeSeconds","defaultRuntimeSeconds","maxQueueSeconds","defaultQueueSeconds","creditsPerSecond","vcpuPerJob","maxSimcVariants","pool","priorityFeeCredits"],"description":"The terms your account runs under: metering rate, runtime and queue ceilings, concurrency and variant caps, compute pool, and priority fees."},"limits":{"type":"object","properties":{"maxActiveJobs":{"type":["integer","null"],"description":"Maximum jobs your account can have in flight."},"maxCreditsPerJob":{"type":["integer","null"],"description":"Per-job credit ceiling: the largest spend cap (`runtime.maxCredits`) a submission may request, and the most a submission without one can spend."},"defaultCreditsPerJob":{"type":["integer","null"],"description":"The same per-job ceiling as `maxCreditsPerJob`, kept for compatibility."},"maxRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCreditsPerJob`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"defaultRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: `defaultCreditsPerJob` expressed in seconds at the basis rate of 32 credits per second."},"maxQueueSeconds":{"type":["integer","null"],"description":"Maximum time in seconds a job may wait in the queue before being cancelled."},"defaultQueueSeconds":{"type":["integer","null"],"description":"Default queue wait per job in seconds."},"creditsPerSecond":{"type":"integer","minimum":1,"description":"Metering rate for your jobs, in credits per second of SimC runtime. Usage accrues at this rate while a sim runs, so a spend cap of `runtime.maxCredits` buys about `maxCredits / creditsPerSecond` seconds. The rate applied to a finished run is reported on the job as `runtime.creditsPerSecond`."},"vcpuPerJob":{"type":"integer","minimum":1,"description":"vCPUs allocated to each job. Determines how fast a sim completes; billing uses `creditsPerSecond`."},"maxSimcVariants":{"type":["integer","null"],"description":"Maximum simc variants (profilesets, copies, sets) allowed per job. Null means no cap."},"pool":{"type":"string","enum":["standard","warm","dedicated"],"description":"Compute pool your jobs run on. `standard` runs on on-demand capacity, so a job may wait for a machine to boot. `warm` keeps an always-on floor of capacity. `dedicated` is capacity reserved for your account on a custom plan."},"priorityFeeCredits":{"type":"object","properties":{"high":{"type":"integer","minimum":0}},"description":"Per-job priority fee in credits, by priority. Added to the base compute cost for jobs submitted at `high` only when it would buy a faster start."}},"required":["maxActiveJobs","maxCreditsPerJob","defaultCreditsPerJob","maxRuntimeSeconds","defaultRuntimeSeconds","maxQueueSeconds","defaultQueueSeconds","creditsPerSecond","vcpuPerJob","maxSimcVariants","pool","priorityFeeCredits"],"deprecated":true,"description":"Deprecated alias of `plan` with identical contents."}},"required":["period","snapshot","plan","limits"],"description":"Your usage: period metrics, live snapshot counters, and your plan terms. For your credit balance, see `GET /v1/simc/credits`."}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/credits":{"get":{"operationId":"getCredits","summary":"Get your credit balance and active grants","description":"Returns your credit balance, split between purchased credits and any active grants.\n\nConsumption order: grants are spent before purchased credits, with the earliest-expiring grant spent first. Grants without an expiry are spent last.\n\nFor transaction history and lifetime totals, see the dashboard.","tags":["Credits"],"responses":{"200":{"description":"Your credit balance and active grants.","headers":{"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"purchased":{"type":"integer","description":"Total purchased credit balance. Purchased credits do not expire."},"reserved":{"type":"integer","minimum":0,"description":"Credits currently held against your in-flight jobs, excluded from `purchased` and `grants[].remaining`. Any unused amount returns to them on settlement."},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"reason":{"type":"string","enum":["grant_sandbox_allowance","grant_developer_allowance","grant_beta","grant_promo","grant_onboarding","grant_sandbox_restricted_onboarding","grant_personal_allowance","grant_personal_plus_allowance","onboarding","allowance","promo"],"description":"The reason this grant was issued."},"remaining":{"type":"integer","description":"Credits currently available in this grant. Excludes any credits already committed to in-flight jobs."},"original":{"type":"integer","minimum":0,"description":"Credits originally issued in this grant."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When this grant expires. `null` means the grant has no expiry. After expiry, any remaining credits in the grant are forfeited and the grant no longer appears in this response."}},"required":["id","reason","remaining","original","expiresAt"],"description":"A single active grant. Each grant is a separate pool of credits with its own balance and optional expiry."},"description":"Your active grants, ordered by expiry (soonest first; grants without expiry last). Empty when no grants are active."}},"required":["purchased","reserved","grants"],"description":"Your credit balance. Total available credits equal `purchased + sum(grants[].remaining)`."}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}}},"webhooks":{"job.terminal":{"post":{"description":"Sent when a subscribed job reaches a terminal state (completed, failed, cancelled, or timed_out). Configure your endpoint URL and signing secret in the dashboard, then subscribe individual jobs by including webhook.events in the POST /simc/jobs request body. Every delivery is signed — verify X-Simmit-Signature before trusting the payload.","parameters":[{"schema":{"type":"string","description":"HMAC-SHA256 signature for verifying authenticity. Format: `t=,v1=`. The signed message is `{t}.{rawBody}` (the timestamp, a literal dot, and the raw JSON body), keyed by your webhook signing secret. Reject deliveries whose `t` is more than 300 seconds old to mitigate replay.","example":"t=1711360000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8f9"},"required":true,"description":"HMAC-SHA256 signature for verifying authenticity. Format: `t=,v1=`. The signed message is `{t}.{rawBody}` (the timestamp, a literal dot, and the raw JSON body), keyed by your webhook signing secret. Reject deliveries whose `t` is more than 300 seconds old to mitigate replay.","name":"X-Simmit-Signature","in":"header"},{"schema":{"type":"string","description":"Unique ID for the event. Stable across retries — use it to deduplicate deliveries.","example":"519253542012420096"},"required":true,"description":"Unique ID for the event. Stable across retries — use it to deduplicate deliveries.","name":"X-Simmit-Event-Id","in":"header"},{"schema":{"type":"string","description":"Unique ID for this specific delivery attempt. Changes on each retry.","example":"519253542012420097"},"required":true,"description":"Unique ID for this specific delivery attempt. Changes on each retry.","name":"X-Simmit-Delivery-Id","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt. Non-2xx responses trigger retries."}}}}},"servers":[{"url":"https://api.simmit.com"}]} \ No newline at end of file +{"openapi":"3.1.0","info":{"title":"Simmit API","version":"1.24.1"},"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"Opaque API key","description":"Secret API key issued in the dashboard, sent as a Bearer token."}},"schemas":{"WebhookEvent":{"type":"object","properties":{"kind":{"type":"string","enum":["job.terminal"],"description":"Event type."},"version":{"type":"string","enum":["v1"],"description":"Payload schema version."},"timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of when the event was created.","example":"2026-03-25T12:00:00.000Z"},"payload":{"type":"object","properties":{"id":{"type":"string","description":"The job ID.","example":"519253542012420096"},"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"],"description":"Terminal job status."},"statusReason":{"type":["string","null"],"description":"Human-readable reason string, or null."}},"required":["id","status","statusReason"]}},"required":["kind","version","timestamp","payload"]},"JobLinks":{"type":"object","properties":{"share":{"type":"string","format":"uri","description":"URL to a hosted page for this job. Shows live status while the job is queued or running, and the full report once it completes. Returns `404` after retention expires."},"manifest":{"type":"string","format":"uri","description":"URL to the manifest JSON for the latest attempt. Only present once the job reaches a terminal status. Returns `404` after retention expires. May change between responses if the job is retried."}},"required":["share"]}},"parameters":{}},"paths":{"/v1/simc/jobs":{"post":{"operationId":"createJob","summary":"Submit a new SimC sim","description":"Submits a new SimC sim to the queue. Returns immediately with a job ID; the sim runs asynchronously. Use the ID to poll status, fetch the final result, and download any artifacts.\n\nSubmitting reserves credits from your balance: a small starting reservation that grows as the sim runs, plus any priority fee. Actual usage is reconciled on completion and unused reserved credits are refunded. See \"Credits → Job budgets\" in the documentation for details.","tags":["SimC"],"parameters":[{"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[\\x21-\\x7E](?:[\\x20-\\x7E]*[\\x21-\\x7E])?$","description":"Optional client-supplied key (≤255 printable-ASCII chars) for safe retries. Reusing the same key with the same payload returns the original job; reusing it with a different payload returns 409. `metadata` is excluded from the payload comparison. Keys are scoped to your API key and this endpoint, and do not expire."},"required":false,"description":"Optional client-supplied key (≤255 printable-ASCII chars) for safe retries. Reusing the same key with the same payload returns the original job; reusing it with a different payload returns 409. `metadata` is excluded from the payload comparison. Keys are scoped to your API key and this endpoint, and do not expire.","name":"idempotency-key","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"build":{"type":"object","properties":{"channel":{"type":"string","enum":["nightly","weekly","latest"],"description":"SimC build channel to run."},"gitBranch":{"type":"string","enum":["midnight"],"description":"Optional SimC git branch to override the channel's default."},"id":{"type":"string","format":"uuid","description":"Pin this job to a specific build: a build ID, as returned in `build.id` on any job response or by `GET /v1/simc/builds`. Available on plans that include build pinning. The build must be from the last 30 days and on the requested branch; if it is unavailable when the job runs, the job falls back to `channel`."}},"required":["channel"],"additionalProperties":false},"profile":{"type":"object","properties":{"text":{"type":"string","description":"SimC profile text to execute (the content you would normally paste into a local simc run). Maximum 2 MB (UTF-8 encoded)."}},"required":["text"],"additionalProperties":false},"runtime":{"type":"object","properties":{"multiStage":{"type":"boolean","description":"Opt-in to multistage execution with automatic culling between stages. When false or omitted, the sim runs in a single pass."},"maxCredits":{"type":"integer","exclusiveMinimum":0,"description":"Optional spend cap for this job, in credits. A job that reaches it is stopped with `errorCode` `max_credits_reached` and billed the cap. The ceiling applied is returned in the response as `runtime.ceiling.maxCredits`; the maximum is `plan.maxCreditsPerJob` on `GET /v1/simc/usage`."},"maxRuntimeSeconds":{"type":"integer","exclusiveMinimum":0,"deprecated":true,"description":"Deprecated: use `maxCredits`. Interpreted as a spend cap of this many seconds at the basis rate of 32 credits per second (`maxCredits = maxRuntimeSeconds × 32`). Do not send both fields."},"maxQueueSeconds":{"type":"integer","exclusiveMinimum":0,"description":"Maximum time this job may wait in the queue before being auto-cancelled, in seconds. Defaults to your plan's queue window when omitted; see `plan.defaultQueueSeconds` and the `plan.maxQueueSeconds` maximum on `GET /v1/simc/usage`. The ceiling applied is returned in the response as `runtime.ceiling.queueSeconds`."}},"additionalProperties":false,"description":"Execution options for this job. Multistage execution is skipped if your input contains unsupported patterns or directives.","example":{"multiStage":true}},"priority":{"type":"string","enum":["background","standard","high"],"default":"standard","description":"Queue priority for this job. Higher priority runs first; same-priority jobs run in submission order. `high` adds a flat per-job fee only when it would buy a faster start, reported in `runtime.priorityFeeCredits`."},"metadata":{"type":"object","additionalProperties":{"type":"string","maxLength":500},"description":"Opaque metadata echoed back unchanged for your own correlation or labels (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution.","example":{"requestId":"req_12345","profileSource":"addon-export","characterRef":"us-illidan-niike"}},"credentials":{"type":"object","properties":{"bnetClientId":{"type":"string","minLength":1,"maxLength":256,"description":"Battle.net API client ID. Must be provided together with `bnetClientSecret`. Lets SimC perform armory and guild imports, and resolve item data in your profile that is missing from the current build."},"bnetClientSecret":{"type":"string","minLength":1,"maxLength":256,"description":"Battle.net API client secret. Must be provided together with `bnetClientId`."}},"additionalProperties":false,"description":"Optional per-job credentials. Used only for this job and never persisted."},"webhook":{"type":"object","properties":{"events":{"type":"array","items":{"type":"string","enum":["job.terminal"]},"minItems":1,"description":"Webhook event types to subscribe to for this job.","example":["job.terminal"]}},"required":["events"],"additionalProperties":false,"description":"Optional webhook subscription settings for this job. Delivery URL and signing secret come from your webhook configuration."},"artifacts":{"type":"object","properties":{"html":{"type":"boolean","description":"Whether to generate an HTML report. Defaults to `false`."},"csv":{"type":"boolean","description":"Whether to generate a CSV result table (`result.csv`): one row per actor, then one row per profileset. Defaults to `false`."},"json":{"type":"object","properties":{"version":{"type":"string","enum":["2","3"],"description":"JSON report schema version. `2` = stable v2.0.0, `3` = v3.0.0-alpha1 (experimental). Defaults to `2`."}},"additionalProperties":false,"description":"JSON report options. A JSON report is always generated; use this to select the schema version."}},"additionalProperties":false,"description":"Controls which output formats are produced. Omit for the default (JSON v2 only). Logs and input artifacts are always produced. For multistage runs, HTML is generated only for the final stage.","example":{"html":true,"csv":true,"json":{"version":"2"}}}},"required":["build","profile"],"additionalProperties":false}}}},"responses":{"200":{"description":"Sim accepted and queued.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-RateLimit-Limit":{"schema":{"type":"string","description":"Your account ceiling for job submissions per minute."},"required":true,"description":"Your account ceiling for job submissions per minute."},"X-RateLimit-Remaining":{"schema":{"type":"string","description":"Submissions you can still make in the current minute."},"required":true,"description":"Submissions you can still make in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"string","description":"Unix epoch seconds when your remaining submissions refill."},"required":true,"description":"Unix epoch seconds when your remaining submissions refill."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"X-Idempotent-Replay":{"schema":{"type":"string","enum":["true"],"description":"Present and equal to `true` only when the response is a replay of an earlier submission with the same `idempotency-key`. Absent on fresh submissions, including the first request that consumed the key."},"required":false,"description":"Present and equal to `true` only when the response is a replay of an earlier submission with the same `idempotency-key`. Absent on fresh submissions, including the first request that consumed the key."}},"content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"id":{"type":"string","minLength":18,"maxLength":18},"runtime":{"type":"object","properties":{"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in the credit reservation. `0` when no fee applied."}},"required":["ceiling"]},"links":{"$ref":"#/components/schemas/JobLinks"},"warnings":{"type":"array","items":{"type":"object","properties":{"kind":{"type":"string","enum":["iterations_clamped","target_error_floored"],"description":"Machine-readable warning category. `iterations_clamped` for `iterations=` values above the platform safety cap; `target_error_floored` for `target_error=` values below the platform safety floor."},"line":{"type":"integer","exclusiveMinimum":0,"description":"1-indexed line number in your input."},"requested":{"type":"number","description":"The value as written in your input."},"applied":{"type":"number","description":"The clamped or floored value the sim runs with."},"message":{"type":"string","description":"Human-readable explanation paired with `kind`."}},"required":["kind","line","requested","applied","message"]},"description":"Warnings about your input. Omitted when there are none. The job still runs at the clamped or floored value."},"deprecations":{"type":"array","items":{"type":"object","properties":{"field":{"type":"string","description":"The deprecated request field, for example `runtime.maxRuntimeSeconds`."},"message":{"type":"string","description":"How the value was interpreted and which field replaces it."},"docsUrl":{"type":"string","format":"uri","description":"Documentation for the replacement field."}},"required":["field","message","docsUrl"]},"description":"Notices about deprecated request fields your submission used. Omitted when there are none. The job is unaffected."}},"required":["success","id","runtime","links"]}}}},"400":{"description":"Your request was missing required input or failed validation. See `error` for the specific issue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"402":{"description":"The request was rejected because your account has insufficient credits or is inactive. See `code` and `meta` for details. For credit shortfalls, `meta.maxAffordableCredits` indicates the largest `runtime.maxCredits` your current balance can cover.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"properties":{"reason":{"type":"string"},"ceilingMaxCredits":{"type":"number","description":"The per-job credit ceiling the rejected submission would have run under: your `runtime.maxCredits` if set, otherwise the plan ceiling."},"maxAffordableCredits":{"type":"number","description":"Largest `runtime.maxCredits` your current balance covers (after any priority fee)."},"ceilingRuntimeSeconds":{"type":"number","deprecated":true,"description":"Deprecated: `ceilingMaxCredits` expressed in seconds at the basis rate of 32 credits per second."},"maxAffordableRuntimeSeconds":{"type":"number","deprecated":true,"description":"Deprecated: `maxAffordableCredits` expressed in seconds at the basis rate of 32 credits per second."},"docsUrl":{"type":"string","format":"uri","description":"Link to the relevant credits/billing docs for this rejection."}},"required":["reason"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"The supplied `idempotency-key` was previously used with a different request payload. `meta.originalJobId` is the id of the job that originally consumed the key.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["idempotency_key_reuse"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["idempotency_key_reuse"]},"originalJobId":{"type":"string","description":"ID of the job that originally consumed this idempotency key."},"docsUrl":{"type":"string","format":"uri"}},"required":["reason","originalJobId"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"413":{"description":"Your request body exceeds the 3 MB maximum. A profile over 2 MB returns code `profile_too_large` instead.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"422":{"description":"Your input was rejected. `code` is `input_sanitized_rejected` when your profile contains directives Simmit does not allow, `too_many_variants` when it expands past your account variant limit, `build_pin_not_allowed` when your plan does not include build pinning, or `build_pin_unavailable` when the pinned `build.id` cannot be used. `meta.message` explains the rejection.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["input_sanitized_rejected","too_many_variants","build_pin_not_allowed","build_pin_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["input_sanitized_rejected","too_many_variants","build_pin_not_allowed","build_pin_unavailable"]},"message":{"type":"string","description":"Human-readable explanation of why the input was rejected."},"docsUrl":{"type":"string","format":"uri","description":"Link to the documentation for this rejection."},"blocked":{"type":"array","items":{"type":"object","properties":{"line":{"type":"integer"},"text":{"type":"string"}},"required":["line","text"]},"description":"A sample of rejected lines. The full count may exceed the sample — see `blockedCount` and `blockedTruncated`."},"blockedCount":{"type":"integer","description":"Total number of rejected lines."},"blockedTruncated":{"type":"boolean","description":"`true` when more lines were rejected than included in `blocked`."},"totalVariants":{"type":"integer","description":"Simulated variants your input expands to, counting `profileset`, `copy`, and `set` directives."},"maxVariants":{"type":"integer","description":"Maximum simulated variants per sim for your account."},"upgradeUrl":{"type":"string","format":"uri","description":"Link to your account page, where an upgrade can be requested."},"buildId":{"type":"string","format":"uuid","description":"The rejected `build.id`."},"maxPinAgeDays":{"type":"integer","description":"Maximum age of a pinnable build, in days."}},"required":["reason","message","docsUrl","blocked","blockedCount","blockedTruncated"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"429":{"description":"Your account has exceeded its request rate or in-flight job limit. See `code` and `meta` for the specific cause. `Retry-After` carries the next-attempt time.","headers":{"Retry-After":{"schema":{"type":"string","description":"Seconds to wait before retrying."},"required":true,"description":"Seconds to wait before retrying."},"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":false,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":false,"description":"Your account ceiling for in-flight jobs."},"X-RateLimit-Limit":{"schema":{"type":"string","description":"Your account ceiling for job submissions per minute."},"required":false,"description":"Your account ceiling for job submissions per minute."},"X-RateLimit-Remaining":{"schema":{"type":"string","description":"Submissions you can still make in the current minute."},"required":false,"description":"Submissions you can still make in the current minute."},"X-RateLimit-Reset":{"schema":{"type":"string","description":"Unix epoch seconds when your remaining submissions refill."},"required":false,"description":"Unix epoch seconds when your remaining submissions refill."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["rate_limit_exceeded"]},"meta":{"type":"object","properties":{"scope":{"type":"string","enum":["developer"]}},"required":["scope"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["max_active_jobs_exceeded"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["max_active_jobs_exceeded"]},"maxActiveJobs":{"type":"integer","description":"Maximum number of jobs your account can have in flight."},"activeJobs":{"type":"integer","description":"Jobs your account had in flight when this request was rejected."}},"required":["reason","maxActiveJobs","activeJobs"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}]}}}},"503":{"description":"Your sim was not accepted right now. `code` indicates the cause: `queue_unavailable` when the queue is full or paused, `queue_health_unknown` when queue health cannot be confirmed, `secret_store_unavailable` when per-job credentials supplied with the request could not be stored, or `api_maintenance` during planned maintenance. `Retry-After` carries the next-attempt time.","headers":{"Retry-After":{"schema":{"type":"string","description":"Seconds to wait before retrying."},"required":true,"description":"Seconds to wait before retrying."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["queue_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["queue_unavailable"]},"queueHealth":{"type":"string","description":"Reason the queue is currently rejecting submissions."}},"required":["reason","queueHealth"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["queue_health_unknown"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["queue_health_unknown"]},"laneId":{"type":"string"}},"required":["reason","laneId"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["secret_store_unavailable"]},"meta":{"type":"object","properties":{"reason":{"type":"string","enum":["secret_store_unavailable"]}},"required":["reason"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]},{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["api_maintenance"]},"meta":{"type":"object","properties":{"retryAfterSeconds":{"type":"integer","description":"Seconds to wait before retrying."}},"required":["retryAfterSeconds"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}]}}}}}},"get":{"operationId":"listJobs","summary":"List your recent SimC jobs","description":"Returns your recent SimC jobs, newest first. Older jobs fall outside the retention window and are not returned.","tags":["SimC"],"parameters":[{"schema":{"type":"integer","minimum":1,"maximum":100,"description":"Maximum number of jobs to return. Defaults to 25, max 100."},"required":false,"description":"Maximum number of jobs to return. Defaults to 25, max 100.","name":"limit","in":"query"},{"schema":{"type":"string","minLength":1,"maxLength":512,"description":"Opaque pagination cursor from a previous list response (`page.nextCursor`)."},"required":false,"description":"Opaque pagination cursor from a previous list response (`page.nextCursor`).","name":"cursor","in":"query"}],"responses":{"200":{"description":"Your recent SimC jobs, newest first.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"jobs":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]},"createdAt":{"type":["string","null"],"format":"date-time"},"completedAt":{"type":["string","null"],"format":"date-time"},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted. Not used for scheduling or sim execution."},"buildId":{"type":["string","null"],"description":"Build identifier. Use `GET /v1/simc/builds/{id}` for the full build record."},"links":{"$ref":"#/components/schemas/JobLinks"}},"required":["id","status","createdAt","completedAt","errorCode","metadata","buildId","links"]}},"page":{"type":"object","properties":{"limit":{"type":"integer"},"hasMore":{"type":"boolean"},"nextCursor":{"type":["string","null"]},"since":{"type":"string","format":"date-time","description":"Earliest timestamp included in this response. Jobs before this time are not returned."}},"required":["limit","hasMore","nextCursor","since"]}},"required":["jobs","page"]}}}},"400":{"description":"Invalid cursor or query parameter.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/builds":{"get":{"operationId":"listBuilds","summary":"List available SimC builds","tags":["SimC"],"responses":{"200":{"description":"Available SimC builds, grouped by channel.","content":{"application/json":{"schema":{"type":"object","properties":{"generatedAt":{"type":"string","format":"date-time"},"builds":{"type":"array","items":{"type":"object","properties":{"channel":{"type":"string","enum":["nightly","weekly","latest"]},"gitBranch":{"type":"string","description":"Git branch this build was produced from."},"repo":{"type":"string","description":"Source repository for this SimC build."},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"simcVersion":{"type":["string","null"],"description":"SimC program version for this build (e.g. `1205-01`). Null when not recorded."},"gameData":{"type":["object","null"],"properties":{"live":{"type":"object","properties":{"version":{"type":"string","description":"Live WoW game version (e.g. `12.0.7.68453`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the live game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"]},"ptr":{"type":["object","null"],"properties":{"version":{"type":"string","description":"PTR WoW game version (e.g. `12.1.0.68569`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the PTR game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"],"description":"PTR game version and hotfix date, or null if this build has no PTR data."}},"required":["live","ptr"],"description":"The live and PTR WoW game versions this build simulates against. Null when not recorded."},"id":{"type":"string","format":"uuid","description":"Unique identifier for this build."},"createdAt":{"type":"string","format":"date-time","description":"When this build was created."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed from gate checks: pass = all gated checks green, partial = gate checks green but other failures exist, fail = gate checks failed (fallback build), unknown = CI data unavailable."},"checks":{"type":"object","properties":{"total":{"type":"integer"},"passed":{"type":"integer"},"failed":{"type":"integer"}},"required":["total","passed","failed"]},"failures":{"type":"array","items":{"type":"string"},"description":"Names of check runs with non-success conclusions (failure, cancelled, timed_out, action_required). Full GitHub job names as-is."},"gatedOn":{"type":"array","items":{"type":"string"},"description":"Glob patterns describing which checks were used as the build gate."},"retrievedAt":{"type":"string","format":"date-time","description":"When CI state was fetched from GitHub."}},"required":["status","checks","failures","gatedOn","retrievedAt"],"description":"Upstream CI status for this commit, with per-check details. Null when CI data is unavailable."},"profiles":{"type":["object","null"],"properties":{"manifest":{"type":"array","items":{"type":"string"},"description":"Profile filenames this build accepts in submitted profile text (e.g. `MID1_Mage_Arcane.simc`). Reference one in your profile text on its own line or as `input=`. Sorted lexicographically."}},"required":["manifest"],"description":"Bundled profiles available for this build. See https://docs.simmit.com/api/bundled-profiles for more."}},"required":["channel","gitBranch","repo","commit","simcVersion","gameData","id","createdAt","ci","profiles"]}}},"required":["generatedAt","builds"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/builds/{id}":{"get":{"operationId":"getBuild","summary":"Get a SimC build","description":"Returns a SimC build by ID, including older builds no longer current on any channel. `GET /v1/simc/builds` lists only the current build per channel. Returns `404` once the build has been removed from retention.","tags":["SimC"],"parameters":[{"schema":{"type":"string","format":"uuid","description":"Build ID, as returned in `build.id` on any job response."},"required":true,"description":"Build ID, as returned in `build.id` on any job response.","name":"id","in":"path"}],"responses":{"200":{"description":"Full SimC build details.","content":{"application/json":{"schema":{"type":"object","properties":{"gitBranch":{"type":"string","description":"Git branch this build was produced from."},"repo":{"type":"string","description":"Source repository for this SimC build."},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"simcVersion":{"type":["string","null"],"description":"SimC program version for this build (e.g. `1205-01`). Null when not recorded."},"gameData":{"type":["object","null"],"properties":{"live":{"type":"object","properties":{"version":{"type":"string","description":"Live WoW game version (e.g. `12.0.7.68453`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the live game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"]},"ptr":{"type":["object","null"],"properties":{"version":{"type":"string","description":"PTR WoW game version (e.g. `12.1.0.68569`)."},"hotfixDate":{"type":"string","description":"Hotfix date of the PTR game data (`YYYY-MM-DD`)."}},"required":["version","hotfixDate"],"description":"PTR game version and hotfix date, or null if this build has no PTR data."}},"required":["live","ptr"],"description":"The live and PTR WoW game versions this build simulates against. Null when not recorded."},"id":{"type":"string","format":"uuid","description":"Unique identifier for this build."},"createdAt":{"type":"string","format":"date-time","description":"When this build was created."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed from gate checks: pass = all gated checks green, partial = gate checks green but other failures exist, fail = gate checks failed (fallback build), unknown = CI data unavailable."},"checks":{"type":"object","properties":{"total":{"type":"integer"},"passed":{"type":"integer"},"failed":{"type":"integer"}},"required":["total","passed","failed"]},"failures":{"type":"array","items":{"type":"string"},"description":"Names of check runs with non-success conclusions (failure, cancelled, timed_out, action_required). Full GitHub job names as-is."},"gatedOn":{"type":"array","items":{"type":"string"},"description":"Glob patterns describing which checks were used as the build gate."},"retrievedAt":{"type":"string","format":"date-time","description":"When CI state was fetched from GitHub."}},"required":["status","checks","failures","gatedOn","retrievedAt"],"description":"Upstream CI status for this commit, with per-check details. Null when CI data is unavailable."},"profiles":{"type":["object","null"],"properties":{"manifest":{"type":"array","items":{"type":"string"},"description":"Profile filenames this build accepts in submitted profile text (e.g. `MID1_Mage_Arcane.simc`). Reference one in your profile text on its own line or as `input=`. Sorted lexicographically."}},"required":["manifest"],"description":"Bundled profiles available for this build. See https://docs.simmit.com/api/bundled-profiles for more."}},"required":["gitBranch","repo","commit","simcVersion","gameData","id","createdAt","ci","profiles"],"description":"Full build record. Same fields as items in `GET /v1/simc/builds`, minus `channel`."}}}},"400":{"description":"Invalid build ID format (must be a UUID).","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Build not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}":{"get":{"operationId":"getJob","summary":"Get a SimC job record","description":"Returns the full record for a SimC job, including timestamps, runtime details, metadata, and build info. For lightweight polling while a sim runs, use `GET /v1/simc/jobs/{id}/status` instead.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Full SimC job record.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]},"priority":{"type":"string","enum":["background","standard","high"],"description":"Effective priority the job is running at."},"createdAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"completedAt":{"type":["string","null"],"format":"date-time"},"cancelRequestedAt":{"type":["string","null"],"format":"date-time","description":"When a cancel was requested. Null when no cancel has been requested."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"statusReason":{"type":["string","null"],"description":"Human-readable explanation for the terminal status, paired with `errorCode`."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code."},"retentionDays":{"type":["integer","null"],"minimum":1,"description":"Number of days artifacts are retained after `completedAt`. After this window, artifact endpoints return `410`."},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution."},"runtime":{"type":"object","properties":{"simDurationMs":{"type":["number","null"],"description":"SimC process wall-clock time in milliseconds. Excludes setup and teardown time. Null if the job has not completed or the sim did not start."},"totalDurationMs":{"type":["number","null"],"description":"Total wall-clock time from job start to completion (milliseconds). Includes sim execution, artifact generation, and post-processing. Null when the job has not yet run."},"creditsConsumed":{"type":["integer","null"],"description":"Credits charged for this job, including any priority fee. `0` for terminal jobs with no billable work. Null until the job reaches a terminal state."},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in `creditsConsumed` when the job is billed. `0` when no fee applied. View the current fee from `GET /v1/simc/usage` under `plan.priorityFeeCredits.high`."},"creditsPerSecond":{"type":["number","null"],"description":"Metering rate applied to this run, in credits per second of SimC runtime: `creditsConsumed` is this rate times `simDurationMs` rounded up to whole seconds, plus `priorityFeeCredits`. Null until the job is assigned to a machine."},"vcpus":{"type":["integer","null"],"description":"vCPU count of the machine this run executed on. Null before execution."},"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]}},"required":["simDurationMs","totalDurationMs","creditsConsumed","priorityFeeCredits","creditsPerSecond","vcpus","ceiling"]},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."},"build":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid","description":"Build ID. `GET /v1/simc/builds/{id}` returns the full build record."},"channel":{"type":"string","enum":["nightly","weekly","latest"]},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed CI status for the build commit. See GET /v1/simc/builds for full check details."},"failed":{"type":"integer","description":"Number of CI checks with non-success conclusions (failure, cancelled, timed_out, action_required). See GET /v1/simc/builds for check names."}},"required":["status","failed"],"description":"Compact upstream CI summary (status and failure count) for this commit. The full per-check breakdown is on `GET /v1/simc/builds/{id}`. Null when CI data is unavailable."}},"required":["id","channel","commit","ci"]},"links":{"$ref":"#/components/schemas/JobLinks"}},"required":["id","status","priority","createdAt","startedAt","completedAt","cancelRequestedAt","errorCode","statusReason","simcExitCode","retentionDays","metadata","runtime","retried","build","links"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/result":{"get":{"operationId":"getJobResult","summary":"Get a SimC job result","description":"Returns the full result payload for a finished SimC job — summary metrics, runtime info, and artifact references. Available once the job reaches a terminal status (`completed`, `failed`, `cancelled`, or `timed_out`).","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Full result payload for a finished job.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"]},"priority":{"type":"string","enum":["background","standard","high"],"description":"Effective priority the job is running at."},"createdAt":{"type":["string","null"],"format":"date-time"},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"completedAt":{"type":["string","null"],"format":"date-time"},"cancelRequestedAt":{"type":["string","null"],"format":"date-time","description":"When a cancel was requested. Null when no cancel has been requested."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null]},"statusReason":{"type":["string","null"],"description":"Human-readable explanation for the terminal status, paired with `errorCode`."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code."},"retentionDays":{"type":["integer","null"],"minimum":1,"description":"Number of days artifacts are retained after `completedAt`. After this window, artifact endpoints return `410`."},"metadata":{"type":["object","null"],"additionalProperties":{},"description":"Opaque metadata echoed back exactly as submitted (for example `profileSource`, `characterRef`). Not used for scheduling or sim execution."},"runtime":{"type":"object","properties":{"simDurationMs":{"type":["number","null"],"description":"SimC process wall-clock time in milliseconds. Excludes setup and teardown time. Null if the job has not completed or the sim did not start."},"totalDurationMs":{"type":["number","null"],"description":"Total wall-clock time from job start to completion (milliseconds). Includes sim execution, artifact generation, and post-processing. Null when the job has not yet run."},"creditsConsumed":{"type":["integer","null"],"description":"Credits charged for this job, including any priority fee. `0` for terminal jobs with no billable work. Null until the job reaches a terminal state."},"priorityFeeCredits":{"type":"integer","minimum":0,"description":"Priority fee for this job, included in `creditsConsumed` when the job is billed. `0` when no fee applied. View the current fee from `GET /v1/simc/usage` under `plan.priorityFeeCredits.high`."},"creditsPerSecond":{"type":["number","null"],"description":"Metering rate applied to this run, in credits per second of SimC runtime: `creditsConsumed` is this rate times `simDurationMs` rounded up to whole seconds, plus `priorityFeeCredits`. Null until the job is assigned to a machine."},"vcpus":{"type":["integer","null"],"description":"vCPU count of the machine this run executed on. Null before execution."},"ceiling":{"type":"object","properties":{"maxCredits":{"type":["integer","null"],"description":"The per-job credit ceiling that applied to this run: the usage at which the job is stopped with `errorCode` `max_credits_reached`. Your `runtime.maxCredits` when the submission set one; otherwise the plan ceiling (`plan.maxCreditsPerJob` on `GET /v1/simc/usage`)."},"runtimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCredits`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"queueSeconds":{"type":["integer","null"],"description":"The queue timeout ceiling that applied to this run, in seconds. Jobs that wait in the queue longer than this are auto-cancelled with `errorCode` `queue_timeout`. View the maximum at `GET /v1/simc/usage` under `plan.maxQueueSeconds`."}},"required":["maxCredits","runtimeSeconds","queueSeconds"]}},"required":["simDurationMs","totalDurationMs","creditsConsumed","priorityFeeCredits","creditsPerSecond","vcpus","ceiling"]},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."},"build":{"type":["object","null"],"properties":{"id":{"type":"string","format":"uuid","description":"Build ID. `GET /v1/simc/builds/{id}` returns the full build record."},"channel":{"type":"string","enum":["nightly","weekly","latest"]},"commit":{"type":"string","description":"Git commit hash of the SimC source used for this build."},"ci":{"type":["object","null"],"properties":{"status":{"type":"string","enum":["pass","partial","fail","unknown"],"description":"Computed CI status for the build commit. See GET /v1/simc/builds for full check details."},"failed":{"type":"integer","description":"Number of CI checks with non-success conclusions (failure, cancelled, timed_out, action_required). See GET /v1/simc/builds for check names."}},"required":["status","failed"],"description":"Compact upstream CI summary (status and failure count) for this commit. The full per-check breakdown is on `GET /v1/simc/builds/{id}`. Null when CI data is unavailable."}},"required":["id","channel","commit","ci"]},"links":{"$ref":"#/components/schemas/JobLinks"},"result":{"type":"object","properties":{"summary":{"type":["object","null"],"properties":{"metric":{"type":"string","enum":["dps","raid_dps"],"description":"The metric that `mean` and `mean_error` are reported in and that profilesets are ranked by. `dps` is the main actor's own damage. `raid_dps` is the group's combined damage, returned when your input sets `profileset_metric=raid_dps`; `mainActor.mean` is then the group total."},"mainActor":{"type":["object","null"],"properties":{"name":{"type":"string","description":"Actor name as defined in your profile."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."},"profilesets":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"description":"Total number of profilesets in the sim result. When this exceeds the length of `results`, the array was truncated to the top 200 entries by DPS. The `profileset_results` artifact carries the full set."},"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Profileset name as defined in your input."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."},"stage":{"type":"integer","exclusiveMinimum":0,"description":"For multistage runs, the highest stage this profileset reached. Earlier stages run at a coarser `target_error`, so their results carry a larger `mean_error`. `1` for single-pass runs."}},"required":["name","mean","mean_error","mean_stddev","stage"]},"description":"Profileset sweep entries, ranked by DPS (highest first). Truncated to the top 200 entries — see `count` and the `profileset_results` artifact for the full set."}},"required":["count","results"],"description":"Profileset sweep results scoped to this actor (mirrors SimC's `sim.profilesets` block shape). Omitted when no profileset results are available — either the input declared no profilesets, or none were produced."}},"required":["name","mean","mean_error","mean_stddev"],"description":"Result for the headline actor (selected by SimC's `profileset_main_actor_index` directive, default `0`)."},"talents":{"type":"string","description":"The talent build the run simulated for the headline actor, as an in-game export string. Omitted when the run produced no report."},"gear":{"type":"array","items":{"type":"object","properties":{"slot":{"type":"string","description":"SimC slot name (`head`, `neck`, …, `main_hand`, `off_hand`)."},"id":{"type":"integer","exclusiveMinimum":0,"description":"The item id."},"name":{"type":"string","description":"SimC's snake_case item name."},"ilevel":{"type":"integer","exclusiveMinimum":0,"description":"The fully resolved item level the item was simulated at."},"bonusIds":{"type":"array","items":{"type":"integer"},"description":"Bonus ids applied to the item."},"gemIds":{"type":"array","items":{"type":"integer"},"description":"Item ids of socketed gems."},"enchantId":{"type":"integer","description":"The item's enchant id."},"craftedStatIds":{"type":"array","items":{"type":"integer"},"description":"A crafted item's chosen stat ids."}},"required":["slot","id","name"]},"description":"The headline actor's equipped items, in the report's slot order. Each entry carries the ids the item was simulated with. Omitted when the run produced no report."},"actors":{"type":"object","properties":{"count":{"type":"integer","minimum":0,"description":"Total number of actors in the comparison. When this exceeds the length of `results`, the array was truncated to the top 200 entries by DPS. The `actor_results` artifact carries the full set."},"results":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string","description":"Actor name as defined in your profile."},"mean":{"type":"number","description":"Mean DPS across all iterations."},"mean_error":{"type":"number","description":"The ± DPS error on `mean` — the half-width of its 95% confidence interval, equal to `mean_stddev` × 1.96."},"mean_stddev":{"type":"number","description":"Standard error of the mean DPS (the standard deviation of the mean estimate)."},"stddev":{"type":"number","description":"Standard deviation of DPS across iterations."},"min":{"type":"number","description":"Lowest single-iteration DPS."},"max":{"type":"number","description":"Highest single-iteration DPS."}},"required":["name","mean","mean_error","mean_stddev"]},"description":"Per-actor entries, ranked by DPS (highest first). Truncated to the top 200 entries — see `count` and the `actor_results` artifact for the full set."}},"required":["count","results"],"description":"Per-actor results for a `copy=` comparison, where each actor runs as its own sim. Includes the baseline actor. Omitted for profileset sweeps and single-profile runs."},"iterations":{"type":"integer","exclusiveMinimum":0,"description":"The per-actor iteration count the run used. Omitted for multistage runs, which use a per-stage schedule."},"multiStage":{"type":"object","properties":{"enabled":{"type":"boolean","description":"Whether multistage execution ran."},"reason":{"type":"string","enum":["disabled_by_option","unsupported_stage_sensitive_directive","unsupported_copy_set_only","unsupported_mixed_profileset_copy_set","no_variants_in_input","unsupported_multi_actor","no_profileset_candidates","below_min_candidates","eligible_profileset_only"],"description":"Why multistage execution did or did not run."},"stages":{"type":"array","items":{"type":"object","properties":{"stage":{"type":"integer","exclusiveMinimum":0,"description":"Stage number (1-indexed)."},"label":{"type":"string","description":"Human-readable stage name (`initial`, `intermediate`, `final`)."},"profilesets":{"type":"integer","minimum":0,"description":"Number of profilesets executed in this stage."},"culled":{"type":"integer","minimum":0,"description":"Number of profilesets eliminated at the end of this stage based on ranking. `0` for the last executed stage."},"iterations":{"type":"integer","minimum":0,"description":"Total iterations the profilesets in this stage ran, summed across them. Excludes the headline actor's own iterations."},"targetError":{"type":"number","exclusiveMinimum":0,"description":"The `target_error` this stage ran at."}},"required":["stage","label","profilesets","culled"]},"description":"Per-stage funnel for multistage execution, in execution order. Empty for single-pass runs."}},"required":["enabled","reason","stages"],"description":"Multistage execution metadata."}},"required":["metric","mainActor","multiStage"]},"artifacts":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"url":{"type":"string","format":"uri","description":"Stable public URL for downloading this artifact. Valid for the full retention window of the job."},"kind":{"type":"string","enum":["html_report","json_report","csv_report","profileset_results","actor_results","input","stdout_log","stderr_log"],"description":"Machine-readable artifact category. `html_report`: HTML report. `json_report`: JSON results. `csv_report`: flat DPS table (`result.csv`), one row per actor then one row per profileset. `profileset_results`: every profileset in the run (`profilesets.json`), ranked by the sim metric in the same row shape the result summary uses — present whenever a sweep produced results, and the way to read past the summary's top 200. `actor_results`: every actor of a `copy=`/`set=` comparison (`actors.json`), ranked the same way in the same row shape as the summary's `actors` block — present only for those runs, and the way to read past that block's top 200. `input`: the exact SimC input your job ran. `stdout_log` / `stderr_log`: SimC logs; consecutive duplicate lines in `stderr_log` are collapsed with a repeat count. For multistage runs, html and json artifacts repeat once per stage — identify them by `kind` together with `stage`."},"mimeType":{"type":"string","enum":["application/json","text/html","text/csv","text/plain"],"description":"MIME type of the artifact content, drawn from a fixed set: `application/json`, `text/html`, `text/csv`, or `text/plain`."},"stage":{"type":["integer","null"],"exclusiveMinimum":0,"description":"Stage number for multistage execution artifacts (1-indexed). Null for single-run jobs or artifacts not associated with a specific multistage stage."}},"required":["id","url","kind","mimeType","stage"]}}},"required":["summary","artifacts"]}},"required":["id","status","priority","createdAt","startedAt","completedAt","cancelRequestedAt","errorCode","statusReason","simcExitCode","retentionDays","metadata","runtime","retried","build","links","result"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"Result not ready. The job has not reached a terminal status yet.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["result_not_ready"]},"meta":{"type":"object","properties":{"status":{"type":"string","enum":["pending","queued","starting","running"]}},"required":["status"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"422":{"description":"Result unavailable. The job is terminal but no result payload was produced.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["result_unavailable"]},"meta":{"type":"object","properties":{"status":{"type":"string","enum":["completed","failed","cancelled","timed_out"]}},"required":["status"]},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/profile":{"get":{"operationId":"getJobProfile","summary":"Get a SimC job’s submitted profile","description":"Returns the SimC profile text you submitted with the job. Available at any point in the job’s lifecycle, including while the job is queued or running.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"The SimC profile text you submitted with the job.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"text":{"type":["string","null"],"description":"The exact SimC profile text you submitted with this job. `null` if no profile text is stored for the job."}},"required":["text"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/status":{"get":{"operationId":"getJobStatus","summary":"Poll a SimC job status","description":"Returns the current status, queue position, and progress for a SimC job. Designed for polling while a sim runs. Use `include` to add optional fields like `logEntries`.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"},{"schema":{"type":"string","description":"Comma-separated list of optional fields to include. Supported: `logEntries` (structured log entries from stdout and stderr for running jobs)."},"required":false,"description":"Comma-separated list of optional fields to include. Supported: `logEntries` (structured log entries from stdout and stderr for running jobs).","name":"include","in":"query"}],"responses":{"200":{"description":"Current status, queue position, and progress for the job.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"],"description":"Current job status. Terminal values: completed, failed, cancelled, timed_out."},"errorCode":{"type":["string","null"],"enum":["execution_interrupted","execution_timeout","max_credits_reached","credits_exhausted","execution_failed","build_unavailable","simulation_error","queue_timeout","input_invalid","insufficient_credits","user_cancelled","internal",null],"description":"Machine-readable error code for the terminal state. Null when the job is not terminal or completed successfully."},"statusReason":{"type":["string","null"],"description":"Human-readable explanation paired with `errorCode`. Null when the job is not terminal or no additional detail is available."},"simcExitCode":{"type":["string","null"],"description":"SimC process exit code. Null when the job is not terminal."},"queue":{"type":["object","null"],"properties":{"queuedAt":{"type":"string","format":"date-time","description":"When this job entered the queue. For a retried job, this reflects the current attempt, not the original submission."},"estimatedStartSeconds":{"type":["number","null"],"description":"Estimated seconds until this job begins running. Updated on each poll; not a guarantee. Null when no estimate is available."},"estimatedStartUpdatedAt":{"type":["string","null"],"format":"date-time","description":"When the underlying wait-time estimate was last refreshed. Null when no estimate is available."}},"required":["queuedAt","estimatedStartSeconds","estimatedStartUpdatedAt"]},"progress":{"type":"object","properties":{"percent":{"type":["number","null"],"minimum":0,"maximum":100,"description":"Estimated completion percentage (0–100). Null when not yet running."},"stage":{"type":["object","null"],"properties":{"current":{"type":"integer","exclusiveMinimum":0,"description":"Current stage (1-indexed)."},"total":{"type":"integer","exclusiveMinimum":0,"description":"Total number of stages in this run."},"label":{"type":"string","description":"Human-readable name of the current stage (for example \"initial\", \"intermediate\", \"final\")."},"percent":{"type":"number","minimum":0,"maximum":100,"description":"Estimated completion percentage (0–100) within the current stage."}},"required":["current","total","label","percent"],"description":"Stage progress detail while the job is running. Null before the job starts and once it reaches a terminal state. Single-pass jobs report `{ current: 1, total: 1, label: \"initial\" }`."}},"required":["percent","stage"]},"logEntries":{"type":["array","null"],"items":{"type":"object","properties":{"source":{"type":"string","enum":["stdout","stderr"],"description":"Which stream the line came from. `stderr` carries SimC warnings, errors, and notes; `stdout` carries sim output, progress markers, and results."},"message":{"type":"string","description":"The log line text."},"ts":{"type":"number","description":"Epoch milliseconds (UTC) when this line was captured."}},"required":["source","message","ts"]},"description":"Recent log lines from SimC stdout and stderr while the job is running. Full logs are available as artifacts once the job completes. Null when not running or not requested via `include=logEntries`."},"startedAt":{"type":["string","null"],"format":"date-time","description":"When this job began executing. Null when the job has not yet started."},"updatedAt":{"type":["string","null"],"format":"date-time"},"retried":{"type":"boolean","description":"True if this job was retried automatically because of a platform error. The response reflects the latest retry attempt."}},"required":["status","errorCode","statusReason","simcExitCode","queue","progress","logEntries","startedAt","updatedAt","retried"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/artifacts/{id}/url":{"get":{"operationId":"getArtifactUrl","summary":"Get a SimC artifact URL","description":"Returns a stable public URL for a SimC job artifact (HTML report, JSON report, raw log, etc.), valid for the artifact's full retention window. Use this when you need to control the final fetch URL yourself.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"A stable public URL for downloading the artifact. Valid for the artifact's full retention window.","content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string","format":"uri"}},"required":["url"]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Artifact not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"410":{"description":"The artifact has expired and is no longer available.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/jobs/{id}/cancel":{"post":{"operationId":"cancelJob","summary":"Cancel a SimC job","description":"Cancels one of your SimC jobs. Jobs that have not started running end immediately. Jobs already in flight are signaled to stop; poll `GET /v1/simc/jobs/{id}/status` to observe the transition to `cancelled`. Repeat calls return the same response.","tags":["SimC"],"parameters":[{"schema":{"type":"string"},"required":true,"name":"id","in":"path"}],"responses":{"200":{"description":"Cancel accepted. `status` is `cancelled` when the job ended before running, or `cancel_requested` when the job was already running and has been signaled to stop.","content":{"application/json":{"schema":{"oneOf":[{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"id":{"type":"string"},"status":{"type":"string","enum":["cancelled"],"description":"The job ended before it started running and is fully cancelled."}},"required":["success","id","status"]},{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"id":{"type":"string"},"status":{"type":"string","enum":["cancel_requested"],"description":"The job was already running and has been signaled to stop. Poll `GET /v1/simc/jobs/{id}` to observe the transition to `cancelled`."},"cancelRequestedAt":{"type":"string","format":"date-time","description":"When the cancel was requested."}},"required":["success","id","status","cancelRequestedAt"]}]}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string"},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}},"409":{"description":"Job has already reached a terminal status.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["job_not_cancellable"]},"meta":{"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["pending","queued","starting","running","completed","failed","cancelled","timed_out"]}},"required":["id","status"]}},"required":["error","code","meta"]}}}}}}},"/v1/simc/usage":{"get":{"operationId":"getUsage","summary":"Get your usage summary","description":"Returns your usage for the current period along with a live snapshot of queued and in-flight jobs. For your credit balance, see `GET /v1/simc/credits`.","tags":["Usage"],"responses":{"200":{"description":"Your usage summary.","headers":{"X-Active-Jobs":{"schema":{"type":"string","description":"Your in-flight job count at the time of this response."},"required":true,"description":"Your in-flight job count at the time of this response."},"X-Max-Active-Jobs":{"schema":{"type":"string","description":"Your account ceiling for in-flight jobs."},"required":true,"description":"Your account ceiling for in-flight jobs."},"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"period":{"type":"object","properties":{"start":{"type":["string","null"],"format":"date-time","description":"UTC start of the usage period."},"end":{"type":["string","null"],"format":"date-time","description":"UTC end of the usage period."},"simsRun":{"type":"integer","description":"Completed sims in the current period."},"avgRuntimeSeconds":{"type":["number","null"],"description":"Average runtime in seconds for completed sims in the current period."},"readsUsed":{"type":["number","null"],"description":"API read requests consumed in the current period."},"readsLimit":{"type":["number","null"],"description":"Maximum read requests allowed in the current period. Null means no cap."},"readsCapResetAt":{"type":["string","null"],"format":"date-time","description":"When the current reads cap resets."}},"required":["start","end","simsRun","avgRuntimeSeconds","readsUsed","readsLimit","readsCapResetAt"]},"snapshot":{"type":"object","properties":{"activeJobs":{"type":["integer","null"],"description":"Number of jobs currently in flight. The ceiling is `plan.maxActiveJobs`."},"queuedJobs":{"type":["integer","null"],"description":"Number of jobs currently queued."},"runningJobs":{"type":["integer","null"],"description":"Number of jobs currently running or starting."}},"required":["activeJobs","queuedJobs","runningJobs"]},"plan":{"type":"object","properties":{"maxActiveJobs":{"type":["integer","null"],"description":"Maximum jobs your account can have in flight."},"maxCreditsPerJob":{"type":["integer","null"],"description":"Per-job credit ceiling: the largest spend cap (`runtime.maxCredits`) a submission may request, and the most a submission without one can spend."},"defaultCreditsPerJob":{"type":["integer","null"],"description":"The same per-job ceiling as `maxCreditsPerJob`, kept for compatibility."},"maxRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCreditsPerJob`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"defaultRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: `defaultCreditsPerJob` expressed in seconds at the basis rate of 32 credits per second."},"maxQueueSeconds":{"type":["integer","null"],"description":"Maximum time in seconds a job may wait in the queue before being cancelled."},"defaultQueueSeconds":{"type":["integer","null"],"description":"Default queue wait per job in seconds."},"creditsPerSecond":{"type":"integer","minimum":1,"description":"Metering rate for your jobs, in credits per second of SimC runtime. Usage accrues at this rate while a sim runs, so a spend cap of `runtime.maxCredits` buys about `maxCredits / creditsPerSecond` seconds. The rate applied to a finished run is reported on the job as `runtime.creditsPerSecond`."},"vcpuPerJob":{"type":"integer","minimum":1,"description":"vCPUs allocated to each job. Determines how fast a sim completes; billing uses `creditsPerSecond`."},"maxSimcVariants":{"type":["integer","null"],"description":"Maximum simc variants (profilesets, copies, sets) allowed per job. Null means no cap."},"pool":{"type":"string","enum":["standard","warm","dedicated"],"description":"Compute pool your jobs run on. `standard` runs on on-demand capacity, so a job may wait for a machine to boot. `warm` keeps an always-on floor of capacity. `dedicated` is capacity reserved for your account on a custom plan."},"priorityFeeCredits":{"type":"object","properties":{"high":{"type":"integer","minimum":0}},"description":"Per-job priority fee in credits, by priority. Added to the base compute cost for jobs submitted at `high` only when it would buy a faster start."}},"required":["maxActiveJobs","maxCreditsPerJob","defaultCreditsPerJob","maxRuntimeSeconds","defaultRuntimeSeconds","maxQueueSeconds","defaultQueueSeconds","creditsPerSecond","vcpuPerJob","maxSimcVariants","pool","priorityFeeCredits"],"description":"The terms your account runs under: metering rate, runtime and queue ceilings, concurrency and variant caps, compute pool, and priority fees."},"limits":{"type":"object","properties":{"maxActiveJobs":{"type":["integer","null"],"description":"Maximum jobs your account can have in flight."},"maxCreditsPerJob":{"type":["integer","null"],"description":"Per-job credit ceiling: the largest spend cap (`runtime.maxCredits`) a submission may request, and the most a submission without one can spend."},"defaultCreditsPerJob":{"type":["integer","null"],"description":"The same per-job ceiling as `maxCreditsPerJob`, kept for compatibility."},"maxRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: use `maxCreditsPerJob`. The same ceiling expressed in seconds at the basis rate of 32 credits per second."},"defaultRuntimeSeconds":{"type":["integer","null"],"deprecated":true,"description":"Deprecated: `defaultCreditsPerJob` expressed in seconds at the basis rate of 32 credits per second."},"maxQueueSeconds":{"type":["integer","null"],"description":"Maximum time in seconds a job may wait in the queue before being cancelled."},"defaultQueueSeconds":{"type":["integer","null"],"description":"Default queue wait per job in seconds."},"creditsPerSecond":{"type":"integer","minimum":1,"description":"Metering rate for your jobs, in credits per second of SimC runtime. Usage accrues at this rate while a sim runs, so a spend cap of `runtime.maxCredits` buys about `maxCredits / creditsPerSecond` seconds. The rate applied to a finished run is reported on the job as `runtime.creditsPerSecond`."},"vcpuPerJob":{"type":"integer","minimum":1,"description":"vCPUs allocated to each job. Determines how fast a sim completes; billing uses `creditsPerSecond`."},"maxSimcVariants":{"type":["integer","null"],"description":"Maximum simc variants (profilesets, copies, sets) allowed per job. Null means no cap."},"pool":{"type":"string","enum":["standard","warm","dedicated"],"description":"Compute pool your jobs run on. `standard` runs on on-demand capacity, so a job may wait for a machine to boot. `warm` keeps an always-on floor of capacity. `dedicated` is capacity reserved for your account on a custom plan."},"priorityFeeCredits":{"type":"object","properties":{"high":{"type":"integer","minimum":0}},"description":"Per-job priority fee in credits, by priority. Added to the base compute cost for jobs submitted at `high` only when it would buy a faster start."}},"required":["maxActiveJobs","maxCreditsPerJob","defaultCreditsPerJob","maxRuntimeSeconds","defaultRuntimeSeconds","maxQueueSeconds","defaultQueueSeconds","creditsPerSecond","vcpuPerJob","maxSimcVariants","pool","priorityFeeCredits"],"deprecated":true,"description":"Deprecated alias of `plan` with identical contents."}},"required":["period","snapshot","plan","limits"],"description":"Your usage: period metrics, live snapshot counters, and your plan terms. For your credit balance, see `GET /v1/simc/credits`."}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}},"/v1/simc/credits":{"get":{"operationId":"getCredits","summary":"Get your credit balance and active grants","description":"Returns your credit balance, split between purchased credits and any active grants.\n\nConsumption order: grants are spent before purchased credits, with the earliest-expiring grant spent first. Grants without an expiry are spent last.\n\nFor transaction history and lifetime totals, see the dashboard.","tags":["Credits"],"responses":{"200":{"description":"Your credit balance and active grants.","headers":{"X-Request-Id":{"schema":{"type":"string","description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."},"required":true,"description":"Correlation id for this request, present on every response. The same value is echoed in the `requestId` field of error bodies."}},"content":{"application/json":{"schema":{"type":"object","properties":{"purchased":{"type":"integer","description":"Total purchased credit balance. Purchased credits do not expire."},"reserved":{"type":"integer","minimum":0,"description":"Credits currently held against your in-flight jobs, excluded from `purchased` and `grants[].remaining`. Any unused amount returns to them on settlement."},"grants":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":18,"maxLength":18},"reason":{"type":"string","enum":["grant_sandbox_allowance","grant_developer_allowance","grant_beta","grant_promo","grant_onboarding","grant_sandbox_restricted_onboarding","grant_personal_allowance","grant_personal_plus_allowance","onboarding","allowance","promo"],"description":"The reason this grant was issued."},"remaining":{"type":"integer","description":"Credits currently available in this grant. Excludes any credits already committed to in-flight jobs."},"original":{"type":"integer","minimum":0,"description":"Credits originally issued in this grant."},"expiresAt":{"type":["string","null"],"format":"date-time","description":"When this grant expires. `null` means the grant has no expiry. After expiry, any remaining credits in the grant are forfeited and the grant no longer appears in this response."}},"required":["id","reason","remaining","original","expiresAt"],"description":"A single active grant. Each grant is a separate pool of credits with its own balance and optional expiry."},"description":"Your active grants, ordered by expiry (soonest first; grants without expiry last). Empty when no grants are active."}},"required":["purchased","reserved","grants"],"description":"Your credit balance. Total available credits equal `purchased + sum(grants[].remaining)`."}}}},"401":{"description":"Your API token is missing, invalid, or not authorized for this request. See `code` for the specific reason.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"type":"string"},"code":{"type":"string","enum":["missing_token","invalid_token","revoked_token","expired_token"]},"meta":{"type":["object","null"],"additionalProperties":{"anyOf":[{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]},{"type":"array","items":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"}]}},{"type":"array","items":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"number"},{"type":"boolean"},{"type":"null"}]}}},{"type":"null"}]}},"requestId":{"type":"string","description":"Correlation id for this request, also returned in the `X-Request-Id` response header.","example":"req_4f9a2c1e8b7d4f0a9c3e5d6b7a8f1e2d"}},"required":["error","code","meta"]}}}}}}}},"webhooks":{"job.terminal":{"post":{"description":"Sent when a subscribed job reaches a terminal state (completed, failed, cancelled, or timed_out). Configure your endpoint URL and signing secret in the dashboard, then subscribe individual jobs by including webhook.events in the POST /simc/jobs request body. Every delivery is signed — verify X-Simmit-Signature before trusting the payload.","parameters":[{"schema":{"type":"string","description":"HMAC-SHA256 signature for verifying authenticity. Format: `t=,v1=`. The signed message is `{t}.{rawBody}` (the timestamp, a literal dot, and the raw JSON body), keyed by your webhook signing secret. Reject deliveries whose `t` is more than 300 seconds old to mitigate replay.","example":"t=1711360000,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8f9"},"required":true,"description":"HMAC-SHA256 signature for verifying authenticity. Format: `t=,v1=`. The signed message is `{t}.{rawBody}` (the timestamp, a literal dot, and the raw JSON body), keyed by your webhook signing secret. Reject deliveries whose `t` is more than 300 seconds old to mitigate replay.","name":"X-Simmit-Signature","in":"header"},{"schema":{"type":"string","description":"Unique ID for the event. Stable across retries — use it to deduplicate deliveries.","example":"519253542012420096"},"required":true,"description":"Unique ID for the event. Stable across retries — use it to deduplicate deliveries.","name":"X-Simmit-Event-Id","in":"header"},{"schema":{"type":"string","description":"Unique ID for this specific delivery attempt. Changes on each retry.","example":"519253542012420097"},"required":true,"description":"Unique ID for this specific delivery attempt. Changes on each retry.","name":"X-Simmit-Delivery-Id","in":"header"}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEvent"}}}},"responses":{"200":{"description":"Return any 2xx status to acknowledge receipt. Non-2xx responses trigger retries."}}}}},"servers":[{"url":"https://api.simmit.com"}]} \ No newline at end of file diff --git a/src/generated/openapi.d.ts b/src/generated/openapi.d.ts index b957bcc..12c275a 100644 --- a/src/generated/openapi.d.ts +++ b/src/generated/openapi.d.ts @@ -1566,6 +1566,10 @@ export interface operations { profilesets: number; /** @description Number of profilesets eliminated at the end of this stage based on ranking. `0` for the last executed stage. */ culled: number; + /** @description Total iterations the profilesets in this stage ran, summed across them. Excludes the headline actor's own iterations. */ + iterations?: number; + /** @description The `target_error` this stage ran at. */ + targetError?: number; }[]; }; } | null;