Cancel Job
/api/v1/jobs/{job_id}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
job_idstringrequiredThe unique identifier of the job to cancel (UUID format)
Example: 550e8400-e29b-41d4-a716-446655440000
Response
successbooleanWhether the cancellation was successful
job_idstringThe cancelled job's identifier
statusstringNew job status (always cancelled)
messagestringConfirmation message
Example Request
- cURL
- Python
- JavaScript
- PHP
curl -X DELETE https://spideriq.ai/api/v1/jobs/550e8400-e29b-41d4-a716-446655440000 \
-H "Authorization: Bearer <your_token>"
import requests
job_id = "550e8400-e29b-41d4-a716-446655440000"
url = f"https://spideriq.ai/api/v1/jobs/{job_id}"
headers = {
"Authorization": "Bearer <your_token>"
}
response = requests.delete(url, headers=headers)
print(response.json())
const jobId = '550e8400-e29b-41d4-a716-446655440000';
const response = await fetch(
`https://spideriq.ai/api/v1/jobs/${jobId}`,
{
method: 'DELETE',
headers: {
'Authorization': 'Bearer <your_token>'
}
}
);
const data = await response.json();
console.log(data);
<?php
$job_id = "550e8400-e29b-41d4-a716-446655440000";
$url = "https://spideriq.ai/api/v1/jobs/{$job_id}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer <your_token>'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
Example Response
- 200 OK - Cancelled
- 400 Bad Request - Already Completed
- 404 Not Found
{
"success": true,
"job_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "cancelled",
"message": "Job cancelled successfully"
}
{
"detail": "Cannot cancel job with status 'completed'. Only queued or processing jobs can be cancelled."
}
{
"detail": "Job not found"
}
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.ai/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.ai/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.ai/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.ai/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.ai/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.