MethodPathSummaryAuth
GET/v1/admin/jobsPage through jobs across the customer control planeSession
GET/v1/admin/jobs/kindsRead the integrated producer kind catalog independently of job rowsSession
GET/v1/admin/jobs/{task_id}Read a job visible to the platform administratorSession
GET/v1/admin/jobs/{task_id}/attemptsPage through a job's immutable attempt historySession
POST/v1/admin/jobs/{task_id}/cancelCancel a queued or running jobSession
GET/v1/admin/jobs/{task_id}/dead-lettersPage through append-only terminal-attempt dead lettersSession
GET/v1/admin/jobs/{task_id}/receiptsPage through immutable per-attempt settlement receiptsSession
POST/v1/admin/jobs/{task_id}/replayAdd one attempt and replay the latest dead-lettered jobSession
GET/v1/admin/jobs/{task_id}/resultsPage through current per-item and per-node result projectionsSession
POST/v1/admin/jobs/{task_id}/retryRetry failed items in a failed or partially failed jobSession

Contract file:api/control-jobs.openapi.yaml

Operation details

GET /v1/admin/jobs

Page through jobs across the customer control plane

operationId
listPlatformJobs
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Description (from the contract)

Requires a platform-scoped identity with jobs.read_all or platform.admin. tenant_id narrows the global query. The time window is left-closed and right-open and may not exceed 31 days. Explicit page selects numbered pagination with an exact scoped and filtered total; omit page to preserve the authenticated keyset cursor contract.

Parameters

listPlatformJobs Parameters
NameInTypeRequiredDescription
fromquerystring(date-time)YesInclusive RFC3339 creation-time bound.
toquerystring(date-time)YesExclusive RFC3339 creation-time bound; from-to may not exceed 31 days.
tenant_idquerystring(uuid)NoPlatform route only. Omit to query all tenants.
task_idquerystring(uuid)NoExact task UUID filter.
statusqueryarray<string: queued / running / succeeded / partial_failed / failed / cancelled>NoComma-separated job states; duplicates are rejected.
kindquerystringNo—
resourcequerystringNoExact match against the canonical job subject/reference, or a case-insensitive match against a node UUID assigned to one of the job's items, so node pages can deep-link to the tasks executed on that node.
limitqueryintegerNo—
cursorquerystringNoOpaque, authenticated, versioned HMAC-SHA256 keyset cursor from the preceding response, bound to route scope, endpoint, task, and filters. Reuse with changed inputs or any token modification returns 400.
pagequeryintegerNoExplicit canonical positive decimal page number, mutually exclusive with cursor even if cursor is empty. Count and rows use one read-only repeatable-read snapshot. Different requests are live snapshots and may move rows as jobs are inserted or change state. A page beyond the end returns an empty data array, the requested number and the exact total.

Responses

listPlatformJobs Responses
StatusDescription
200Authenticated keyset page or explicit numbered page with a same-snapshot exact total.

Fields:data: array<Job> page: Page | NumberedPage query: QueryWindow task_metadata?: array<TaskMetadata>

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/jobs/kinds

Read the integrated producer kind catalog independently of job rows

operationId
listPlatformJobKinds
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Description (from the contract)

Requires jobs.read_all or platform.admin. Accepts no query parameters. Integration means a production source path creates canonical job facts, not that its producer or worker is enabled or ready in this runtime.

Responses

listPlatformJobKinds Responses
StatusDescription
200Registered source-backed producer kinds, independent of current job rows or runtime enablement.

Fields:data: array<JobKind>

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.

↑ Back to list

GET /v1/admin/jobs/{task_id}

Read a job visible to the platform administrator

operationId
getPlatformJob
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Parameters

getPlatformJob Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.

Responses

getPlatformJob Responses
StatusDescription
200Job projection without producer payload or credentials.

Fields:data: Job

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/jobs/{task_id}/attempts

Page through a job's immutable attempt history

operationId
listPlatformJobAttempts
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Parameters

listPlatformJobAttempts Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
limitqueryintegerNo—
cursorquerystringNoOpaque, authenticated, versioned HMAC-SHA256 keyset cursor from the preceding response, bound to route scope, endpoint, task, and filters. Reuse with changed inputs or any token modification returns 400.

Responses

listPlatformJobAttempts Responses
StatusDescription
200Attempt history ordered by attempt number descending.

Fields:data: array<Attempt> page: Page

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/jobs/{task_id}/cancel

Cancel a queued or running job

operationId
cancelPlatformJob
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.manage_all platform.admin

Description (from the contract)

Requires jobs.manage_all or platform.admin. The state transition, audit, and command receipt commit atomically. The same actor and Idempotency-Key return the immutable first successful snapshot with replayed=true; reuse for another command returns 409.

Parameters

cancelPlatformJob Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesStrong ETag value returned by the latest job detail or command response.

Request body

application/json · Required:Yes

Responses

cancelPlatformJob Responses
StatusDescription
200Immutable cancelled or queued command result snapshot.

Fields:data: Job replayed: boolean

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
409job_idempotency_conflict, job_invalid_transition, job_retries_exhausted, or job_producer_command_required: the key was reused for another command, the job changed or is ineligible, no retry attempt remains, or the job's producer owns the command. cache.operation cancel/retry is executed by the cache module (same audit and receipt as the cache operation API); job_producer_command_required is returned only for its replay, or when cache control is not enabled.
412job_revision_conflict: the If-Match revision is stale; refresh the job before retrying.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/jobs/{task_id}/dead-letters

