---
title: "Re-run the front-panel AI extension (free, async)"
method: POST
path: "/api/v1/wraps/{wrapId}/extend-front"
tags: ["Wraps"]
---

# Re-run the front-panel AI extension (free, async)

`POST /api/v1/wraps/{wrapId}/extend-front`

## Request

- Base URL: `https://beyourcover.com`
- URL: `https://beyourcover.com/api/v1/wraps/{wrapId}/extend-front`
- Auth: HTTP bearer

Re-runs the AI outpaint that extends the front cover artwork to the full print panel, then recomposes the wrap with its existing back artwork, layout, and spine. Use it when the extension came back with a seam, a framed-picture look, or an unfilled band (see the `front_outpaint_incomplete` warning on the wrap job). Free — the wrap was already paid for — but it runs an AI chain, so it returns `202` and a job to poll. The equivalent of the wrap editor's "re-extend front" action. Works on Barnes & Noble designs from the editor too: the panel is extended to the wrap's own geometry, a dust jacket's front flap included.

## Path parameters

- `wrapId` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `external_ref` string: Your own reference id, echoed on the job and its webhooks.
  - `webhookUrl` string: Overrides the API key's default webhook URL for this job.

## Response `200`

Idempotent replay: a job already exists for this Idempotency-Key.

- JobReplay: 200 envelope returned when an Idempotency-Key matches an existing job. Unlike the fresh 202, `status` reflects the job's current state and `operation` is always present.
  - `jobId` string, uuid, required
  - `status` 'queued' | 'processing' | 'completed' | 'failed', required: Current status of the previously created job.
  - `operation` 'generate' | 'variation' | 'edit_image' | 'upscale' | 'audiobook_cover' | 'remove_text' | 'generate_reference' | 'wrap' | 'wrap_extend_front', required
  - `credits_reserved` integer: What the ORIGINAL job reserved. Returned by the variations, edit-image, upscale, audiobook-cover, remove-text, wraps and extend-front endpoints when the job recorded it.
  - `included_format` boolean: true when the book's marketing kit paid for the ORIGINAL job instead of credits. Returned by the edit-image, upscale, audiobook-cover, remove-text, wraps and extend-front endpoints.
  - `external_ref` string, nullable, required: The external_ref stored on the ORIGINAL job.
  - `created_at` string, date-time, required
  - `poll_url` string, required

## Other responses

- `202`: Job accepted. Poll `poll_url`; the completed job's `result` is a `WrapJobResult` with fresh assets.
- `400`: `code` is one of: `missing_back_art` (the wrap has no artwork yet), `missing_front_cover` (the cover behind the wrap no longer has an image), `field_too_long`, `invalid_field_type`, or a geometry code (`unsupported_print_provider`, `invalid_trim_size`, `invalid_binding_type`, `invalid_page_count`, `invalid_paper_type`, `invalid_spine_width`, `invalid_flap_width`) if the wrap's stored print setup no longer passes its provider's rules.
- `401`: Missing/malformed API key, unknown or inactive key, or inactive subscription detected during credit checks. `code`: `unauthorized`.
- `403`: `code` is `forbidden` (the key's owner has no active enterprise subscription) or `cover_not_accessible` (the cover behind the wrap is not owned by this account, or is an unpurchased premade cover).
- `404`: Wrap not found or not owned by this API key's user. `code`: `wrap_not_found`.
- `429`: The subscription's concurrent-job limit is reached (jobs with status `queued` or `processing` count). `code`: `concurrency_limit`.
- `500`: Server error. `code` is `job_creation_failed` or `internal_error`. Nothing was charged.

---

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