Skip to content
Get started
Get started
JobOptions Reference
guide · queue

Every option, with its default.

The complete per-job option surface, what each field changes, and what you get when you leave it out.

Pass options with each add. The field names follow the host language while the broker receives the same values:

await queue.add('report', data, {
priority: 10,
delay: 5000,
attempts: 5,
jobId: 'report-42',
durable: true,
});

Python uses snake_case keyword arguments and Rust uses snake_case struct fields. Go uses a JobOptions map; PHP and Elixir use the camelCase protocol names shown in the table.

OptionTypeDefaultDescription
prioritynumber0Higher = processed first
delaynumber0Delay in ms before processing
attemptsnumber3Max retry attempts
backoffnumber | { type, delay }1000Backoff base in ms, or { type: 'fixed' | 'exponential', delay }
timeoutnumber-Processing timeout in ms
jobIdstring-Custom ID for idempotent adds
deduplicationobject-TTL-based dedup (id, ttl, extend, replace)
removeOnCompletebooleanfalseAuto-delete after completion
removeOnFailbooleanfalseAuto-delete after failure
stallTimeoutnumber-Per-job stall timeout override
repeatobject-Repeating job config (every, pattern, limit)
durablebooleanfalseWrite to disk before returning
lifobooleanfalseProcess newest first
parent{ id, queue }-Parent job reference for flows

At the same priority, LIFO jobs run newest-first ahead of FIFO jobs. Priority always remains authoritative, so a lower-priority LIFO job cannot overtake a higher-priority FIFO job.

Processing timeout values are measured from the active transition and use an absolute next-deadline timer. Concurrent jobs retain their individual deadlines. The broker’s timeout transition is authoritative: a processor outcome that arrives afterward is ignored for that exact lease generation, without emitting a contradictory local Worker event. A later retry uses a new lease and is not suppressed.

parent creates a real dependency edge to an existing pending job. The parent moves to waiting-children, runs only after every linked child finishes, and exposes child results through getChildrenValues(). This works across queues and is committed atomically in both embedded and TCP modes, including addBulk(). A missing, active, completed, or failed parent rejects the child; the rejected child is not left in memory or SQLite. Use FlowProducer when the parent and children must all be created as one new graph.

Queue APICreate a queue in embedded or TCP mode
Adding Jobsadd, addBulk, priorities, delays, durability
Deduplication and Idempotent Job AddsIdempotent adds, dedup keys, custom job ids
Querying JobsFetch jobs, states, counts and results
Queue Control and MaintenancePause, drain, obliterate, clean and repair
Progress, Job Logs and DependenciesProgress, per-job logs and dependencies
Queue Rate Limiting and Global ConcurrencyRate limits and global concurrency caps
Job Schedulers from the QueueNamed repeatable schedules from the queue
DLQ Operations from the Queue ObjectFailed-job operations from the Queue object
Workers, Stats and Metrics from the QueueRegistered workers, stats and metrics windows
Namespaces, Auto-Batching and Store-and-ForwardNamespaces, auto-batching, store-and-forward