Cancel jobs while they run
Cancellation now works on running jobs across the API, MCP, and dashboard. The runner stops, and you pay only for the compute the job actually used.
POST /jobs/:id/cancel previously accepted only jobs that had not started executing. It now also stops jobs in running: the runner is told to stop, the job settles for the compute it actually consumed, and the job.cancelled webhook plus any per-job callback fire as usual. A job cancelled before it ever ran still costs nothing.
The dashboard cancel button and the MCP cancel_job tool pick this up automatically. No integration changes needed.
const job = await client.jobs.cancel("job_...");The call returns the job in its new state, so there is no second fetch to confirm it stopped.
Which states accept a cancel is documented in job lifecycle. You pay only for compute used, explained in credits and billing.
