KDP Coloring Book Generate API
The Generate API from KDP Coloring Book — 3 operation(s) for generate.
The Generate API from KDP Coloring Book — 3 operation(s) for generate.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/kdpcoloringbook-com:kdpcoloringbook-com-generate-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Book Generator Generate API
description: Backend API for the AI-powered coloring book generator.
version: 1.0.0
tags:
- name: Generate
paths:
/api/generate:
post:
summary: Start Generation
description: 'Start a new book generation job. Free users get one watermarked book of up to
3 pages (FREE_MAX_PAGES_PER_BOOK in credits_service).'
operationId: start_generation_api_generate_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/GenerateRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/StartJobResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
tags:
- Generate
/api/generate/quote:
post:
summary: Quote Generation
description: 'Price a book before creating it. Never blocks the creation: if the balance or
the plan lookup fails, answer with the price the request alone implies and let
POST /api/generate (which re-checks credits and plan limits before spending
anything) be the authority.'
operationId: quote_generation_api_generate_quote_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/GenerationQuoteRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/GenerationQuoteResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
tags:
- Generate
/api/generate/{job_id}/status:
get:
summary: Job Status
operationId: job_status_api_generate__job_id__status_get
security:
- HTTPBearer: []
parameters:
- name: job_id
in: path
required: true
schema:
type: string
title: Job Id
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/JobStatusPayload'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
tags:
- Generate
components:
schemas:
CoverQuoteSummary:
properties:
included:
type: boolean
title: Included
default: true
credits:
type: integer
title: Credits
variant_count:
type: integer
title: Variant Count
default: 1
type: object
required:
- credits
title: CoverQuoteSummary
BookLength:
type: string
enum:
- test
- short
- medium
- long
title: BookLength
ValidationError:
properties:
loc:
items:
anyOf:
- type: string
- type: integer
type: array
title: Location
msg:
type: string
title: Message
type:
type: string
title: Error Type
type: object
required:
- loc
- msg
- type
title: ValidationError
CoverSummary:
properties:
cover_id:
type: string
title: Cover Id
status:
type: string
title: Status
title:
type: string
title: Title
preview_url:
anyOf:
- type: string
- type: 'null'
title: Preview Url
front_url:
anyOf:
- type: string
- type: 'null'
title: Front Url
error_message:
anyOf:
- type: string
- type: 'null'
title: Error Message
generation_elapsed_seconds:
anyOf:
- type: number
- type: 'null'
title: Generation Elapsed Seconds
estimated_generation_seconds:
anyOf:
- type: number
- type: 'null'
title: Estimated Generation Seconds
estimate_sample_count:
type: integer
title: Estimate Sample Count
default: 0
type: object
required:
- cover_id
- status
- title
title: CoverSummary
StartJobResponse:
properties:
job_id:
type: string
title: Job Id
status:
type: string
title: Status
progress:
type: number
maximum: 1.0
minimum: 0.0
title: Progress
theme:
type: string
title: Theme
title:
type: string
title: Title
pages:
type: integer
title: Pages
selected_style:
type: string
title: Selected Style
images:
items:
$ref: '#/components/schemas/ImageStatus'
type: array
title: Images
created_at:
type: string
title: Created At
user_id:
anyOf:
- type: string
- type: 'null'
title: User Id
watermarked:
type: boolean
title: Watermarked
default: false
brand_signature:
anyOf:
- type: string
- type: 'null'
title: Brand Signature
language:
type: string
title: Language
default: en
is_shared:
type: boolean
title: Is Shared
default: false
amazon_url:
anyOf:
- type: string
- type: 'null'
title: Amazon Url
shared_page_slots:
anyOf:
- items:
type: integer
type: array
- type: 'null'
title: Shared Page Slots
cover:
anyOf:
- $ref: '#/components/schemas/CoverSummary'
- type: 'null'
message:
type: string
title: Message
type: object
required:
- job_id
- status
- progress
- theme
- title
- pages
- selected_style
- images
- created_at
- message
title: StartJobResponse
GenerationQuoteRequest:
properties:
theme:
type: string
title: Theme
default: ''
title:
anyOf:
- type: string
- type: 'null'
title: Title
length:
$ref: '#/components/schemas/BookLength'
default: short
pages:
anyOf:
- type: integer
- type: 'null'
title: Pages
style_id:
anyOf:
- type: string
- type: 'null'
title: Style Id
custom_style:
anyOf:
- type: string
- type: 'null'
title: Custom Style
reference_prompt:
anyOf:
- type: string
- type: 'null'
title: Reference Prompt
distribution_type:
type: string
enum:
- progressive
- bold_and_easy
- cute_and_cozy
title: Distribution Type
default: progressive
character_count:
anyOf:
- type: integer
- type: 'null'
title: Character Count
language:
type: string
enum:
- en
- es
- de
- fr
- it
- pt
title: Language
default: en
purpose:
anyOf:
- type: string
enum:
- kdp
- gift
- other
- type: 'null'
title: Purpose
style_description:
anyOf:
- type: string
- type: 'null'
title: Style Description
allow_text:
type: boolean
title: Allow Text
default: false
distribution:
anyOf:
- items:
$ref: '#/components/schemas/DistributionRange'
type: array
- type: 'null'
title: Distribution
user_rules:
anyOf:
- type: string
- type: 'null'
title: User Rules
include_copyright:
type: boolean
title: Include Copyright
default: false
include_tips:
type: boolean
title: Include Tips
default: false
include_review:
type: boolean
title: Include Review
default: false
include_test:
type: boolean
title: Include Test
default: false
type: object
title: GenerationQuoteRequest
description: 'Lenient twin of GenerateRequest, used only to price a book.
The price must never be what stops a creation. POST /api/generate re-validates
everything (moderation, plan limits, credits) before spending a single credit,
so POST /api/generate/quote prices whatever the planner produced instead of
answering 422 — a 422 the UI could only show as "Could not calculate the final
price, try again", with the Create button stuck on its loading state forever.
The price depends on ``pages`` and the front-matter flags alone, so every text
field here drops its length bounds and the page count is clamped into the
range /api/generate accepts rather than rejected.'
JobStatusPayload:
properties:
job_id:
type: string
title: Job Id
status:
type: string
title: Status
progress:
type: number
maximum: 1.0
minimum: 0.0
title: Progress
theme:
type: string
title: Theme
title:
type: string
title: Title
pages:
type: integer
title: Pages
selected_style:
type: string
title: Selected Style
images:
items:
$ref: '#/components/schemas/ImageStatus'
type: array
title: Images
created_at:
type: string
title: Created At
user_id:
anyOf:
- type: string
- type: 'null'
title: User Id
watermarked:
type: boolean
title: Watermarked
default: false
brand_signature:
anyOf:
- type: string
- type: 'null'
title: Brand Signature
language:
type: string
title: Language
default: en
is_shared:
type: boolean
title: Is Shared
default: false
amazon_url:
anyOf:
- type: string
- type: 'null'
title: Amazon Url
shared_page_slots:
anyOf:
- items:
type: integer
type: array
- type: 'null'
title: Shared Page Slots
cover:
anyOf:
- $ref: '#/components/schemas/CoverSummary'
- type: 'null'
type: object
required:
- job_id
- status
- progress
- theme
- title
- pages
- selected_style
- images
- created_at
title: JobStatusPayload
GenerateRequest:
properties:
theme:
type: string
maxLength: 200
minLength: 1
title: Theme
title:
anyOf:
- type: string
maxLength: 120
minLength: 1
- type: 'null'
title: Title
length:
$ref: '#/components/schemas/BookLength'
pages:
anyOf:
- type: integer
maximum: 60.0
minimum: 3.0
- type: 'null'
title: Pages
style_id:
anyOf:
- type: string
- type: 'null'
title: Style Id
custom_style:
anyOf:
- type: string
maxLength: 2000
minLength: 3
- type: 'null'
title: Custom Style
reference_prompt:
anyOf:
- type: string
maxLength: 2000
- type: 'null'
title: Reference Prompt
distribution_type:
type: string
enum:
- progressive
- bold_and_easy
- cute_and_cozy
title: Distribution Type
default: progressive
character_count:
anyOf:
- type: integer
maximum: 4.0
minimum: 0.0
- type: 'null'
title: Character Count
language:
type: string
enum:
- en
- es
- de
- fr
- it
- pt
title: Language
default: en
purpose:
anyOf:
- type: string
enum:
- kdp
- gift
- other
- type: 'null'
title: Purpose
style_description:
anyOf:
- type: string
maxLength: 4000
- type: 'null'
title: Style Description
allow_text:
type: boolean
title: Allow Text
default: false
distribution:
anyOf:
- items:
$ref: '#/components/schemas/DistributionRange'
type: array
- type: 'null'
title: Distribution
user_rules:
anyOf:
- type: string
maxLength: 1000
- type: 'null'
title: User Rules
include_copyright:
type: boolean
title: Include Copyright
default: false
include_tips:
type: boolean
title: Include Tips
default: false
include_review:
type: boolean
title: Include Review
default: false
include_test:
type: boolean
title: Include Test
default: false
type: object
required:
- theme
- length
title: GenerateRequest
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
GenerationQuoteResponse:
properties:
title:
type: string
title: Title
pages:
type: integer
title: Pages
frontmatter_pages:
type: integer
title: Frontmatter Pages
cover_credits:
type: integer
title: Cover Credits
cover:
$ref: '#/components/schemas/CoverQuoteSummary'
required_credits:
type: integer
title: Required Credits
credits_to_charge:
type: integer
title: Credits To Charge
available_credits:
type: integer
title: Available Credits
is_free:
type: boolean
title: Is Free
can_create:
type: boolean
title: Can Create
blocker_code:
anyOf:
- type: string
- type: 'null'
title: Blocker Code
blocker_message:
anyOf:
- type: string
- type: 'null'
title: Blocker Message
type: object
required:
- title
- pages
- frontmatter_pages
- cover_credits
- cover
- required_credits
- credits_to_charge
- available_credits
- is_free
- can_create
title: GenerationQuoteResponse
DistributionRange:
properties:
start_page:
type: integer
minimum: 1.0
title: Start Page
end_page:
type: integer
minimum: 1.0
title: End Page
theme:
type: string
maxLength: 120
minLength: 1
title: Theme
description:
anyOf:
- type: string
maxLength: 600
- type: 'null'
title: Description
type: object
required:
- start_page
- end_page
- theme
title: DistributionRange
description: 'One contiguous section of the book''s page plan.
Shared contract with the frontend: ranges are contiguous and cover pages
``1..config.pages`` exactly. ``theme`` is a short user-facing label (in the
user''s language); ``description`` is an optional English brief that is fed
to the page-prompt generator.'
ImageStatus:
properties:
slot:
type: integer
title: Slot
status:
type: string
title: Status
prompt:
anyOf:
- type: string
- type: 'null'
title: Prompt
simple_prompt:
anyOf:
- type: string
- type: 'null'
title: Simple Prompt
simple_prompt_es:
anyOf:
- type: string
- type: 'null'
title: Simple Prompt Es
url:
anyOf:
- type: string
- type: 'null'
title: Url
creative_brief:
anyOf:
- type: string
- type: 'null'
title: Creative Brief
simple_creative_brief:
anyOf:
- type: string
- type: 'null'
title: Simple Creative Brief
simple_creative_brief_es:
anyOf:
- type: string
- type: 'null'
title: Simple Creative Brief Es
bw_image_path:
anyOf:
- type: string
- type: 'null'
title: Bw Image Path
error:
anyOf:
- type: string
- type: 'null'
title: Error
retries:
type: integer
title: Retries
default: 0
bw_image_prompt:
anyOf:
- type: string
- type: 'null'
title: Bw Image Prompt
bw_image_model:
anyOf:
- type: string
- type: 'null'
title: Bw Image Model
completed_at:
anyOf:
- type: string
- type: 'null'
title: Completed At
framed:
type: boolean
title: Framed
default: false
page_type:
type: string
title: Page Type
default: coloring
type: object
required:
- slot
- status
title: ImageStatus
securitySchemes:
HTTPBearer:
type: http
scheme: bearer