Get job status

Retrieve the current status of a moderation job. Jobs are scoped to your client account.

GEThttps://api.omnifence.ai/api/v1/job/{id}

Requires the job:read scope. Requests without this scope receive a 403 FORBIDDEN response. See authentication.

The response names the API key that submitted the job in api_key_id, with that key's current name in api_key_name. Both are null for a job sent from the dashboard, and for any job created before key attribution shipped. api_key_name is resolved when you read the job, so a key you deleted resolves to null while api_key_id still identifies it.

A completed text or audio job can carry the optional scores and custom_scores objects: an informational risk score from 0 to 1 per built-in category (keyed by its ID without the default_ prefix, for example violence) and per custom category (keyed by slug). They never change the decision, which is is_prohibited. They are absent on an image or video job, on a pending or failed job, and on a completed job that produced no score. A single category key can be missing, so do not require any key.

Request#

Headers#

Name Type Required Description
Authorization string Yes Your API key as a Bearer token: Bearer YOUR_API_KEY.

Path parameters#

Name Type Required Description
id string (uuid) Yes

Responses#

200 OK#

Field Type Always present Description
is_prohibited null or boolean No True when the content was rejected, false when it passed, null while the job is still pending.
reason string No Why the content was rejected. Names the specific policy or custom category that tripped. Present only on a reject.
nsfw boolean No Informational label: whether an image/video contains nudity or sexual content. Decoupled from is_prohibited, so NSFW content is not rejected on its own. Present only when the NSFW classifier ran.
scores object No Informational risk score per built-in policy category, from 0 (clearly does not match) to 1 (clearly matches), keyed by the category id (for example violence; the same category is default_violence in enabled_categories). The scores do not decide the job: is_prohibited is the decision, and a score can be high on content that passed. Child-safety categories are never scored. Returned for text and audio jobs; image and video jobs do not currently return scores. Present only on a completed job that produced scores; a category without a score is omitted.
custom_scores object No The same informational risk scores for your custom categories, keyed by custom category slug. Present only when at least one custom category was scored.
output_image_url string No Output image URL for a non-moderation generate job (presigned HTTPS when stored internally). Present only on those jobs once they complete.
error_code string No Set when the job failed before reaching a moderation decision.
job_id string (uuid) Yes
batch_id string (uuid) No The batch this job belongs to. Present only on an item of a POST /moderate/text/batch submit.
batch_key null or string No Your key for this item in its batch. Present only with batch_id.
type string Yes One of pre, post, chat, text, image, video, audio, generate.
status string Yes One of queued, processing, completed, failed.
api_key_id null or string Yes Id of the API key the job was submitted with. Null for jobs submitted from a dashboard session, and for jobs created before key attribution shipped.
api_key_name null or string Yes Display name of that API key, resolved at read time. Null when the key was never named or has since been deleted. api_key_id still identifies it.
created_at string (date-time) Yes
completed_at null or string (date-time) Yes
Example responseJSON
{
  "is_prohibited": false,
  "reason": "string",
  "nsfw": false,
  "scores": {},
  "custom_scores": {},
  "output_image_url": "string",
  "error_code": "string",
  "job_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "batch_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "batch_key": "string",
  "type": "pre",
  "status": "queued",
  "api_key_id": "string",
  "api_key_name": "string",
  "created_at": "2026-05-19T12:00:00.000Z",
  "completed_at": "2026-05-19T12:00:00.000Z"
}