After you run a job, this is how you find out what actually happened -- Worker executes runs asynchronously, so starting one only tells you it was queued, not how it went.

Having trouble reaching the API, or logging in from another machine? See Network Access & Authentication Security -- by default the Api only answers localhost, and PowerShell needs an extra flag once it does answer elsewhere.

Order of Operations

  1. Authenticate to the API.
  2. Check the run's status, using the jobId and runCorrelationId Run a Job handed back.

The call

GET /api/jobs/{jobId}/manual-run-request/{runCorrelationId}

{jobId} is the same job id you started the run against. {runCorrelationId} is the value Run a Job handed back when you queued it.

Permission needed: Job.View on this job.

C# example

var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web);

// Step 1: Authenticate to the API.
using var handler = new HttpClientHandler { UseDefaultCredentials = true };
using var client = new HttpClient(handler) { BaseAddress = new Uri("http://your-minion-agent-server:5443") };
client.DefaultRequestHeaders.Add("X-App-Name", "MyIntegration");

// Step 2: Check the run's status.
var jobId = 42; // from Get a Job by Name / List Jobs
var runCorrelationId = Guid.Parse("3fa85f64-5717-4562-b3fc-2c963f66afa6"); // from Run a Job's response

var response = await client.GetAsync($"/api/jobs/{jobId}/manual-run-request/{runCorrelationId}");

if (response.StatusCode == System.Net.HttpStatusCode.NotFound)
{
    Console.WriteLine("Still queued or running -- nothing to report yet.");
}
else
{
    response.EnsureSuccessStatusCode();
    var status = await response.Content.ReadFromJsonAsync<RunStatus>(jsonOptions);
    Console.WriteLine($"{status!.RunStatusName} (ended: {status.EndedAt?.ToString() ?? "not yet"})");
}

record RunStatus(long ManualJobRunId, byte RunStatusCode, string RunStatusName, DateTime StartedAt, DateTime? EndedAt);

Not on a domain machine? Swap in the app-account login from Calling the API From Your Own Code, same as Run a Job.

PowerShell example

# Step 1: Authenticate to the API.
$headers = @{ "X-App-Name" = "MyIntegration" }

# Step 2: Check the run's status. (-AllowUnencryptedAuthentication: PowerShell requires this for Windows auth over plain http to anything but localhost -- see "Network Access & Authentication Security".)
$jobId = 42  # from Get a Job by Name / List Jobs
$runCorrelationId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"  # from Run a Job's response

try {
    $status = Invoke-RestMethod -Uri "http://your-minion-agent-server:5443/api/jobs/$jobId/manual-run-request/$runCorrelationId" `
        -UseDefaultCredentials -AllowUnencryptedAuthentication -Headers $headers
    "$($status.runStatusName) (ended: $($status.endedAt ?? 'not yet'))"
}
catch [Microsoft.PowerShell.Commands.HttpResponseException] {
    if ($_.Exception.Response.StatusCode -eq 404) {
        "Still queued or running -- nothing to report yet."
    } else {
        throw
    }
}

What you get back

200 OK once a result exists:

{
    "manualJobRunId": 8817,
    "runStatusCode": 2,
    "runStatusName": "Succeeded",
    "startedAt": "2026-09-17T01:42:03Z",
    "endedAt": "2026-09-17T01:42:19Z"
}

endedAt is null while the run is still in progress. A 404 (see below) is what you get before the run has started or produced any row at all -- that's the normal state right after queueing, not an error.

Codes this call can return

See API Response Codes for what each one means in general. For this specific call:

  • 200 -- a status exists; check endedAt to see if it's actually finished.
  • 403 -- you don't have Job.View on this job.
  • 404 -- no result yet for this runCorrelationId (still queued or running), or the id is wrong.

See also: Run a Job.