---
title: One-Off and Delayed Jobs
description: Enqueue immediate and scheduled runs using the DurableStack client API.
order: 64
available_in: [dotnet, nodejs]
---

Use the client/runtime API for ad-hoc and scheduled-once execution.

## Enqueue immediately

:::code-group
```csharp
var runId = await durableClient.EnqueueAsync<SendWelcomeEmailJob>(
    new SendWelcomeEmailArgs { Email = "hello@example.com" },
    cancellationToken);
```

```typescript
const runId = await runtime.enqueue("send-welcome-email", {
  email: "hello@example.com"
});
```
:::

## Schedule for later

:::code-group
```csharp
var runAtUtc = DateTimeOffset.UtcNow.AddMinutes(30);

var runId = await durableClient.ScheduleAsync<SendWelcomeEmailJob>(
    new SendWelcomeEmailArgs { Email = "later@example.com" },
    runAtUtc,
    cancellationToken);
```

```typescript
const runAtUtc = new Date(Date.now() + 30 * 60 * 1000).toISOString();

const runId = await runtime.schedule("send-welcome-email", {
  email: "later@example.com"
}, runAtUtc);
```
:::

## Cancel a run

:::code-group
```csharp
var cancelled = await durableClient.CancelRunAsync(runId, cancellationToken);
```

```typescript
const cancelled = await runtime.cancelRun(runId);
```
:::

## Query scheduled and recent runs

:::code-group
```csharp
var recent = await runQueryService.GetRecentRunsAsync(50, cancellationToken);

var pending = await runQueryService.GetRunsByStatusAsync("pending", 50, cancellationToken);
```

```typescript
const recent = await runtime.getRecentRuns(50);

const pending = await runtime.getRunsByStatus("pending", 50);
```
:::

## Practical guidance

- Use delayed jobs for time-based follow-up work that is not recurring.
- Keep payload DTOs version-safe and backward-compatible where possible.
- Use run query APIs to verify enqueue/schedule behavior in integration tests.
