KDP Coloring Book Plan API
The Plan API from KDP Coloring Book — 3 operation(s) for plan.
The Plan API from KDP Coloring Book — 3 operation(s) for plan.
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-plan-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 Plan API
description: Backend API for the AI-powered coloring book generator.
version: 1.0.0
tags:
- name: Plan
paths:
/api/plan/chat:
post:
summary: Plan Chat
description: 'Drive the guided planning conversation. Stateless: the FE replays the full
transcript each turn. Text only — no credits are charged here.'
operationId: plan_chat_api_plan_chat_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PlanChatRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/PlannerTurn'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
tags:
- Plan
/api/plan/title-suggestions:
post:
summary: Plan Title Suggestions
description: Suggest cover titles before the book and its automatic cover exist.
operationId: plan_title_suggestions_api_plan_title_suggestions_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/TitleSuggestionsRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/CoverTitleSuggestionsResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
tags:
- Plan
/api/plan/style-previews:
post:
summary: Plan Style Previews
description: 'Render the one shared scene in each invented style so the user can pick a look.
Free users get one lifetime rendered preview (their first pick); past that
they fall back to choosing from the text descriptions, and asking for more
rendered styles raises the subscriber gate. Subscribers preview every
requested style at one ``style_suggest`` credit each.'
operationId: plan_style_previews_api_plan_style_previews_post
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/StylePreviewRequest'
required: true
responses:
'200':
description: Successful Response
content:
application/json:
schema:
$ref: '#/components/schemas/StylePreviewResponse'
'422':
description: Validation Error
content:
application/json:
schema:
$ref: '#/components/schemas/HTTPValidationError'
security:
- HTTPBearer: []
tags:
- Plan
components:
schemas:
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
TitleSuggestionsRequest:
properties:
theme:
type: string
maxLength: 200
minLength: 1
title: Theme
language:
type: string
enum:
- en
- es
- de
- fr
- it
- pt
title: Language
default: en
count:
type: integer
maximum: 8.0
minimum: 1.0
title: Count
default: 4
type: object
required:
- theme
title: TitleSuggestionsRequest
StylePreview:
properties:
key:
type: string
title: Key
name:
type: string
title: Name
description:
type: string
title: Description
url:
type: string
title: Url
name_local:
anyOf:
- type: string
- type: 'null'
title: Name Local
description_local:
anyOf:
- type: string
- type: 'null'
title: Description Local
type: object
required:
- key
- name
- description
- url
title: StylePreview
BookPlanConfig:
properties:
theme:
type: string
maxLength: 200
minLength: 1
title: Theme
length:
$ref: '#/components/schemas/BookLength'
default: short
pages:
type: integer
maximum: 60.0
minimum: 3.0
title: Pages
default: 25
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
style_id:
anyOf:
- type: string
- type: 'null'
title: Style Id
style_description:
anyOf:
- type: string
maxLength: 4000
- type: 'null'
title: Style Description
allow_text:
type: boolean
title: Allow Text
default: false
user_rules:
anyOf:
- type: string
maxLength: 1000
- type: 'null'
title: User Rules
type: object
required:
- theme
title: BookPlanConfig
description: 'The book the agent proposes — a superset compatible with GenerateRequest.
On approval the FE forwards this straight to POST /api/generate. ``pages`` is
the authoritative page count (the user picks it explicitly); ``length`` is only
a coarse label (the nearest LENGTH bucket) and is not used to derive pages.'
PlannerMessage:
properties:
role:
type: string
enum:
- user
- assistant
title: Role
content:
type: string
maxLength: 4000
title: Content
type: object
required:
- role
- content
title: PlannerMessage
description: 'One turn of the planning conversation. Sent by the FE on every request
(the chat is stateless on the backend — see /api/plan/chat).'
CoverTitleSuggestionsResponse:
properties:
titles:
items:
type: string
type: array
title: Titles
type: object
required:
- titles
title: CoverTitleSuggestionsResponse
PlannerTurn:
properties:
kind:
type: string
enum:
- question
- plan
title: Kind
message:
type: string
maxLength: 2000
title: Message
options:
items:
$ref: '#/components/schemas/PlannerOption'
type: array
title: Options
multi_select:
type: boolean
title: Multi Select
default: false
allow_free_text:
type: boolean
title: Allow Free Text
default: true
collected:
anyOf:
- additionalProperties:
type: string
type: object
- type: 'null'
title: Collected
summary:
anyOf:
- items:
type: string
type: array
- type: 'null'
title: Summary
config:
anyOf:
- $ref: '#/components/schemas/BookPlanConfig'
- type: 'null'
style_candidates:
anyOf:
- items:
$ref: '#/components/schemas/StyleCandidate'
type: array
- type: 'null'
title: Style Candidates
sample_scene:
anyOf:
- type: string
- type: 'null'
title: Sample Scene
distribution:
anyOf:
- items:
$ref: '#/components/schemas/DistributionRange'
type: array
- type: 'null'
title: Distribution
handled_requests:
items:
type: string
type: array
title: Handled Requests
help_topic:
anyOf:
- type: string
- type: 'null'
title: Help Topic
type: object
required:
- kind
- message
title: PlannerTurn
description: "One assistant turn. ``kind`` discriminates the shape:\n\n- ``question``: render ``message`` + ``options`` (chips) and/or a free-text box.\n- ``plan``: render ``message`` + ``summary`` bullets + the 3 invented\n ``style_candidates`` (rendered against one shared ``sample_scene`` so the user\n can compare looks and pick one), plus Approve / give-feedback CTAs (``config``\n is hidden state)."
PlannerOption:
properties:
label:
type: string
title: Label
value:
type: string
title: Value
emoji:
anyOf:
- type: string
- type: 'null'
title: Emoji
type: object
required:
- label
- value
title: PlannerOption
description: A selectable chip for a multiple-choice question turn.
PlanChatRequest:
properties:
messages:
items:
$ref: '#/components/schemas/PlannerMessage'
type: array
maxItems: 60
minItems: 1
title: Messages
language:
anyOf:
- type: string
enum:
- en
- es
- de
- fr
- it
- pt
- type: 'null'
title: Language
chat_language:
anyOf:
- type: string
maxLength: 35
- type: 'null'
title: Chat Language
purpose:
anyOf:
- type: string
enum:
- kdp
- gift
- other
- type: 'null'
title: Purpose
type: object
required:
- messages
title: PlanChatRequest
HTTPValidationError:
properties:
detail:
items:
$ref: '#/components/schemas/ValidationError'
type: array
title: Detail
type: object
title: HTTPValidationError
StylePreviewRequest:
properties:
theme:
type: string
maxLength: 200
minLength: 1
title: Theme
sample_scene:
type: string
maxLength: 600
minLength: 1
title: Sample Scene
styles:
items:
$ref: '#/components/schemas/StyleCandidate'
type: array
maxItems: 3
minItems: 1
title: Styles
allow_text:
type: boolean
title: Allow Text
default: false
user_rules:
anyOf:
- type: string
maxLength: 1000
- type: 'null'
title: User Rules
type: object
required:
- theme
- sample_scene
- styles
title: StylePreviewRequest
StyleCandidate:
properties:
key:
anyOf:
- type: string
- type: 'null'
title: Key
name:
type: string
maxLength: 120
minLength: 1
title: Name
description:
type: string
maxLength: 2000
minLength: 1
title: Description
name_local:
anyOf:
- type: string
maxLength: 120
- type: 'null'
title: Name Local
description_local:
anyOf:
- type: string
maxLength: 2000
- type: 'null'
title: Description Local
type: object
required:
- name
- description
title: StyleCandidate
description: 'An AI-invented visual style for a planned book.
The planner model proposes these on a plan turn; it omits ``key`` and the
server slugifies ``name`` into a unique, stable key (see book_planner).
``name``/``description`` stay in technical English (they feed the image
model); ``name_local``/``description_local`` carry the same text translated
to the user''s chat language for display only.'
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.'
StylePreviewResponse:
properties:
previews:
items:
$ref: '#/components/schemas/StylePreview'
type: array
title: Previews
type: object
required:
- previews
title: StylePreviewResponse
securitySchemes:
HTTPBearer:
type: http
scheme: bearer