# info.description
The existing unauthenticated, read-only static JSON contract used by the Spreuke Android companion reader. It has no write operations, user state, authentication, commerce, MCP, or health service.

# paths./api/v1/catalog.json.get.summary
Get the complete reading catalog and daily rotation order

# paths./api/v1/books/{slug}.json.get.summary
Get one book, its chapters, and its Spark index

# paths./api/v1/books/{slug}.json.get.responses.404.description
No published resource matches the permanent slug or number

# paths./api/v1/books/{slug}/chapters/{number}.json.get.responses.404.description
No published resource matches the permanent slug or number

# paths./api/v1/sparks/{slug}.json.get.summary
Get one Spark, walk-through, provenance, and share image

# paths./api/v1/sparks/{slug}.json.get.responses.404.description
No published resource matches the permanent slug or number

# paths./api/v1/blog/{slug}.json.get.responses.404.description
No published resource matches the permanent slug or number

# paths./api/v1/country.get.summary
Echo Cloudflare's raw request country code

# paths./api/v1/country.get.description
Returns request.cf.country raw, with no validation, storage, cookies, or application logging. A missing signal returns an empty 200 response (server fail-open). Callers must treat errors, an empty response, Tor (T1), and unknown codes as ad-fenced (caller fail-closed).

# paths./api/v1/country.get.responses.200.description
Raw country echo; empty when Cloudflare supplies no country