---
title: "Get AI job status"
method: GET
path: "/v1/ai/jobs/{jobId}"
tags: ["AI"]
---

# Get AI job status

`GET /v1/ai/jobs/{jobId}`

## Request

- Base URL: `https://blobsrus.omniapp.co/api`
- URL: `https://blobsrus.omniapp.co/api/v1/ai/jobs/{jobId}`
- Auth: HTTP bearer

Retrieve the current status and details of an AI job, including its state, progress information, and result summary.

The response fields vary by `state` — for example, `progress` is only present during `EXECUTING`, and `resultSummary` is only present when `COMPLETE`.

Poll this endpoint every 2–5 seconds until the job reaches a terminal state (`COMPLETE`, `FAILED`, or `CANCELLED`).

## Path parameters

- `jobId` string, uuid, required

## Response `200`

Job status retrieved successfully. Check the `state` field to determine if the job is still running or has reached a terminal state.

- object
  - `id` string, uuid, required: The unique identifier for this job.
  - `state` 'CANCELLED' | 'COMPLETE' | 'DELIVERING' | 'EXECUTING' | 'FAILED' | 'QUEUED', required: Current state of the job. Terminal states are `COMPLETE`, `FAILED`, and `CANCELLED`. Poll until the job reaches a terminal state.
  - `prompt` string, required: The natural language prompt that was submitted.
  - `conversationId` string, uuid, required: The conversation this job belongs to. Use this to submit follow-up jobs in the same conversation thread.
  - `modelId` string, uuid, nullable, required: The shared model ID used for query generation.
  - `branchId` string, uuid, nullable, required: Branch ID used for model context, or null if querying the main shared model.
  - `organizationId` string, uuid, required: The organization that owns this job.
  - `userId` string, uuid, required: The user ID who created (or is associated with) this job.
  - `topicName` string, nullable, required: Topic name used to scope query generation, or null if the AI selected the topic automatically.
  - `requestedLlm` object, nullable, required: The LLM the job is pinned to, or `null` when if the job used the organization default. If your organization is over its AI credit downgrade threshold, this will be the organization's downgrade LLM.
    - `model` string, required: The LLM's catalog name on an Omni-managed provider (e.g. `claude-sonnet-5`) or the LLM's ID if using [Bring your own key](/ai/settings/model-providers/index).
    - `provider` 'bedrock' | 'anthropic' | 'openai' | 'grok' | 'snowflake_cortex' | 'openai_compatible' | 'fireworks' | 'fireworks_managed' | 'databricks_genie' | 'vertex_ai', required: The LLM provider. Use this value when passing `requestedLlm.provider`.
    - `thinking` string[]: The thinking levels this LLM supports, any of which may be passed as `requestedLlm.thinking`.
  - `omniChatUrl` string, uri: URL to view this conversation in the Omni chat interface. Opens the chat session where the job actions and results are visible. Omitted for MCP requests (`X-MCP-Request: true`) when the organization hides Omni links from MCP clients.
  - `progress` object, nullable: **Only present in `EXECUTING` state.** Real-time progress information. Null if no progress has been reported yet. Updated in real-time as the AI works through iterations.
    - `iteration` integer, required: Current iteration number. The AI may take multiple iterations to refine queries and generate a complete answer.
    - `message` string, required: Human-readable status message describing what the AI is currently doing. While the agent is preparing its final answer (the last step of a job that ends on a `summarize` or `validate_analysis` action), this reads `"Preparing the answer"` instead of the final answer text, so a client polling for progress — or the progress webhook — doesn't see the answer before the job actually completes.
    - `toolName` string: The tool the AI is running in this step, using the same vocabulary as `actions[].type` on the [Stream AI job results](/api/ai/stream-ai-job-results) endpoint, such as `generate_query` or `search_model`. Absent for steps that aren't a tool call, such as starting a new iteration.
    - `updatedAt` string, date-time, required: When this progress update was recorded.
  - `resultSummary` string: **Only present in COMPLETE state.** Markdown-formatted summary of the job result. For the full result with query details and data, use the [Stream AI job results endpoint](/api/ai/stream-ai-job-results).
  - `error` object: **Only present in `FAILED` state.** Error details explaining why the job failed.
    - `code` string: Machine-readable error code.
    - `message` string, required: Human-readable error message.
    - `detail` string: Additional error detail or context.
  - `createdAt` string, date-time, required: When the job was submitted.
  - `executionStartedAt` string, date-time: When execution began. Present once the job transitions from `QUEUED` to `EXECUTING`. May be absent on jobs that failed or were cancelled before execution started.
  - `completedAt` string, date-time: **Present in `COMPLETE` and `FAILED` states.** When the job finished (successfully or with error).
  - `cancelledAt` string, date-time: When the job was cancelled.
  - `cancelledBy` string, uuid: **Only present in `CANCELLED` state.** User ID of who cancelled the job.
  - `updatedAt` string, date-time, required: When the job record was last modified.

## Other responses

- `400`: Invalid job ID format. Must be a valid UUID.
- `401`: Missing or invalid API key.
- `403`: Insufficient permissions. AI query generation must be enabled for the organization and the caller must have permission to use AI on the job's model.
- `404`: Job not found. The job may not exist or may belong to a different organization.
- `429`: Too Many Requests - Rate limit exceeded (60 requests/minute)
- `500`: Internal Server Error

## Changes

- **2026-11-03** `43290040f88f`: 6 warning, 21 info
  - removed the optional property `error` from the response with the `400` status
  - removed the optional property `error` from the response with the `401` status
  - removed the optional property `error` from the response with the `404` status
  - removed the optional property `message` from the response with the `400` status
  - …23 more

[Operation history](https://skmtc.dev/omni/apis/omni-api/changes/v1/ai/jobs/:jobId/get.md)

---

[API](https://skmtc.dev/omni/apis/omni-api.md) - [All operations](https://skmtc.dev/omni/apis/omni-api/llms.txt) - [OpenAPI document](https://skmtc.dev/omni/apis/omni-api/revisions/43290040f88f?raw)
