---
title: "Cancel a job (no refund)"
method: DELETE
path: "/v1/jobs/{id}"
tags: ["Jobs"]
---

# Cancel a job (no refund)

`DELETE /v1/jobs/{id}`

## Request

- Base URL: `https://electronics-architect.com`
- URL: `https://electronics-architect.com/v1/jobs/{id}`
- Auth: HTTP bearer

Scope: `solve`. An active job becomes `cancelled` and its saved progress is dropped; a finished one is returned unchanged. The run charged at creation is not refunded. `meta.cancelled` says whether anything changed.

## Path parameters

- `id` string, required

## Response `200`

The job after the cancel.

- JobResponse
  - `job` Job: A Monte Carlo job: status and progress.
    - `id` string: `job_` + 20 characters.
    - `kind` 'monte_carlo'
    - `status` 'queued' | 'running' | 'done' | 'failed' | 'cancelled' | 'expired'
    - `trials` object
      - `total` integer
      - `done` integer
    - `progress` number
    - `sliceInProgress` boolean: Another request is running a slice right now; poll again.
    - `seed` integer
    - `error` string: Only when `failed`.
    - `createdAt` string, date-time
    - `updatedAt` string, date-time
    - `expiresAt` string, date-time
  - `result` JobResult: The synchronous Monte Carlo result without its per-trial array: summary, seed, trialCount, failedTrials, unconvergedTrials, protectionTrips, operatingTrials, plus `nodeStats` — per node, `trials` and min / mean / max / stddev of voltage, current, power and temperature (over every solved trial, as the MCP digest folds them) with `thermalViolations` — and `attribution`.
    - `summary` object
    - `nodeStats` object
    - `seed` integer
    - `trialCount` integer
    - `failedTrials` integer
    - `protectionTrips` integer
    - `operatingTrials` integer
    - `elapsedMs` number: CPU time summed over every slice.
    - `attribution` object
  - `meta` object
    - `schemaVersion` integer
    - `trials` integer
    - `requestedTrials` integer
    - `clamped` boolean
    - `clampedBy` string, nullable
    - `seed` integer
    - `advanced` boolean: On a poll: whether this request ran a slice.
    - `trialsThisSlice` integer: How many trials the slice inside THIS request ran (0 when none ran). Divide the trials left by it for the polls remaining — measured on this job, not estimated from its size.
    - `cancelled` boolean
    - `refunded` boolean
    - `elapsedMs` number
    - `metered` boolean
    - `feature` string
    - `attribution` object

## Other responses

- `400`: INVALID_REQUEST — a malformed id.
- `401`: No key, a browser token instead of a key, an unknown key, or a revoked key (code KEY_REVOKED).
- `403`: The key lacks a required scope (INSUFFICIENT_SCOPE), or the call needs a plan the account does not have (PLAN_REQUIRED): on the Free plan, compare, exports, Monte Carlo jobs, AI synthesis, a design with more than one sheet, or a save, share or key past the Free limits; or a team key whose team is no longer paid for.
- `404`: NOT_FOUND.
- `429`: RATE_LIMITED: the key's per-minute allowance is used up (or, before any key is recognised, too many requests from one address presented an unknown or revoked key). On the routes that solve inside the request (solve, verify, derating, compare, exports, ai/review, ai/synthesize) it can also be SOLVE_IN_PROGRESS: this account already has 3 calls of that kind running on the server that took the request (solves, AI reviews and syntheses are each counted separately). `Retry-After` is set either way; for SOLVE_IN_PROGRESS it is 2 s for solves and 30 s for AI reviews and syntheses.

---

[API](https://skmtc.dev/electronics-architect/apis/electronics-architect-api.md) · [All operations](https://skmtc.dev/electronics-architect/apis/electronics-architect-api/llms.txt) · [OpenAPI document](https://skmtc.dev/electronics-architect/apis/electronics-architect-api/revisions/98066184ba67?raw)
