Overview

I'm In The Book makes personalized keepsake storybooks starring a grandchild and their grandparents. This page documents our public REST API, which exposes the catalog data behind the store: current prices, the illustration styles a book can be drawn in, the story scenes a customer chooses from, and the gift-occasion pages we publish.

The API is read-only and built for programmatic access — scripts, integrations and AI agents alike. Every endpoint is a GET, every response is JSON, and the whole surface is described by a published OpenAPI 3 schema. No personal data, order data or internal identifiers are exposed. Creating and buying a book stays a human web flow at iminthebook.com.

Base URL & Versioning

All endpoints live under:

https://iminthebook.com/api/v1/

The API is versioned in the URL path. The current contract version is 1.0.0, served at /api/v1/.

Deprecation policy

Authentication

None. Version 1 requires no API key, token or signup — it serves public read-only catalog data. Ordering, checkout and anything touching a customer's photos or book remain on the human web flows and are not part of this API.

Endpoints

EndpointWhat it returns
GET /api/v1/status Service name, health indicator, API version and links to the docs, the OpenAPI schema and the website.
GET /api/v1/pricing Current price list: hardcover book, digital book, gift wrap add-on, additional hardcover copy, and multi-book pricing.
GET /api/v1/pricing/quote Itemized quote for one book. Query params: format_type (hardcover or digital) and gift_wrap (true/false).
GET /api/v1/art-styles The six illustration styles a book can be drawn in, with ids and descriptions.
GET /api/v1/scenes The selectable story scenes. Optional category filter: activity, food, funny or sweet.
GET /api/v1/occasions Gift occasions with dedicated landing pages, each with a title, summary and absolute URL.

Example: price quote

curl "https://iminthebook.com/api/v1/pricing/quote?format_type=hardcover&gift_wrap=true"
{
  "currency": "USD",
  "base_price": 74.99,
  "gift_wrap": 7.99,
  "discount": 0.0,
  "total": 82.98
}

Example: art styles

curl https://iminthebook.com/api/v1/art-styles
{
  "count": 6,
  "art_styles": [
    {
      "id": "classic_storybook",
      "name": "Classic Storybook",
      "description": "Warm, traditional illustration with soft lighting and rich colors"
    },
    {
      "id": "dreamy_watercolor",
      "name": "Dreamy Watercolor",
      "description": "Soft, ethereal pastel tones with gentle brushstrokes"
    }
  ]
}

Example: scenes in one category

curl "https://iminthebook.com/api/v1/scenes?category=food"
{
  "count": 9,
  "scenes": [
    {
      "id": "food_ice_cream_square",
      "label": "Ice cream at the town square",
      "category": "food"
    }
  ]
}

Rate Limits

Requests are limited to 60 requests per minute per IP address. Every response under /api/v1/ carries rate limit headers in the RFC RateLimit header fields for HTTP syntax:

RateLimit-Policy: "default";q=60;w=60
RateLimit: "default";r=59;t=42

Exceeding the limit returns 429 Too Many Requests with a Retry-After header (whole seconds to wait) and a JSON body:

HTTP/1.1 429 Too Many Requests
Retry-After: 18
RateLimit-Policy: "default";q=60;w=60
RateLimit: "default";r=0;t=18

{"detail": "Rate limit exceeded. Retry after 18 seconds."}

Please back off until the window resets rather than retrying immediately. If you need a higher limit for a legitimate integration, email us.

Machine-Readable Resources

Public pages also support content negotiation: send Accept: text/markdown to get a Markdown rendering of a page instead of HTML, or append a .md suffix to the path (for example /about.md or /developers.md).

Contact

Questions, bug reports or a request for a higher rate limit: email [email protected]. A human reads every message.

Send Feedback