---
title: "Create an asynchronous generation task"
method: POST
path: "/api/v1/jobs/createTask"
tags: ["Tasks"]
---

# Create an asynchronous generation task

`POST /api/v1/jobs/createTask`

## Request

- Base URL: `https://api.popnow.ai`
- URL: `https://api.popnow.ai/api/v1/jobs/createTask`
- Auth: HTTP bearer

Validates the model input, reserves the estimated charge, chooses an
available deployment, and creates a task in `queued` state. HTTP 202
means the task was accepted; it does not mean generation has completed.

An `Idempotency-Key` is optional but strongly recommended. For the same
account **and the same API key**, repeating a key with the same normalized
model, input, and callback URL within 24 hours returns the
original task and does not reserve funds twice. A sibling API key cannot
replay the mapping: it receives `409 Conflict` without the original task
ID. Reusing the key with different request semantics also returns
`409 Conflict`. Callbacks are optional and are validated against
private/loopback destinations before acceptance.

## Query parameters

- `wait` integer

## Headers

- `Idempotency-Key` string
- `X-PopNow-Retention` string

## Request body

- CreateTaskRequest
  - `model` 'alibaba/happyhorse-1.1/image-to-video' | 'alibaba/happyhorse-1.1/reference-to-video' | 'alibaba/happyhorse-1.1/text-to-video' | 'alibaba/qwen-3-tts/text-to-speech' | 'alibaba/qwen-image-1.0-lora/edit' | 'alibaba/qwen-image-1.0-lora/text-to-image' | 'alibaba/qwen-image-2.1-lora/edit' | 'alibaba/qwen-image-2.1-lora/text-to-image' | 'alibaba/qwen-image-2.1-pro/edit' | 'alibaba/qwen-image-2.1-pro/text-to-image' | 'alibaba/qwen-image-2.1-turbo/edit' | 'alibaba/qwen-image-2.1-turbo/text-to-image' | 'alibaba/qwen-image-2.1/edit' | 'alibaba/qwen-image-2.1/text-to-image' | 'alibaba/qwen-image-2/edit' | 'alibaba/qwen-image-2/text-to-image' | 'alibaba/qwen-image-2512-lora/edit' | 'alibaba/qwen-image-2512-lora/text-to-image' | 'alibaba/qwen-image-3.0-pro/edit' | 'alibaba/qwen-image-3.0-pro/text-to-image' | 'alibaba/qwen-image-3.0/edit' | 'alibaba/qwen-image-3.0/text-to-image' | 'alibaba/qwen-image-edit-2509-lora/edit' | 'alibaba/wan-2.1-image-lora/edit' | 'alibaba/wan-2.1-image-lora/text-to-image' | 'alibaba/wan-2.1-lora/image-to-video' | 'alibaba/wan-2.1-lora/text-to-video' | 'alibaba/wan-2.1-lora/video-edit' | 'alibaba/wan-2.2-5b-lora/image-to-video' | 'alibaba/wan-2.2-5b-lora/text-to-video' | 'alibaba/wan-2.2-animate/character-animation' | 'alibaba/wan-2.2-image-lora/text-to-image' | 'alibaba/wan-2.2-lora/image-to-video' | 'alibaba/wan-2.2-lora/text-to-video' | 'alibaba/wan-2.2-lora/video-extend' | 'alibaba/wan-2.2/image-to-video' | 'alibaba/wan-2.2/text-to-video' | 'alibaba/wan-2.5/image-to-video' | 'alibaba/wan-2.5/text-to-video' | 'alibaba/wan-2.5/video-extend' | 'alibaba/wan-2.6-flash/image-to-video' | 'alibaba/wan-2.6-flash/reference-to-video' | 'alibaba/wan-2.6/image-to-video' | 'alibaba/wan-2.6/reference-to-video' | 'alibaba/wan-2.6/text-to-video' | 'alibaba/wan-2.7-pro/edit' | 'alibaba/wan-2.7-pro/text-to-image' | 'alibaba/wan-2.7/edit' | 'alibaba/wan-2.7/text-to-image' | 'alibaba/wan-3.0-prime/image-to-video' | 'alibaba/wan-3.0-prime/reference-to-video' | 'alibaba/wan-3.0-prime/text-to-video' | 'alibaba/wan-3.0-prime/video-extend' | 'alibaba/wan-3.0-pro-prime/image-to-video' | 'alibaba/wan-3.0-pro-prime/reference-to-video' | 'alibaba/wan-3.0-pro-prime/text-to-video' | 'alibaba/wan-3.0-pro-prime/video-extend' | 'alibaba/wan-3.0-pro/image-to-video' | 'alibaba/wan-3.0-pro/reference-to-video' | 'alibaba/wan-3.0-pro/text-to-video' | 'alibaba/wan-3.0-pro/video-extend' | 'alibaba/wan-3.0/image-to-video' | 'alibaba/wan-3.0/reference-to-video' | 'alibaba/wan-3.0/text-to-video' | 'alibaba/wan-3.0/video-extend' | 'alibaba/z-image-base-lora/edit' | 'alibaba/z-image-base-lora/text-to-image' | 'alibaba/z-image-turbo-lora/edit' | 'alibaba/z-image-turbo-lora/text-to-image' | 'alibaba/z-image-turbo/text-to-image' | 'black-forest-labs/flux-1-dev-controlnet-lora/text-to-image' | 'black-forest-labs/flux-1-dev-lora/edit' | 'black-forest-labs/flux-1-dev-lora/text-to-image' | 'black-forest-labs/flux-1-fill-dev-lora/edit' | 'black-forest-labs/flux-1-krea-dev-lora/edit' | 'black-forest-labs/flux-1-krea-dev-lora/text-to-image' | 'black-forest-labs/flux-1-schnell-lora/edit' | 'black-forest-labs/flux-1-schnell-lora/text-to-image' | 'black-forest-labs/flux-2-dev-lora/edit' | 'black-forest-labs/flux-2-dev-lora/text-to-image' | 'black-forest-labs/flux-2-dev/edit' | 'black-forest-labs/flux-2-dev/text-to-image' | 'black-forest-labs/flux-2-flex/edit' | 'black-forest-labs/flux-2-flex/text-to-image' | 'black-forest-labs/flux-2-klein-4b-lora/edit' | 'black-forest-labs/flux-2-klein-4b-lora/text-to-image' | 'black-forest-labs/flux-2-klein-4b/edit' | 'black-forest-labs/flux-2-klein-4b/text-to-image' | 'black-forest-labs/flux-2-klein-9b-lora/edit' | 'black-forest-labs/flux-2-klein-9b-lora/text-to-image' | 'black-forest-labs/flux-2-klein-9b/edit' | 'black-forest-labs/flux-2-klein-9b/text-to-image' | 'black-forest-labs/flux-2-klein-base-4b-lora/edit' | 'black-forest-labs/flux-2-klein-base-4b-lora/text-to-image' | 'black-forest-labs/flux-2-klein-base-9b-lora/edit' | 'black-forest-labs/flux-2-klein-base-9b-lora/text-to-image' | 'black-forest-labs/flux-2-max/edit' | 'black-forest-labs/flux-2-max/text-to-image' | 'black-forest-labs/flux-2-pro/edit' | 'black-forest-labs/flux-2-pro/text-to-image' | 'black-forest-labs/flux-3-klein-base-lora/edit' | 'black-forest-labs/flux-3-klein-base-lora/text-to-image' | 'black-forest-labs/flux-3-klein-base/edit' | 'black-forest-labs/flux-3-klein-base/text-to-image' | 'black-forest-labs/flux-3/image-to-video' | 'black-forest-labs/flux-3/text-to-video' | 'black-forest-labs/flux-3/upscale' | 'black-forest-labs/flux-3/video-extend' | 'bytedance/seed-audio-1.0/text-to-audio' | 'bytedance/seed-speech-2.0/text-to-speech' | 'bytedance/seedance-1.5-pro/image-to-video' | 'bytedance/seedance-1.5-pro/text-to-video' | 'bytedance/seedance-1.5-pro/video-extend' | 'bytedance/seedance-2.0-fast/image-to-video' | 'bytedance/seedance-2.0-fast/reference-to-video' | 'bytedance/seedance-2.0-fast/text-to-video' | 'bytedance/seedance-2.0-fast/video-extend' | 'bytedance/seedance-2.0-mini/image-to-video' | 'bytedance/seedance-2.0-mini/reference-to-video' | 'bytedance/seedance-2.0-mini/text-to-video' | 'bytedance/seedance-2.0-mini/video-extend' | 'bytedance/seedance-2.0/image-to-video' | 'bytedance/seedance-2.0/reference-to-video' | 'bytedance/seedance-2.0/text-to-video' | 'bytedance/seedance-2.0/video-extend' | 'bytedance/seedance-2.5/image-to-video' | 'bytedance/seedance-2.5/reference-to-video' | 'bytedance/seedance-2.5/text-to-video' | 'bytedance/seedance-2.5/video-extend' | 'bytedance/seedream-4.0/edit' | 'bytedance/seedream-4.0/text-to-image' | 'bytedance/seedream-5.0-flash/edit' | 'bytedance/seedream-5.0-flash/layer-decomposition' | 'bytedance/seedream-5.0-flash/text-to-image' | 'bytedance/seedream-5.0-lite/edit' | 'bytedance/seedream-5.0-lite/text-to-image' | 'bytedance/seedream-5.0-pro/edit' | 'bytedance/seedream-5.0-pro/layer-decomposition' | 'bytedance/seedream-5.0-pro/text-to-image' | 'circlestone-labs/anima-turbo-lora/edit' | 'circlestone-labs/anima-turbo-lora/text-to-image' | 'circlestone-labs/anima-turbo/edit' | 'circlestone-labs/anima-turbo/text-to-image' | 'google/gemini-2.5-pro-tts/text-to-speech' | 'google/gemini-3.8-flash-lite-tts/text-to-speech' | 'google/gemini-3.8-flash-tts/text-to-speech' | 'google/nano-banana-2.1/edit' | 'google/nano-banana-2.1/text-to-image' | 'google/nano-banana-2/edit' | 'google/nano-banana-2/text-to-image' | 'google/nano-banana-pro/edit' | 'google/nano-banana-pro/text-to-image' | 'heartmula/transcribe/speech-to-text' | 'j1b/jib-mix-qwen-image-lora/text-to-image' | 'j1b/jib-mix-qwen-image/text-to-image' | 'kling/2.1-master/image-to-video' | 'kling/2.1-master/text-to-video' | 'kling/2.1/image-to-video' | 'kling/2.5-turbo/image-to-video' | 'kling/2.5-turbo/text-to-video' | 'kling/2.6/character-animation' | 'kling/2.6/image-to-video' | 'kling/2.6/text-to-video' | 'kling/3.0-turbo/image-to-video' | 'kling/3.0-turbo/text-to-video' | 'kling/3.0/character-animation' | 'kling/3.0/image-to-video' | 'kling/3.0/text-to-video' | 'kling/4.0/image-to-video' | 'kling/4.0/reference-to-video' | 'kling/4.0/text-to-video' | 'kling/o3/image-to-video' | 'kling/o3/reference-to-video' | 'kling/o3/text-to-video' | 'kling/o3/video-edit' | 'krea/2-large/text-to-image' | 'krea/2-medium-turbo/text-to-image' | 'krea/2-medium/text-to-image' | 'krea/2-turbo-lora/edit' | 'krea/2-turbo-lora/text-to-image' | 'krea/3/edit' | 'krea/3/text-to-image' | 'lightricks/ltx-2-19b-lora/image-to-video' | 'lightricks/ltx-2-19b-lora/text-to-video' | 'lightricks/ltx-2-19b/image-to-video' | 'lightricks/ltx-2-19b/text-to-video' | 'lightricks/ltx-2-19b/video-extend' | 'lightricks/ltx-2.3-lora/image-to-video' | 'lightricks/ltx-2.3-lora/text-to-video' | 'lightricks/ltx-2.5/image-to-video' | 'lightricks/ltx-2.5/text-to-video' | 'minimax/h3-360-orbit/image-to-video' | 'minimax/h3-image-lora/edit' | 'minimax/h3-image-lora/text-to-image' | 'minimax/h3-lora/image-to-video' | 'minimax/h3-lora/reference-to-video' | 'minimax/h3-lora/text-to-video' | 'minimax/h3-lora/video-extend' | 'minimax/h3-max/image-to-video' | 'minimax/h3-max/text-to-video' | 'minimax/h3-max/video-extend' | 'minimax/h3-singularity-lora/image-to-video' | 'minimax/h3-singularity-lora/reference-to-video' | 'minimax/h3-singularity-lora/video-extend' | 'minimax/h3/image-to-video' | 'minimax/h3/reference-to-video' | 'minimax/h3/text-to-video' | 'minimax/h3/video-extend' | 'minimax/music-3.0/text-to-audio' | 'minimax/speech-2.8-hd/text-to-speech' | 'minimax/speech-2.8-turbo/text-to-speech' | 'neta-art/neta-lumina/text-to-image' | 'openai/gpt-image-2.5-flare/edit' | 'openai/gpt-image-2.5-flare/text-to-image' | 'openai/gpt-image-2.5-sunburst/edit' | 'openai/gpt-image-2.5-sunburst/text-to-image' | 'openai/gpt-image-2/edit' | 'openai/gpt-image-2/text-to-image' | 'popnow/anime-to-real-v1/edit' | 'popnow/background-remover-v1/edit' | 'popnow/camera-angle-changer-v1/edit' | 'popnow/foley-v1/video-to-audio' | 'popnow/image-expander-v1/edit' | 'popnow/image-upscaler-v1/upscale' | 'popnow/object-eraser-v1/edit' | 'popnow/pose-changer-v1/edit' | 'popnow/relight-v1/edit' | 'popnow/shadow-remover-v1/edit' | 'popnow/video-upscaler-v1/upscale' | 'prefect/pony-xl-lora/text-to-image' | 'prefect/pony-xl/text-to-image' | 'pruna-ai/p-image-lora/edit' | 'pruna-ai/p-image-lora/text-to-image' | 'resemble-ai/chatterbox-v1/text-to-speech' | 'suno/v6-mini/text-to-audio' | 'suno/v6-wild/text-to-audio' | 'suno/v6/text-to-audio' | 'tencent/hunyuan-video-1.5/image-to-video' | 'tencent/hunyuan-video-1.5/text-to-video' | 'vidu/q3-pro/image-to-video' | 'vidu/q3-turbo/image-to-video' | 'vidu/q3-turbo/video-extend' | 'vidu/q3/image-to-video' | 'vidu/q4-preview/image-to-video' | 'vidu/q4-preview/reference-to-video' | 'vidu/q4-preview/video-extend' | 'xai/grok-stt/speech-to-text' | 'xai/grok-tts/text-to-speech', required: Model call name, `<publisher>/<model>/<task>` (for example `alibaba/wan-3.0/image-to-video`). The list below is the catalog at generation time; `GET /api/v1/models` is the live source.
  - `input` object, required: Validated against the selected model's inputSchema (`GET /api/v1/models/{model}`). Declared media fields accept public HTTPS URLs, committed popnow://f/<id> file URIs (common/upload-url, then the file commit endpoint), saved assets as popnow://a/<id> in the media field of the matching kind (the asset must be in the library of the key's workspace; any other asset gets the same rejection as an unknown id), or standard Base64 Data URIs (image/jpeg, image/png, image/webp, image/gif). Inline images are limited to 1048576 decoded bytes and 8388608 pixels each, 8192 pixels per side, and 16 images / 16777216 pixels in total. The complete JSON request must fit within 2097152 bytes. Model-specific limits still apply. Bare Base64, SVG and inline audio/video are not accepted; use HTTPS or file uploads instead. Inline images are stored as account-bound uploaded files; returned input contains file URIs, never the original Base64 bytes. Quote validation does not upload or reserve credits. If the model's inputSchema declares `seed` and you omit it, we pick a random seed for this task, so two identical requests do not come back with the same output. The chosen seed is returned in the task's `input`; pass it back to hold the draw steady (a fixed seed keeps runs comparable, it does not guarantee an identical result). A `seed` you send yourself is always used as given.
  - `callBackUrl` string, uri: Optional public HTTPS endpoint for terminal task delivery. `http://` URLs are rejected: the delivery carries the prompt and signed result links. Explicit ports other than 443 and 80 are rejected, and URL credentials are rejected. The hostname must resolve to public IP addresses and is checked again when connecting. Invalid values return HTTP 400 with code 400, msg "Invalid callback URL", and request_id.
  - `quoteId` string: Signed quote returned by jobs/quote for this same account, API key and request. Does not replace Idempotency-Key.
  - `expectedCost` string: Decimal USD amount encoded as a string to avoid binary floating-point loss.
  - `expectedCredits` integer: Confirmed number of credits to reserve, as returned in `maxCredits` by jobs/quote. 1 credit = $0.001. Send this or `expectedCost` (the same amount in USD); when both are sent, `expectedCredits` wins. A changed price returns business code 40901 before anything is reserved.

