# Migrate from Jobs

> Move Jobs API code to Transcodings, Assets, and Thumbnails.

Ask your coding agent to migrate your application with the [Chunkify skill](/docs/integration/chunkify-skill):

<agentprompt title="Migrate from Jobs" agents="Codex, Claude" prompt="Use the Chunkify skill at https://chunkify.dev/SKILL.md to migrate this application from the Jobs API.
Move file outputs to Transcodings, HLS to Assets, and JPG images to Thumbnails.
Before editing, list each Job call site with its new target and the settings that change.
Ask me before migrating HLS Jobs that use encryption, H.265, or AV1."></agentprompt>

The Jobs API keeps working during the transition, so you can migrate one code path at a time. Upgrade your SDK to the release that includes Transcodings, Assets, and Thumbnails.

## What replaces Jobs

| Job format | Replacement | SDK call |
| --- | --- | --- |
| `mp4_h264`, `mp4_h265`, `mp4_av1`, `webm_vp9` | [Transcoding](/docs/transcoding) | `client.transcodings.create` |
| `hls_h264` | [Asset](/docs/video-streaming) | `client.assets.create` |
| `jpg` | [Thumbnails](/docs/api-reference/thumbnails/create-thumbnails) | `client.thumbnails.create` |
| `hls_h265`, `hls_av1` | No streaming equivalent | See [HLS](#hls-streaming-to-assets) |

Chunkify now chooses the CPU type and transcoder count for every request.

## File outputs to Transcodings

These settings work as before: `source_id`, `metadata`, `storage.id`, `storage.path`, the `format.id`, and the format's encoding settings such as `crf`, `video_bitrate`, `width`, `height`, `preset`, `profilev`, `level`, and `gop`.

| Job | Transcoding |
| --- | --- |
| `transcoder` | Removed |
| `hls_manifest_id` | Removed |
| Unknown fields | Rejected with a 400 error |
| `channels: 5` or `7` | `channels: 6` (5.1) or `8` (7.1) |
| `minrate` | `webm_vp9` only |
| `pixfmt` | Fewer values per format: no `yuvJ`, big-endian, `yuv410p`, or `yuv411p` formats; AV1 accepts `yuv420p` and `yuv420p10le` |
| `disable_video: true` | `format.id: "m4a_aac"` with a `.m4a` path |
| `preset` default: `veryfast` for H.264, `10` for AV1 | `faster` for H.264, `8` for AV1 |
| Integer `seek` and `duration` | Decimal seconds; `seek` can be `0` |
| `GET /jobs/{id}/files` | `files` on the Transcoding |
| Job transcoders and logs | No equivalent; use `progress` and `processing_stage` |

## HLS streaming to Assets

Create one Asset per Source. Chunkify encodes and packages the H.264 HLS ladder.

| Job | Asset |
| --- | --- |
| Group of `hls_h264` Jobs | One Asset |
| Highest and lowest rendition | `max_resolution` (`1080p` or `2160p`) and `min_resolution` |
| Folder in `storage.path` | `path_template` |
| Master playlist | `manifest.m3u8`, published as `cdn_url` |
| Per-rendition encoding, `hls_time`, `hls_segment_type`, `seek`, `duration` | Managed by Chunkify |
| `hls_h265`, `hls_av1` | Not available; stream H.264 or create MP4 Transcodings |
| `hls_enc` | Not available |
| MP4 download copy | `static_rendition` Asset output |
| JPG sprite for player scrubbing | `timeline_previews.cdn_url` WebVTT |

## Images to Thumbnails

| Job `jpg` | Thumbnails |
| --- | --- |
| `interval` | `timestamps` or `count`, up to 100 |
| `frames` | Limit the `timestamps` or `count` |
| `seek` and `duration` | `range.start` and `range.end` |
| `width` and `height` | `size`, the longest edge from 64 to 1920 |
| `sprite: true` | `output: "sprites"` |
| `chunk_duration` | Removed |
| JPEG only | `format: "jpeg"` or `"webp"` |
| `storage.path` such as `thumb-%05d.jpg` | Same template, numbered from `00001`, with `.webp` for WebP. Also writes `thumb.vtt`. |

## Events and status

| Job | Replacement |
| --- | --- |
| `job.completed` with `data.job` and `data.files` | `transcoding.ready` with `data.transcoding`, including its `files` |
| `job.failed`, `job.cancelled` | `transcoding.failed`, `transcoding.cancelled` |
| `job.*` for HLS | `asset.playback_ready`, `asset.ready`, `asset.failed` |
| `job.*` for JPG | `thumbnail.ready`, `thumbnail.failed` |
| Job statuses such as `ingesting` or `merging` | Transcoding: `preparing`, `ready`, `failed`, `cancelled`, `expired` |
| | Thumbnails: `preparing`, `ready`, `failed`, `expired` |

Add the new events to your webhook before switching a code path. Keep `job.*` until no Jobs are in progress.
