Quickstart
One endpoint, no signup, no API key. Send a request and you get quotes back as JSON.
Base URL
https://api.quotia.kewnuai.com.ng/v1/quote
Your first request
curl "https://api.quotia.kewnuai.com.ng/v1/quote?category=inspirational&page_size=10"
const res = await fetch(
'https://api.quotia.kewnuai.com.ng/v1/quote?category=love'
);
const data = await res.json();
console.log(data.quotes);
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
{
"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.
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. |
{
"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.
https://api.quotia.kewnuai.com.ng/mcp
claude mcp add --transport http \
quotia https://api.quotia.kewnuai.com.ng/mcp
{
"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.