Quickstart

One endpoint, no signup, no API key. Send a request and you get quotes back as JSON.

Base URL

endpoint
https://api.quotia.kewnuai.com.ng/v1/quote

Your first request

bash
curl "https://api.quotia.kewnuai.com.ng/v1/quote?category=inspirational&page_size=10"
javascript
const res = await fetch(
  'https://api.quotia.kewnuai.com.ng/v1/quote?category=love'
);
const data = await res.json();

console.log(data.quotes);
python
import requests

res = requests.get(
    'https://api.quotia.kewnuai.com.ng/v1/quote',
    params={'category': 'love'},
)
print(res.json()['quotes'])

Query parameters

Parameter Type Default Description
category string Filter by tag, e.g. love, inspirational, humor. Omit for a mix.
page integer 1 1-based page number. Minimum 1.
page_size integer 10 Quotes per page, from 1 to 100.

Response

json
{
  "quotes": [
    {
      "text": "The world as we have created it is a process of our thinking.",
      "author": "Albert Einstein",
      "source": "toscrape",
      "tags": ["change", "deep-thoughts", "thinking", "world"]
    }
  ],
  "category": "inspirational",
  "page": 1,
  "page_size": 10,
  "total": 40,
  "total_pages": 4,
  "has_next": true,
  "has_previous": false
}

Every quote carries text, author, source and tags. Use has_next to know when to stop paging. Results are collected live, so total reflects what was retrieved for that request rather than a fixed catalogue size.

Errors

422

A parameter failed validation — page=0, or a page_size above 100. The body lists what was rejected.

500

The request failed unexpectedly. Paging past the last page is not an error — you get an empty quotes array instead.

Crossword puzzles

/v1/crossword returns a complete puzzle: a blank grid, the solution, and numbered across/down clues with their grid coordinates. Words interlock criss-cross style. Puzzles are built from a word bank bundled with the API, so the endpoint makes no upstream request and answers in milliseconds.

bash
curl "https://api.quotia.kewnuai.com.ng/v1/crossword?category=animals&size=11"
Parameter Type Default Description
category string One of animals, food, geography, music, science, sports. Omit to mix all.
size integer 11 Grid width and height, 7 to 21.
word_count integer ~size How many words to aim for, 4 to 40.
seed integer random Reuse a seed to regenerate that exact puzzle.
json
{
  "category": "animals",
  "size": 11,
  "seed": 4242,
  "word_count": 11,
  "puzzle":   [["#","#","","#", "..."], "..."],
  "solution": [["#","#","M","#", "..."], "..."],
  "across": [
    { "number": 4, "clue": "Flightless bird in a tuxedo",
      "answer": "PENGUIN", "row": 3, "col": 1, "length": 7 }
  ],
  "down": [
    { "number": 1, "clue": "Tunnel digger",
      "answer": "MOLE", "row": 0, "col": 2, "length": 4 }
  ]
}

In both grids "#" is a blank cell. In puzzle an empty string is a square the player fills in; solution holds the letters. Render puzzle and keep solution on your side. seed makes generation reproducible — store it and you can serve the same grid to everyone, or rebuild a puzzle you have already scored.

Connect an AI agent (MCP)

Quotia runs a Model Context Protocol server over streamable HTTP, so an agent can call it directly instead of you writing a wrapper. Same data as the REST endpoint, exposed as typed tools. No API key, no separate signup.

endpoint
https://api.quotia.kewnuai.com.ng/mcp
claude code
claude mcp add --transport http \
  quotia https://api.quotia.kewnuai.com.ng/mcp
json config
{
  "mcpServers": {
    "quotia": {
      "type": "http",
      "url": "https://api.quotia.kewnuai.com.ng/mcp"
    }
  }
}

Tools

Tool Arguments Returns
search_quotes category, page, page_size A page of quotes plus total, total_pages and has_next.
random_quote category One quote with text, author, source, tags.
list_categories Quote category values known to return results.
generate_crossword category, size, word_count, seed A full puzzle: grid, solution and numbered clues.
list_crossword_categories Categories the crossword generator can theme on.

Every tool advertises a full output schema, so the agent knows the shape of a result before it calls — it does not have to parse prose or guess field names.

Go deeper