Lobsters API
Read-only live access to Lobsters newest stories, story details, and comments. Newest listings use Lobsters' 25-story source pages; callers can page through them and carry the returned opaque checkpoint in `checkpoint` to receive each source-page story once. The optional Unix-second `since` filter remains available for coarse time-based polling. Comment offsets are applied to the comments currently present on a fetched story page.
Endpoint health
Loading verification…
Connect your agent
Connect through MCP so your agent can find this API, read its docs, and call its endpoints.
Add the server from your terminal.
claude mcp add --transport http agent-data https://agent-data.motie.dev/mcpIn Claude Code, run /mcp, select agent-data, then Authenticate. Sign in to your agent-data account in the browser.
Then ask your agent to use the Lobsters API for your task.
Call it over HTTP
Get an API keySign up free, generate an API key, and set it as AGENT_DATA_API_KEY in your environment. Your first 100 calls each month are free.
curl --request GET --get 'https://api.agent-data.dev/lobste-rs/v1/stories/newest' \
--header "Authorization: Bearer $AGENT_DATA_API_KEY"Endpoints
Inputs and response fields for every endpoint in this API.
GETNewest stories/v1/stories/newest
Newest Stories
Input
pageOptionalQuery · integer, min: 1, max: 1000, default: 1Lobsters newest source page, starting at 1; page 1000 is the configured maximum.
Example: 1
limitOptionalQuery · integer, min: 1, max: 25, default: 10Maximum returned stories; Lobsters exposes 25 stories per source page.
Example: 5
sinceOptionalQuery · integer | nullOptional strict Unix-second filter; only stories newer than it are returned.
Example: 1790030000
checkpointOptionalQuery · string | nullOpaque checkpoint returned by this route; excludes IDs already returned on a prior poll.
Example: eyJzZWVuIjpbImxpZXk4cSJdfQ
Response
pageintegeritemsobject[]items[].idstringitems[].urlstringitems[].link?string | nullitems[].tagsstring[]items[].text?string | nullitems[].titlestringitems[].authorstringitems[].engagementobjectitems[].engagement.score?integer | nullitems[].engagement.comments?integer | nullitems[].published_atstringlimitintegersourcestringnext_pageinteger | nullfetched_atstringrequest_idstringapplied_sinceinteger | nullnext_checkpointstringFields marked ? are optional.
GETStory details/v1/stories/{story_id}
Story Detail
Input
story_idRequiredPath · stringSix-character Lobsters short story ID from newest-stories.items[].id.
Example: liey8q
Response
itemobjectitem.idstringitem.urlstringitem.link?string | nullitem.tagsstring[]item.text?string | nullitem.titlestringitem.authorstringitem.engagementobjectitem.engagement.score?integer | nullitem.engagement.comments?integer | nullitem.published_atstringsourcestringcommentsobject[]comments[].idstringcomments[].text?string | nullcomments[].authorstringcomments[].story_idstringcomments[].parent_id?string | nullcomments[].created_atstringcomments[].engagementobjectcomments[].engagement.score?integer | nullcomments[].engagement.comments?integer | nullfetched_atstringrequest_idstringFields marked ? are optional.
GETStory comments/v1/stories/{story_id}/comments
Story Comments
Input
story_idRequiredPath · stringSix-character Lobsters short story ID from newest-stories.items[].id.
Example: liey8q
offsetOptionalQuery · integer, min: 0, max: 10000, default: 0Zero-based offset within comments on the current story page.
Example: 0
limitOptionalQuery · integer, min: 1, max: 100, default: 20Maximum comments returned from the current story page.
Example: 2
Response
itemsobject[]items[].idstringitems[].text?string | nullitems[].authorstringitems[].story_idstringitems[].parent_id?string | nullitems[].created_atstringitems[].engagementobjectitems[].engagement.score?integer | nullitems[].engagement.comments?integer | nulllimitintegeroffsetintegersourcestringstory_idstringfetched_atstringrequest_idstringnext_offsetinteger | nullFields marked ? are optional.
Don’t see the endpoint you need?
Ask agent-data to add an endpoint or return more fields. Extensions are free and keep existing endpoints working.
An account is required to submit an extension. Prepare your request, then sign in to build.