> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.morphiaone.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.morphiaone.ai/_mcp/server.

# job.failed

POST 

A job reached `failed`; `data.object` is the Job as polled.

Sent as canonical JSON with `MorphiaOne-Signature: t=<unix>,v1=<hex>` (HMAC-SHA256
over `t.` + the raw body; two `v1=` values during a secret rotation). Verify the
raw bytes with the SDK's `webhooks.verify` before parsing. `id` is stable across
every retry and resend, so deduplicate on it. No ordering is promised.

Reference: https://docs.morphiaone.ai/api-reference/endpoints/webhooks/webhook-job-failed

## Request

### Headers

- `MorphiaOne-Signature` (string, required)
- `MorphiaOne-Event-Id` (string, required)
- `MorphiaOne-Event-Type` (string, required)
- `MorphiaOne-Delivery-Attempt` (integer, required)

### Payload

- `created` (datetime, required)
- `data` (WebhookEventDataV1, required)
- `id` (string, required)
- `type` (enum, required)
  - Allowed values: `job.succeeded`, `job.failed`, `job.cancelled`, `test.ping`
- `api_version` ("v1", optional, default: v1)
- `livemode` (boolean, optional, nullable)
- `object` ("event", optional, default: event)

## Types

### WebhookEventDataV1

- `object` (WebhookEventDataV1Object, required)

### WebhookEventDataV1Object

### JobV1

- `completed_at` (datetime, required, nullable)
- `created_at` (datetime, required)
- `error` (JobErrorV1, required, nullable)
- `expires_at` (datetime, required, nullable)
- `id` (string, required)
- `inputs` (list of JobInputRef, required)
- `operation` (enum, required) — What a job does: the operation's authorization scope. An operation is not its output's `type`: `OPERATION_OUTPUT_TYPE` is the one place the two meet.
  - Allowed values: `makeup.apply`, `skin.analyze`, `hair.try_on`
- `output` (JobV1Output, required, nullable)
- `status` (enum, required)
  - Allowed values: `queued`, `running`, `succeeded`, `failed`, `cancelled`
- `updated_at` (datetime, required)
- `livemode` (boolean, optional)

### WebhookDeletedJobV1

``data.object`` once the job was deleted: the id and nothing else.

- `id` (string, required)
- `deleted` (true, optional, default: true)
- `object` ("job", optional, default: job)

### WebhookTestObjectV1

``data.object`` of a ``test.ping``: which endpoint the console pinged.

- `endpoint_id` (string, required)
- `object` ("test", optional, default: test)

### JobErrorV1

- `code` (enum, required)
  - Allowed values: `INPUT_UNPROCESSABLE`, `INPUT_EXPIRED`, `PROCESSING_FAILED`
- `message` (string, required)

### JobInputRef

One input as a job reports it: an open role and a tolerant shape.

- `asset_id` (string, required)
- `role` (string, required)

### JobV1Output

- `type`: `hair.try_on` (HairTryOnOutput)
  - `applied` (HairTryOnApplied, required)
  - `image` (ResultAsset, required) — One named part of a job output, served through the V1 asset content route.
  - `revision` (integer, optional, default: 1)
- `type`: `makeup.try_on` (MakeupTryOnOutput)
  - `image` (ResultAsset, required) — One named part of a job output, served through the V1 asset content route.
  - `revision` (integer, optional, default: 1)
- `type`: `skin.analysis` (SkinAnalysisOutput)
  - `concerns` (list of SkinConcernResult, required)
  - `analysis_version` (string, optional, default: skin-2026-09-draft.1)
  - `visualizations` (list of ResultAsset, optional, default: [])

### HairTryOnApplied

- `color_gradient` (HairAppliedColorGradient, required)

### ResultAsset

One named part of a job output, served through the V1 asset content route.

- `expires_at` (datetime, required)
- `href` (string, required)
- `id` (string, required)
- `media_type` (enum, required)
  - Allowed values: `image/png`, `image/webp`
- `role` (string, required)
- `size_bytes` (integer, required)
- `height` (integer, optional, nullable)
- `width` (integer, optional, nullable)

### SkinConcernResult

- `concern` (enum, required)
  - Allowed values: `acne`, `dark_circle`, `eye_bag`, `redness`, `oiliness`, `wrinkles`, `firmness`, `moisture`, `pore`, `tear_trough`, `hyper_pigmentation`, `droopy_upper_eyelid`
- `score` (double, required, nullable)
- `status` (enum, required)
  - Allowed values: `measured`, `unavailable`
- `unavailable_reason` (enum, required, nullable)
  - Allowed values: `not_measured`, `not_measurable`

### HairAppliedColorGradient

- `dark` (HairAppliedColorStop, required)
- `light` (HairAppliedColorStop, required)

### HairAppliedColorStop

- `color` (string, required)
- `opacity` (double, required)