Page through append-only terminal-attempt dead letters

operationId
listPlatformJobDeadLetters
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Parameters

listPlatformJobDeadLetters Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
limitqueryintegerNo—
cursorquerystringNoOpaque, authenticated, versioned HMAC-SHA256 keyset cursor from the preceding response, bound to route scope, endpoint, task, and filters. Reuse with changed inputs or any token modification returns 400.

Responses

listPlatformJobDeadLetters Responses
StatusDescription
200Dead letters ordered by terminal attempt descending.

Fields:data: array<DeadLetter> page: Page

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/jobs/{task_id}/receipts

Page through immutable per-attempt settlement receipts

operationId
listPlatformJobSettlementReceipts
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Parameters

listPlatformJobSettlementReceipts Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
limitqueryintegerNo—
cursorquerystringNoOpaque, authenticated, versioned HMAC-SHA256 keyset cursor from the preceding response, bound to route scope, endpoint, task, and filters. Reuse with changed inputs or any token modification returns 400.

Responses

listPlatformJobSettlementReceipts Responses
StatusDescription
200Settlement receipts ordered by attempt descending then ordinal ascending.

Fields:data: array<SettlementReceipt> page: Page

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/jobs/{task_id}/replay

Add one attempt and replay the latest dead-lettered job

operationId
replayPlatformDeadLetteredJob
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.manage_all platform.admin

Description (from the contract)

Requires jobs.manage_all or platform.admin. The state transition, audit, replay fact, and command receipt commit atomically. The same actor and Idempotency-Key return the immutable first successful snapshot with replayed=true; reuse for another command returns 409.

Parameters

replayPlatformDeadLetteredJob Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesStrong ETag value returned by the latest job detail or command response.

Request body

application/json · Required:Yes

Responses

replayPlatformDeadLetteredJob Responses
StatusDescription
200Immutable cancelled or queued command result snapshot.

Fields:data: Job replayed: boolean

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
409job_idempotency_conflict, job_invalid_transition, job_retries_exhausted, or job_producer_command_required: the key was reused for another command, the job changed or is ineligible, no retry attempt remains, or the job's producer owns the command. cache.operation cancel/retry is executed by the cache module (same audit and receipt as the cache operation API); job_producer_command_required is returned only for its replay, or when cache control is not enabled.
412job_revision_conflict: the If-Match revision is stale; refresh the job before retrying.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

GET /v1/admin/jobs/{task_id}/results

Page through current per-item and per-node result projections

operationId
listPlatformJobResults
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.read_all platform.admin

Parameters

listPlatformJobResults Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
limitqueryintegerNo—
cursorquerystringNoOpaque, authenticated, versioned HMAC-SHA256 keyset cursor from the preceding response, bound to route scope, endpoint, task, and filters. Reuse with changed inputs or any token modification returns 400.

Responses

listPlatformJobResults Responses
StatusDescription
200Current item projections ordered by immutable ordinal ascending.

Fields:data: array<ItemResult> page: Page

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list

POST /v1/admin/jobs/{task_id}/retry

Retry failed items in a failed or partially failed job

operationId
retryPlatformJob
Auth
  • Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
Required permissions

Any of:jobs.manage_all platform.admin

Description (from the contract)

Requires jobs.manage_all or platform.admin and an available attempt. The state transition, audit, and command receipt commit atomically. The same actor and Idempotency-Key return the immutable first successful snapshot with replayed=true; reuse for another command returns 409.

Parameters

retryPlatformJob Parameters
NameInTypeRequiredDescription
task_idpathstring(uuid)YesCanonical lower-case UUID of the background job.
Idempotency-KeyheaderstringYes—
If-MatchheaderstringYesStrong ETag value returned by the latest job detail or command response.

Request body

application/json · Required:Yes

Responses

retryPlatformJob Responses
StatusDescription
200Immutable cancelled or queued command result snapshot.

Fields:data: Job replayed: boolean

400job_invalid_request: invalid UUID, query input, Idempotency-Key, content type, or exact empty JSON command body.
401job_authentication_required: authentication is missing or invalid.
403job_permission_denied or job_scope_forbidden: permission is missing, audience is incompatible, or the caller attempted a scope override.
404job_not_found: the task does not exist or is outside the authenticated tenant scope.
408job_request_cancelled: the inbound request context was cancelled.
409job_idempotency_conflict, job_invalid_transition, job_retries_exhausted, or job_producer_command_required: the key was reused for another command, the job changed or is ineligible, no retry attempt remains, or the job's producer owns the command. cache.operation cancel/retry is executed by the cache module (same audit and receipt as the cache operation API); job_producer_command_required is returned only for its replay, or when cache control is not enabled.
412job_revision_conflict: the If-Match revision is stale; refresh the job before retrying.
502job_store_invalid_response or job_response_too_large: stored facts were invalid or the bounded response was too large.
503job_store_unavailable: PostgreSQL or the configured Reader is unavailable.
504job_query_timeout: the bounded request timed out.

What to do on failure

  • 400 Fix the parameters or body per the field list; do not retry unchanged.
  • 401 Check the credential format and whether it expired or was rotated.
  • 403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
  • 404 The resource does not exist or belongs to another tenant.
  • 409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.
  • 412 The revision changed: read the latest ETag, decide again, then send the new If-Match.
  • 503 A dependency is unavailable: retry later with the original Idempotency-Key.

↑ Back to list