---
title: "Create a clip job"
method: POST
path: "/clipper/jobs"
tags: ["Clipper"]
---

# Create a clip job

`POST /clipper/jobs`

## Request

- Base URL: `https://app.getprolifik.com/api/v1`
- URL: `https://app.getprolifik.com/api/v1/clipper/jobs`
- Auth: HTTP bearer

Queues one URL, one uploaded source, or a batch of up to 10 URLs. Returns before processing finishes. Consumes clip minutes; check /clipper/minutes first. Send an Idempotency-Key so a retried request returns the original job instead of queueing a second one.

## Headers

- `Idempotency-Key` string

## Request body

- union: Out-of-range numbers are clamped to the documented bounds and an inverted minDuration/maxDuration pair is swapped rather than rejected.
  - object
    - `url` string, uri, required
    - `urls` string[]
    - `sourceStoragePath` string
    - `sourceTitle` string
    - `sourceChannel` string
    - `numClips` integer
    - `minDuration` integer
    - `maxDuration` integer
    - `category` 'generic' | 'meme' | 'sports' | 'movies'
    - `layout` 'blur' | 'crop' | 'smart' | 'speaker' | 'smart_crop'
    - `captionStyle` 'classic' | 'karaoke' | 'bold' | 'minimal' | 'neon' | 'none'
    - `aspectRatio` '9:16' | '1:1' | '16:9' | '4:5'
    - `userPrompt` string
    - `options` ClipRenderOptions
      - `language` string
      - `speaker_tracking` boolean
      - `auto_zoom` boolean
      - `emoji_captions` boolean
      - `remove_fillers` boolean
      - `mode` 'captions': captions = burn captions on the whole video (up to 15 minutes) as one clip instead of finding moments. numClips and the durations are ignored.
      - `visual_selection` boolean
      - `multicam` boolean
      - `sfx_hits` boolean
      - `cutaways` boolean
      - `include_logo` boolean
      - `brand_kit` object
        - `primary` string
        - `secondary` string
        - `font` string
      - `format` 'generic' | 'podcast' | 'reaction' | 'casino' | 'broadcast' | 'meme' | 'cinematic': What kind of video it is; picks the moment-selection rules. podcast = interviews, reaction = streamer reacting to a game or video, casino = slots/casino stream, broadcast = sports with no reaction cam.
      - `quality` object
        - `brand_safety` 'standard' | 'gambling': gambling = exclude rival brands, sexual, addiction and underage content, and 'the site doesn't pay' talk.
        - `client_rules` string: The brand's own rules for its clips, followed by the moment picker.
        - `banned_words` string[]: Any clip in which one of these is spoken is dropped.
        - `vocabulary` string[]: Correct spellings of names, brands and terms the captions must get right, e.g. ["Lamine Yamal", "Vinícius Júnior", "Prolifik"]. Trimmed and deduped (case-insensitive); empty or over-long entries are dropped.
        - `dictionary` object: Caption fixes: the word the transcript tends to hear mapped to its correct spelling, e.g. {"prolific": "Prolifik"}. Keys and values are at most 60 characters.
        - `key_moments` 'auto' | 'off': auto = goals, red cards, big wins and similar always get their own clip; off = no such guarantee.
  - object
    - `url` string, uri
    - `urls` string[], required
    - `sourceStoragePath` string
    - `sourceTitle` string
    - `sourceChannel` string
    - `numClips` integer
    - `minDuration` integer
    - `maxDuration` integer
    - `category` 'generic' | 'meme' | 'sports' | 'movies'
    - `layout` 'blur' | 'crop' | 'smart' | 'speaker' | 'smart_crop'
    - `captionStyle` 'classic' | 'karaoke' | 'bold' | 'minimal' | 'neon' | 'none'
    - `aspectRatio` '9:16' | '1:1' | '16:9' | '4:5'
    - `userPrompt` string
    - `options` ClipRenderOptions
      - `language` string
      - `speaker_tracking` boolean
      - `auto_zoom` boolean
      - `emoji_captions` boolean
      - `remove_fillers` boolean
      - `mode` 'captions': captions = burn captions on the whole video (up to 15 minutes) as one clip instead of finding moments. numClips and the durations are ignored.
      - `visual_selection` boolean
      - `multicam` boolean
      - `sfx_hits` boolean
      - `cutaways` boolean
      - `include_logo` boolean
      - `brand_kit` object
        - `primary` string
        - `secondary` string
        - `font` string
      - `format` 'generic' | 'podcast' | 'reaction' | 'casino' | 'broadcast' | 'meme' | 'cinematic': What kind of video it is; picks the moment-selection rules. podcast = interviews, reaction = streamer reacting to a game or video, casino = slots/casino stream, broadcast = sports with no reaction cam.
      - `quality` object
        - `brand_safety` 'standard' | 'gambling': gambling = exclude rival brands, sexual, addiction and underage content, and 'the site doesn't pay' talk.
        - `client_rules` string: The brand's own rules for its clips, followed by the moment picker.
        - `banned_words` string[]: Any clip in which one of these is spoken is dropped.
        - `vocabulary` string[]: Correct spellings of names, brands and terms the captions must get right, e.g. ["Lamine Yamal", "Vinícius Júnior", "Prolifik"]. Trimmed and deduped (case-insensitive); empty or over-long entries are dropped.
        - `dictionary` object: Caption fixes: the word the transcript tends to hear mapped to its correct spelling, e.g. {"prolific": "Prolifik"}. Keys and values are at most 60 characters.
        - `key_moments` 'auto' | 'off': auto = goals, red cards, big wins and similar always get their own clip; off = no such guarantee.
  - object
    - `url` string, uri
    - `urls` string[]
    - `sourceStoragePath` string, required
    - `sourceTitle` string
    - `sourceChannel` string
    - `numClips` integer
    - `minDuration` integer
    - `maxDuration` integer
    - `category` 'generic' | 'meme' | 'sports' | 'movies'
    - `layout` 'blur' | 'crop' | 'smart' | 'speaker' | 'smart_crop'
    - `captionStyle` 'classic' | 'karaoke' | 'bold' | 'minimal' | 'neon' | 'none'
    - `aspectRatio` '9:16' | '1:1' | '16:9' | '4:5'
    - `userPrompt` string
    - `options` ClipRenderOptions
      - `language` string
      - `speaker_tracking` boolean
      - `auto_zoom` boolean
      - `emoji_captions` boolean
      - `remove_fillers` boolean
      - `mode` 'captions': captions = burn captions on the whole video (up to 15 minutes) as one clip instead of finding moments. numClips and the durations are ignored.
      - `visual_selection` boolean
      - `multicam` boolean
      - `sfx_hits` boolean
      - `cutaways` boolean
      - `include_logo` boolean
      - `brand_kit` object
        - `primary` string
        - `secondary` string
        - `font` string
      - `format` 'generic' | 'podcast' | 'reaction' | 'casino' | 'broadcast' | 'meme' | 'cinematic': What kind of video it is; picks the moment-selection rules. podcast = interviews, reaction = streamer reacting to a game or video, casino = slots/casino stream, broadcast = sports with no reaction cam.
      - `quality` object
        - `brand_safety` 'standard' | 'gambling': gambling = exclude rival brands, sexual, addiction and underage content, and 'the site doesn't pay' talk.
        - `client_rules` string: The brand's own rules for its clips, followed by the moment picker.
        - `banned_words` string[]: Any clip in which one of these is spoken is dropped.
        - `vocabulary` string[]: Correct spellings of names, brands and terms the captions must get right, e.g. ["Lamine Yamal", "Vinícius Júnior", "Prolifik"]. Trimmed and deduped (case-insensitive); empty or over-long entries are dropped.
        - `dictionary` object: Caption fixes: the word the transcript tends to hear mapped to its correct spelling, e.g. {"prolific": "Prolifik"}. Keys and values are at most 60 characters.
        - `key_moments` 'auto' | 'off': auto = goals, red cards, big wins and similar always get their own clip; off = no such guarantee.

## Response `202`

Job or batch accepted

- object

## Other responses

- `400`: Request failed
- `401`: Request failed
- `402`: Payment required. error.code is subscription_required (the plan does not include this feature, or the key's account no longer has a plan: API keys are paid-only, so every write from a key whose account has none is refused; see error.upgradeUrl), insufficient_credits (the AI-credit balance is short; see error.needed, error.balance, error.upgradeUrl), or quota_exceeded (a plan quota such as monthly videos or clip minutes).
- `403`: Request failed
- `409`: Request failed
- `429`: Request failed

---

[API](https://skmtc.dev/getprolifik/apis/prolifik-public-api.md) · [All operations](https://skmtc.dev/getprolifik/apis/prolifik-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/getprolifik/apis/prolifik-public-api/revisions/301e79c5763c?raw)
