---
title: "Re-typeset an existing wrap (free, synchronous)"
method: POST
path: "/api/v1/wraps/{wrapId}/render"
tags: ["Wraps"]
---

# Re-typeset an existing wrap (free, synchronous)

`POST /api/v1/wraps/{wrapId}/render`

## Request

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

Re-lays the back-cover text on the artwork this wrap already has and returns fresh assets. No model runs, so it is free and returns 200 directly rather than a job to poll — fixing a typo should not cost a second wrap. Send only the fields you want to change: the stored layout is patched in place, nothing moves, and every field you omit keeps its current text. Send `fontFamily` to set the text in another of the editor's fonts. Send `preset` to lay the text out again with that preset. A wrap whose layout holds text blocks or images the preset does not own (one laid out in the browser wrap editor) is patched instead, and the response carries a `preset_not_applied` warning, because re-running the preset would delete them. Send a full `layoutState` to render a layout edited in the browser wrap editor. `spineColor` and, on a `solid` wrap, `solidColor` are free here too: a solid back panel is a flat fill, so changing its colour needs no model and never costs a second wrap. Works on every wrap of the account, including Amazon KDP and Barnes & Noble designs made in the browser wrap editor: the geometry comes from the wrap's own print setup (a Barnes & Noble spine entered by hand, a dust jacket's flaps).

## Path parameters

- `wrapId` string, uuid, required

## Request body

- object
  - `preset` 'standard' | 'blurb-only' | 'minimal': Lays the text out again with this preset. Omit it to patch the stored layout in place. Not re-run on a layout with text blocks or images the preset does not own: that layout is patched, with a `preset_not_applied` warning. Ignored when `layoutState` is supplied. When it is omitted, only a wrap with no stored layout yet is laid out from scratch, with `standard`.
  - `fontFamily` 'Arimo' | 'Playfair Display' | 'Merriweather' | 'Montserrat' | 'Dancing Script' | 'Roboto Slab' | 'Open Sans' | 'Source Code Pro' | 'Poppins' | 'Cinzel' | 'Cormorant Garamond' | 'Great Vibes' | 'Abril Fatface' | 'Libre Baskerville': Sets the tagline, blurb, author bio and spine lettering in this font and re-fits them. Omitted, the wrap keeps its current font (`fontFamily` on `GET /api/v1/wraps/{wrapId}`). Text blocks the author added in the editor keep their own fonts. Ignored when `layoutState` is supplied: the layout carries its own fonts.
  - `tagline` string: Short hook line, set in bold at the top of the back cover (presets `standard` and `minimal`).
  - `blurb` string: Main back-cover description. Auto-fitted to its band; a warning is returned if it will not fit even at the minimum point size.
  - `authorBio` string: Short author biography, set below the blurb (preset `standard`).
  - `spineTitle` string: Spine lettering. Dropped with a warning when `canHaveSpineText` is false.
  - `spineAuthor` string: Author name on the spine.
  - `spineColor` string: Hex spine colour. Omitted, the wrap's stored colour is kept.
  - `solidColor` string: New hex colour for a solid back cover, e.g. `#1A2B3C`. Free, like the rest of this endpoint — a solid back panel is a flat fill, so repainting it runs no model — and it is persisted, so later renders keep it. Valid only on a wrap created with `designStyle: solid`; on a wrap whose back is AI artwork the colour comes from the art itself and this returns `back_color_requires_solid_style`.
  - `layoutState` object: A complete editor-schema layout (as returned in `layout_state` by GET /api/v1/wraps/{wrapId}). Takes precedence over the text fields and the preset. `imageBlocks` get the browser editor's checks: at most 5 image layers (back cover and spine together), else `too_many_image_layers`; each image path the stored layout does not already carry is moderated, else `content_policy_violation`. An image path outside this account is skipped with an `image_block_not_rendered` warning.

## Response `200`

Re-rendered assets and the layout report.

- WrapRenderResult
  - `wrapId` string, uuid, required
  - `bookId` string, uuid
  - `dims` WrapDimensions: Print geometry at 300 DPI. All inch values are the finished canvas including bleed.
    - `spineWidth` number: Spine width in inches: derived from pageCount and paperType on a KDP wrap, entered by hand on a Barnes & Noble design from the editor.
    - `fullWidth` number: Full wrap width in inches (back + spine + front + bleed).
    - `fullHeight` number: Full wrap height in inches (trim height + bleed).
    - `pixelWidth` integer: fullWidth x dpi, rounded.
    - `pixelHeight` integer: fullHeight x dpi, rounded.
    - `dpi` integer: Always 300.
    - `bleed` number: Bleed in inches per edge (0 for hardcover printed case).
    - `safeTextMargin` number: Minimum inches between text and the trim edge.
    - `minFontSize` number: Smallest point size the layout engine will emit.
    - `canHaveSpineText` boolean: False when the spine is too thin for lettering (under 79 pages on KDP); spine text is dropped with a warning.
    - `barcodeZone` object: Rectangle in inches, relative to the BACK COVER origin, that the printer covers with the barcode. The layout engine keeps text out of it.
      - `x` number
      - `y` number
      - `width` number
      - `height` number
    - `sections` object: Panel boundaries in inches from the left edge of the full wrap.
    - `bindingType` 'paperback' | 'hardcover' | 'dust-jacket': `dust-jacket` (with flaps) appears only on Barnes & Noble designs made in the browser editor.
  - `layout_report` WrapLayoutReport: What the compositor actually drew, after auto-fit and guardrails.
    - `width` integer
    - `height` integer
    - `dpi` integer
    - `blocks` object[]
      - `id` string
      - `fontSize` number: Point size after auto-fit, which may be smaller than requested.
      - `heightPx` integer
      - `overflowsPanel` boolean
    - `warnings` WrapWarning[]
      - `code` 'text_too_long_for_band' | 'text_too_long_for_block' | 'preset_not_applied' | 'text_overflows_panel' | 'clamped_to_safe_area' | 'moved_clear_of_barcode' | 'barcode_zone_unavoidable' | 'font_size_raised_to_minimum' | 'spine_too_thin_for_text' | 'italic_not_available' | 'bold_not_available' | 'image_block_not_rendered' | 'spine_image_not_allowed' | 'front_outpaint_trimmed' | 'front_outpaint_incomplete', required
      - `blockId` string: The text or image block the warning applies to, when it is block-specific.
      - `message` string, required
  - `warnings` WrapWarning[]
    - `code` 'text_too_long_for_band' | 'text_too_long_for_block' | 'preset_not_applied' | 'text_overflows_panel' | 'clamped_to_safe_area' | 'moved_clear_of_barcode' | 'barcode_zone_unavoidable' | 'font_size_raised_to_minimum' | 'spine_too_thin_for_text' | 'italic_not_available' | 'bold_not_available' | 'image_block_not_rendered' | 'spine_image_not_allowed' | 'front_outpaint_trimmed' | 'front_outpaint_incomplete', required
    - `blockId` string: The text or image block the warning applies to, when it is block-specific.
    - `message` string, required
  - `assets` WrapAssets, required: Renditions of one wrap design. Re-signed on every poll/read.
    - `wrap_preview` WrapAsset
      - `signedUrl` string, uri, required
      - `expiresAt` string, date-time, required
    - `wrap_flat` WrapAsset
      - `signedUrl` string, uri, required
      - `expiresAt` string, date-time, required
    - `wrap_pdf` WrapAsset
      - `signedUrl` string, uri, required
      - `expiresAt` string, date-time, required
    - `back_art` WrapAsset
      - `signedUrl` string, uri, required
      - `expiresAt` string, date-time, required

## Other responses

- `400`: `code` is one of: `invalid_preset`, `invalid_font_family`, `invalid_layout`, `invalid_color`, `back_color_requires_solid_style` (`solidColor` on a wrap whose back is AI artwork), `missing_back_art` (the wrap has no artwork yet), `missing_front_cover`, `field_too_long`, `invalid_field_type`, `content_policy_violation` (the text or a new `layoutState` image), `too_many_image_layers` (more than 5 `layoutState.imageBlocks`), 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`) when the wrap's stored print setup does not pass 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 `forbidden_storage_path` (the wrap's stored artwork points at storage this account does not own, or at an unpurchased premade cover).
- `404`: Wrap not found or not owned by this API key's user. `code`: `wrap_not_found`.
- `500`: Unexpected server error. `code`: `internal_error`.

---

[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)
