Poetry Foundation APIpoetryfoundation.org ↗
Retrieve the Poetry Foundation's Poem of the Day — full text, author details, editor's note, epigraph, and recent daily selections — via a single API endpoint.
What is the Poetry Foundation API?
The Poetry Foundation API exposes 1 endpoint, get_poem_of_the_day, returning 10 structured fields for the current daily featured poem: full plain-text body, HTML markup, title, authors with page URLs, epigraph, editor's note, and a reverse-chronological list of recent daily selections. It covers everything displayed on the Poem of the Day feature without requiring you to parse the site yourself.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/9bf59c1c-1ae4-4270-a0cf-fb22baadd6ab/get_poem_of_the_day' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace poetryfoundation-org-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Poetry Foundation Poem of the Day — fetch today's poem and browse recent selections."""
from parse_apis.poetryfoundation_org_api import PoetryFoundation, ParseError
client = PoetryFoundation()
# Fetch today's featured poem.
try:
poem = client.poems.today()
except ParseError as e:
print(f"Could not fetch poem of the day: {e.code}")
raise
print(f"{poem.title} by {', '.join(a.name for a in poem.authors)}")
print(poem.text[:200])
# Show editor's note when the editors supplied one.
if poem.editors_note is not None:
print(f"Editor's note: {poem.editors_note}")
# Browse the five most recent previous selections.
for recent in poem.recent_poems[:5]:
authors = ", ".join(a.name for a in recent.authors)
print(f" {recent.date} — {recent.title} ({authors})")
print("exercised: poems.today (with ParseError handling)")
Returns today's featured Poem of the Day as one object: the selection date (US Central calendar day), the editor's note when the editors supplied one (null otherwise), the poem title, its numeric poem_id and page URL, authors and translators (each with name, slug and poet page URL), the epigraph when present (null otherwise), the full poem as plain text (lines separated by newlines, stanzas by a blank line) and as the site's original HTML, and source-publication title/publisher/year and copyright credit when the site records them (null otherwise). recent_poems lists the ~20 previous daily selections (newest first) with date, title, poem_id, poem_url and authors, without poem text. One round trip; takes no parameters; never empty while the site publishes a daily poem.
No input parameters required.
{
"type": "object",
"fields": {
"date": "ISO date (YYYY-MM-DD) the poem was featured",
"text": "full poem as plain text; line breaks preserved, stanzas separated by a blank line",
"title": "poem title",
"authors": "array of {name, slug, url} for the poem's authors",
"poem_id": "numeric poem identifier as a string, taken from the poem's page URL",
"epigraph": "plain-text epigraph, or null",
"poem_url": "poem page URL on the site",
"body_html": "the poem body as the site's HTML",
"editors_note": "plain-text editor's note, or null when none",
"recent_poems": "array of previous daily selections, newest first, each {date, title, poem_id, poem_url, authors}",
"translated_by": "array of {name, slug, url} translators; empty when the poem is not a translation",
"copyright_credit": "plain-text copyright/permission credit, or null",
"source_publication_year": "publication year as a number, or null",
"source_publication_title": "title of the book/magazine the poem is credited to, or null",
"source_publication_publisher": "publisher name, or null"
},
"sample": {
"data": {
"date": "2026-09-10",
"text": "The light passes\nfrom ridge to ridge,\nfrom flower to flower—\nthe hepaticas, wide-spread\nunder the light\ngrow faint—\nthe petals reach inward,\nthe blue tips bend\ntoward the bluer heart\nand the flowers are lost.\n\nThe cornel-buds are still white,\nbut shadows dart\nfrom the cornel-roots—\nblack creeps from root to root,\neach leaf\ncuts another leaf on the grass,\nshadow seeks shadow,\nthen both leaf\nand leaf-shadow are lost.",
"title": "Evening",
"authors": [
{
"url": "https://www.poetryfoundation.org/poets/h-d",
"name": "H.D.",
"slug": "h-d"
}
],
"poem_id": "229690",
"epigraph": null,
"poem_url": "https://www.poetryfoundation.org/poems/51856/evening-56d22fe15dc07",
"body_html": "<p>The light passes <br>from ridge to ridge, <br>from flower to flower— <br>the hepaticas, wide-spread <br>under the light <br>grow faint— <br>the petals reach inward, <br>the blue tips bend <br>toward the bluer heart <br>and the flowers are lost. <br> <br>The cornel-buds are still white, <br>but shadows dart <br>from the cornel-roots— <br>black creeps from root to root, <br>each leaf <br>cuts another leaf on the grass, <br>shadow seeks shadow, <br>then both leaf <br>and leaf-shadow are lost.</p>",
"editors_note": "The poet H.D. was born on this day in 1886.",
"recent_poems": [
{
"date": "2026-09-09",
"title": "The Other Foot",
"authors": [
{
"url": "https://www.poetryfoundation.org/poets/chip-livingston",
"name": "Chip Livingston",
"slug": "chip-livingston"
}
],
"poem_id": "1815025",
"poem_url": "https://www.poetryfoundation.org/poetrymagazine/poems/1815025/the-other-foot"
}
],
"translated_by": [],
"copyright_credit": "H.D., \"Evening\" from The Collected Poems of H.D. (New York: Boni and Liveright, 1925). Public domain.",
"source_publication_year": 1925,
"source_publication_title": "Collected Poems of H.D.",
"source_publication_publisher": "Boni and Liveright"
},
"status": "success"
}
}About the Poetry Foundation API
What the API returns
The single get_poem_of_the_day endpoint returns today's featured poem as a structured object keyed to the US Central calendar day. The text field delivers the full poem as plain text with line breaks preserved and stanzas separated by blank lines. If you need to render the poem with the site's original formatting, body_html provides the poem body as HTML. The title, poem_id, and poem_url fields let you reference or link back to the canonical poem page.
Author and editorial metadata
The authors array contains one or more objects, each with name, slug, and url pointing to that poet's page on the Poetry Foundation site. This covers both authors and translators where credited. The editors_note field returns a plain-text annotation from the editorial team when one was written, and is null when none exists. Similarly, epigraph returns the poem's epigraph as plain text or null.
Recent poems list
Beyond today's selection, the response includes a recent_poems array of previous daily picks, ordered newest first. Each entry in that array carries date (ISO format), title, poem_id, poem_url, and an authors array matching the structure of the top-level authors field. This gives you a running historical record of daily selections in a single call — no additional requests needed.
Date handling
The date field reflects the US Central time zone calendar day, which is the same timezone the Poetry Foundation uses to advance the daily selection. Applications that display the poem in other timezones should account for this when determining whether the current day's poem has changed.
The Poetry Foundation API is a managed, monitored endpoint for poetryfoundation.org — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when poetryfoundation.org changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official poetryfoundation.org API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Display a daily poem widget on a blog or newsletter, pulling
title,text, andauthorsfrom the response. - Build a poetry archive by persisting
recent_poemsentries over time, accumulating poem metadata day by day. - Render formatted poem pages using
body_htmlwhen preserving the original line and stanza layout matters. - Show editorial context alongside a poem by surfacing
editors_notewhen it is non-null. - Link readers to a poet's full catalog by constructing author profile links from the
slugandurlfields inauthors. - Track how often specific poets are featured as Poem of the Day by aggregating the
authorsfield acrossrecent_poems. - Populate a reading app with daily content, using
epigraphto display introductory text when present.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the Poetry Foundation offer an official developer API?+
What does the `recent_poems` array actually include?+
recent_poems contains the feature date, poem title, numeric poem_id, poem_url, and an authors array with name, slug, and URL for each credited author. It does not include the full poem text or editor's note for past entries — only today's top-level response includes those fields.Is the poem text returned with its original formatting?+
text field preserves line breaks and uses blank lines to separate stanzas, reflecting the poem's structure as plain text. The body_html field returns the site's HTML markup for cases where you need finer rendering control.Can I retrieve a specific past poem by date or poem ID?+
poem_id as a parameter to fetch a historical poem's full text. You can fork this API on Parse and revise it to add a parameterized historical poem endpoint.