Books — entry 013 of 22

PoetryDB

Verified Jul 2026

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.

poetryenglish-literaturefull-text-searchopen-source
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score88out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs14/20Documentation URL provided
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 88 on greatapis.com
<a href="https://greatapis.com/api/poetrydb/"><img src="https://greatapis.com/badge/poetrydb.svg" alt="Scored 88 on greatapis.com"></a>

Auth quickstart

  1. 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: *`.
Stored keyNo key stored

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

200 application/json

[
  {
    "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

Base URLhttps://poetrydb.org
Key endpoints
  • 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`.