## Response `200`

Returned only when `wait` was supplied and the task reached a terminal state inside that budget. The body is the task record, identical in shape to `recordInfo`. A terminal state is not necessarily a success - check `data.state`.

- TaskRecordEnvelope
  - `code` 200, required
  - `msg` 'success', required
  - `request_id` string, required: Correlation identifier. Include it in support requests.
  - `data` TaskRecord, required
    - `taskId` string, required
    - `sourceTaskId` string: Present when this task was created by explicit retry.
    - `model` string, required: Model call name, `<publisher>/<model>/<task>`.
    - `state` 'queued' | 'running' | 'succeeded' | 'failed' | 'canceled' | 'expired', required
    - `input` object: Normalized model input; inline images become account-bound file URIs. Includes the random `seed` we picked when you omitted one (see CreateTaskRequest.input). Omitted after retention redaction.
    - `output` TaskOutput: First-party result metadata. Ready assets include directly usable temporary URLs; no download-ticket request is needed. Poll again to refresh an expired URL. Temporary URLs are bearer access grants; never attach your API key when fetching them.
      - `text` string: Text result (transcription). For transcription with multichannel on, one line per channel in channel order.
      - `transcript` TaskTranscript: Structured transcription result, present only on speech-to-text endpoints that return it. `text` above stays the plain transcript; this object adds timing and language details. Erased together with the rest of the task output on the prompt-retention schedule.
        - `text` string: Full transcript.
        - `language` string: Detected language, as reported by the model (for example en).
        - `languageCode` string: Detected language code (ISO 639-3, for example eng) when available.
        - `languageProbability` number: Confidence of the detected language, 0 to 1, when available.
        - `durationSeconds` number: Length of the transcribed audio in seconds.
        - `words` TaskTranscriptWord[]
          - `text` string, required
          - `start` number, required: Start time in seconds from the beginning of the audio.
          - `end` number, required: End time in seconds.
          - `type` string: Segment type (for example word) when the model reports one.
          - `speakerId` string: Speaker label; only present when the model performs speaker separation.
        - `channels` TaskTranscriptChannel[]: Present when multichannel transcription was requested; one entry per audio channel.
          - `index` integer, required: Zero-based channel index.
          - `text` string
          - `language` string
          - `languageCode` string
          - `words` TaskTranscriptWord[]
            - `text` string, required
            - `start` number, required: Start time in seconds from the beginning of the audio.
            - `end` number, required: End time in seconds.
            - `type` string: Segment type (for example word) when the model reports one.
            - `speakerId` string: Speaker label; only present when the model performs speaker separation.
      - `assets` TaskOutputAsset[]
        - `key` string: Compatibility identifier for optional download-url requests.
        - `url` string, uri: First-party signed GET URL on PopNow storage, normally valid for 20 minutes. Absent while pending or unavailable. Request a fresh one with recordInfo or common/download-url after it expires.
        - `expiresAt` string, date-time: Expiry of this URL, not the result retention deadline.
        - `mime` string
        - `width` integer
        - `height` integer
        - `durationSeconds` number
        - `bytes` integer
        - `role` string: What the asset is: `video`, `image`, `audio` or a model-specific role. Video extend endpoints that join the source clip to the new footage return two assets in a fixed order: the joined clip first (`video`), then the newly generated part on its own (`segment`). Endpoints that return only the new part have no `segment` asset.
        - `pending` boolean
        - `unavailable` boolean
        - `deleted` boolean: PopNow only: the owner permanently deleted this output (one output of a multi-output task). Always comes with unavailable true and no key or url; the stored file is being deleted.
        - `layer` object: Present only on layer decomposition results. The first asset is the base image (the source with the separated elements removed, `zIndex` 0); every other asset is one transparent PNG layer. Stack them by ascending `zIndex` to rebuild the picture. `boundingBox` is `[x1, y1, x2, y2]` in base-image pixels and places the layer on the base (scale the layer to that box); it is absent on the base image and on models that do not report positions, in which case the layers can still be used as standalone cut-outs. `name` is the model's label for the layer when it gives one.
          - `zIndex` integer, required
          - `name` string
          - `boundingBox` integer[]
    - `errorCode` 'invalid_request' | 'unsupported_combination' | 'content_rejected' | 'rate_limited' | 'upstream_unavailable' | 'generation_failed' | 'timeout' | 'invalid_asset' | 'upstream_failed': Stable PopNow failure identifier from a closed set; never an internal diagnostic code. The set is closed: any other value a client sees should be handled as `upstream_failed`.
    - `errorMessage` string: Human-readable failure reason. When the model service reported a specific reason (for example a corrupted reference image or a copyright restriction on generated audio), that reason is returned in English with internal service names, hosts, URLs, request and task IDs, error-code suffixes and account or billing details removed; otherwise a normalized message that follows the same language selection as `msg`. `errorCode` never changes and remains the value to branch on.
    - `cost` string, required: Decimal USD amount encoded as a string to avoid binary floating-point loss.
    - `credits` integer, required: The same amount as `cost`, in credits (1 credit = $0.001), rounded up to a whole credit. Before settlement it is the held amount; after settlement it is the final charge.
    - `exactCredits` string, required: The same amount as `credits`, not rounded, as a decimal string (for example `"0.0731"`). Chat calls are charged their actual token usage in fractional credits, so use this field to see what a chat call cost.
    - `settled` boolean, required: When false, `cost` is the held estimate. When true, `cost` is the final charge. On success the final charge is capped at that hold; unused funds are released. Failed or expired tasks normally release the hold in full; the one exception is a `content_rejected` task on a model whose page states that such refusals are billed, which is settled at the accepted estimate.
    - `createdAt` string, date-time, required
    - `deadlineAt` string, date-time: Server execution deadline. Present in current responses; historical stored webhook events may omit it. Not the result retention or URL expiry time.
    - `completedAt` string, date-time
    - `contentState` 'present' | 'expired' | 'purged': Whether the task content is still stored, and why it is not. `expired` means the retention policy removed it; `purged` means the account owner destroyed it with `purgeTask`. The two are deliberately distinct: telling a customer their own deletion was an expiry reads as the platform losing their data.
    - `contentRemovedBy` 'user' | 'system': Present only once content has been removed. Omitted while `contentState` is `present`.
    - `purgedAt` string, date-time: Present only for a task destroyed with `purgeTask`. Expiry does not set it.
    - `retention` TaskRetention: When this task's content is scheduled to be removed, and which layer decided it. Omitted for tasks created before per-task retention existed; those follow the platform maximum.
      - `outputsExpireAt` string, date-time, required: When the generated media objects and the result payload are removed. Before the task finishes this is measured from acceptance; when the task reaches a terminal state it is re-based on the completion time using the same window, so it only ever moves later, never earlier.
      - `promptsExpireAt` string, date-time, required: When the stored request text is erased. The task row, its state, amounts and request_id remain.
      - `source` 'header' | 'account' | 'platform', required: Which layer actually constrained the value: the per-request `X-PopNow-Retention` header, the account setting, or the platform maximum. A request that sends the header and still sees `account` has an account setting that is already shorter than it asked for.

