Books — entry 013 of 22
PoetryDB
Keyless JSON API for a curated collection of roughly 3,000 English-language poems across 129 authors, queryable by author, title, line content, or poem-count/line-count filters, with matching results returned as full structured poem objects. Built and maintained as a free open-source project with no rate limits or usage tiers documented anywhere.
PoetryDB is a keyless JSON API over a curated collection of public-domain English poems, queryable by title, author, line content, or several fields joined together in one path. A live GET this run against `/title/Ozymandias` returned a genuine 871 B record for Percy Bysshe Shelley's sonnet -- the full 14 lines plus author and title, no signup or key of any kind.
GreatAPIs Score
Auth quickstart
- No API key, signup, or credit card required -- a live GET this run against `/title/Ozymandias` returned the complete poem with zero credentials, and the response carried `access-control-allow-origin: *`.
Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.
Look up a poem by its exact title
GEThttps://poetrydb.org/title/Ozymandias
[
{
"title": "Ozymandias",
"author": "Percy Bysshe Shelley",
"lines": [
"I met a traveller from an antique land",
"Who said: Two vast and trunkless legs of stone",
"Stand in the desert...Near them, on the sand,",
"Half sunk, a shattered visage lies, whose frown,",
"And wrinkled lip, and sneer of cold command,",
"Tell that its sculptor well those passions read",
"Which yet survive, stamped on these lifeless things,",
"The hand that mocked them, and the heart that fed:",
"And on the pedestal these words appear:",
"'My name is Ozymandias, king of kings:",
"Look on my works, ye Mighty, and despair!'",
"Nothing beside remains. Round the decay",
"Of that colossal wreck, boundless and bare",
"The lone and level sands stretch far away."
],
"linecount": "14"
}
]A live GET this run against the combined route `/author,title/Poe;Raven` (an author filter joined with an exact title) returned a genuine 7,744 B single-poem array for Edgar Allan Poe's 'The Raven' -- fields are comma-joined in the path, and each field's own value(s) come after it, semicolon-separated in the same order.
Try it
Developer reference
https://poetrydb.org- GET/title/{title}
- GET/author/{author}
- GET/author,title/{author};{title}
Gotchas & limits
- A no-match is real **HTTP 200 with `{"status":404,"reason":"Not found"}`** in the body, not a 4xx -- a live GET this run against `/author/Nobody%20Here` returned exactly that 35-byte body at HTTP 200. Check the payload's own `status` field, not the transport status code, to detect a miss.
- `linecount` is returned as a **quoted string** (`"14"`), not a JSON number -- confirmed live on the Ozymandias record above. Code that does arithmetic on it directly, expecting a number, will silently string-concatenate instead.
- Multi-field queries are comma-joined in the path with each field's value(s) semicolon-joined after it -- a live GET this run against `/author,title/Poe;Raven` returned a genuine 7,744 B single-poem array for 'The Raven', confirming the `field1,field2/value1;value2` pairing follows the same left-to-right order as the fields themselves.
- Every response is a **JSON array**, even for one exact-title match -- confirmed live on `/title/Ozymandias`, which returned a one-element array (`[{...}]`), not a bare object. Code expecting `response.title` directly will get `undefined`.