Overview
Cancel a job that is currently queued or processing. Once cancelled, the job cannot be resumed and will not consume further resources.
Path Parameters
The unique identifier of the job to cancel (UUID format)Example: 550e8400-e29b-41d4-a716-446655440000
Response
Whether the cancellation was successful
The cancelled job’s identifier
New job status (always cancelled)
Example Request
curl -X DELETE https://spideriq.di-atomic.com/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer <your_token>"
Example Response
{
"success": true,
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "cancelled",
"message": "Job cancelled successfully"
}
Cancellation Rules
Cannot cancel completed jobs: Only jobs in queued or processing status can be cancelled.
| Job Status | Can Cancel? | Result |
|---|
queued | ✅ Yes | Job removed from queue |
processing | ✅ Yes | Worker stops processing, partial results discarded |
completed | ❌ No | Returns 400 error |
failed | ❌ No | Already in terminal state |
cancelled | ❌ No | Already cancelled |
Use Cases
Cancel Individual Job
import requests
def cancel_job(job_id, auth_token):
"""Cancel a specific job"""
url = f"https://spideriq.di-atomic.com/api/v1/jobs/{job_id}"
headers = {"Authorization": f"Bearer {auth_token}"}
response = requests.delete(url, headers=headers)
if response.status_code == 200:
print(f"Job {job_id} cancelled successfully")
elif response.status_code == 400:
print(f"Cannot cancel: {response.json()['detail']}")
elif response.status_code == 404:
print("Job not found")
return response.json()
Cancel Multiple Jobs
import requests
def cancel_multiple_jobs(job_ids, auth_token):
"""Cancel multiple jobs"""
results = []
for job_id in job_ids:
url = f"https://spideriq.di-atomic.com/api/v1/jobs/{job_id}"
headers = {"Authorization": f"Bearer {auth_token}"}
try:
response = requests.delete(url, headers=headers)
results.append({
"job_id": job_id,
"success": response.status_code == 200,
"status": response.json().get("status"),
"error": response.json().get("detail")
})
except Exception as e:
results.append({
"job_id": job_id,
"success": False,
"error": str(e)
})
return results
# Usage
job_ids = [
"550e8400-e29b-41d4-a716-446655440000",
"660e8400-e29b-41d4-a716-446655440001",
"770e8400-e29b-41d4-a716-446655440002"
]
results = cancel_multiple_jobs(job_ids, "<your_token>")
for result in results:
print(f"Job {result['job_id']}: {'✓' if result['success'] else '✗'}")
Cancel All Queued Jobs
import requests
def cancel_all_queued_jobs(auth_token):
"""Cancel all jobs in queued status"""
# First, get all queued jobs
list_url = "https://spideriq.di-atomic.com/api/v1/jobs/list"
headers = {"Authorization": f"Bearer {auth_token}"}
params = {"status_filter": "queued", "page_size": 100}
response = requests.get(list_url, headers=headers, params=params)
data = response.json()
queued_jobs = data.get("jobs", [])
cancelled_count = 0
# Cancel each queued job
for job in queued_jobs:
job_id = job["job_id"]
delete_url = f"https://spideriq.di-atomic.com/api/v1/jobs/{job_id}"
delete_response = requests.delete(delete_url, headers=headers)
if delete_response.status_code == 200:
cancelled_count += 1
print(f"Cancelled job {job_id}")
print(f"Total cancelled: {cancelled_count} jobs")
return cancelled_count
Cancellation Timing
Queued jobs: Cancelled immediately and removed from the queue.
Processing jobs: Worker receives cancellation signal and stops within 1-3 seconds. Partial results are discarded.
After Cancellation
Once cancelled:
- Job status becomes
cancelled
- Job remains in your job list (visible in
/jobs/list)
- Results endpoint returns
410 Gone
- Job cannot be resumed or restarted (must submit a new job)
Error Handling
import requests
def safe_cancel_job(job_id, auth_token):
"""Cancel job with comprehensive error handling"""
url = f"https://spideriq.di-atomic.com/api/v1/jobs/{job_id}"
headers = {"Authorization": f"Bearer {auth_token}"}
try:
response = requests.delete(url, headers=headers)
if response.status_code == 200:
return {"success": True, "message": "Job cancelled"}
elif response.status_code == 400:
error = response.json()["detail"]
return {"success": False, "reason": "cannot_cancel", "error": error}
elif response.status_code == 404:
return {"success": False, "reason": "not_found"}
elif response.status_code == 401:
return {"success": False, "reason": "unauthorized"}
else:
return {"success": False, "reason": "unknown", "status": response.status_code}
except requests.exceptions.RequestException as e:
return {"success": False, "reason": "network_error", "error": str(e)}
# Usage
result = safe_cancel_job("550e8400-e29b-41d4-a716-446655440000", "<your_token>")
if result["success"]:
print("Job cancelled successfully")
else:
print(f"Failed to cancel: {result['reason']}")
Best Practices
Check status first: Before cancelling, verify the job is in a cancellable state using the /status endpoint to avoid unnecessary errors.
No refunds: Cancelled jobs may still count toward usage metrics depending on when they were cancelled.