## Other responses

- `202`: A newly accepted task is returned in `queued` state. A same-key idempotent replay returns the original task in its current state and does not create another hold. The hold is not a charge.
- `400`: Invalid JSON, query, callback URL, model input, or media declaration. Invalid callBackUrl values return code 400 and msg "Invalid callback URL" with request_id. Submitted hosts, IP addresses, and DNS diagnostics are not echoed.
- `401`: Missing, malformed, expired, revoked, or otherwise invalid API key.
- `402`: Insufficient balance (`40201`) or a spend cap was reached (`40202`).
- `403`: Account, model, API-key, IP, or region authorization failed.
- `409`: Idempotency or media-transfer state conflicts with this request.
- `413`: Request body exceeds the server's accepted size limit.
- `429`: Account-level request limit exceeded.
- `500`: Internal failure. Details are not exposed; report `request_id` to support.
- `503`: HTTP 503 carries one of three business codes. `50301`: no usable deployment or effective customer price exists for the selected model. `503`: a dependency is temporarily unavailable; retry after the `Retry-After` header when it is present. `50302`: a synchronous generation failed upstream and the charge was refunded. Nothing was charged, but send the retry with a **new** `Idempotency-Key`: reusing the original one replays the recorded failure instead of generating again.

## Changes

- **2026-10-20** `fede911a6e9b`: 108 warning
  - added the new `agent_project_budget` enum value to the `allOf[subschema #2]/data/reason` response property for the response status `400`
  - added the new `agent_project_budget` enum value to the `allOf[subschema #2]/data/reason` response property for the response status `401`
  - added the new `agent_project_budget` enum value to the `allOf[subschema #2]/data/reason` response property for the response status `402`
  - added the new `agent_project_budget` enum value to the `allOf[subschema #2]/data/reason` response property for the response status `403`
  - …104 more

[Operation history](https://skmtc.dev/popnow/apis/popnow-api/changes/api/v1/jobs/createTask/post.md)

---

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