DELETE
/
api
/
v1
/
jobs
/
{job_id}
Cancel Job
curl --request DELETE \
  --url https://spideriq.di-atomic.com/api/v1/jobs/{job_id} \
  --header 'Authorization: Bearer <token>'
{
  "success": true,
  "job_id": "<string>",
  "status": "<string>",
  "message": "<string>"
}

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_id
string
required
The unique identifier of the job to cancel (UUID format)Example: 550e8400-e29b-41d4-a716-446655440000

Response

success
boolean
Whether the cancellation was successful
job_id
string
The cancelled job’s identifier
status
string
New job status (always cancelled)
message
string
Confirmation message

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 StatusCan Cancel?Result
queued✅ YesJob removed from queue
processing✅ YesWorker stops processing, partial results discarded
completed❌ NoReturns 400 error
failed❌ NoAlready in terminal state
cancelled❌ NoAlready 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.