Arlmy APIz.arlmy.me ↗
Read the 素生 personal blog by arlmy via API. Browse posts, filter by category or tag, fetch full content, and access the author's NOW page and thinking archive.
What is the Arlmy API?
This API exposes 6 endpoints covering the full content of 素生, the personal blog at z.arlmy.me by author arlmy. Use list_posts to page through the post stream with titles, dates, and excerpts, get_post to retrieve full post bodies including HTML, plain text, word count, and changelog entries, or get_now to read the author's current NOW page split into headed sections.
curl -X GET 'https://api.parse.bot/scraper/0a744b93-7817-420a-accc-b8d102fa30b7/list_posts' \ -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 z-arlmy-me-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: 素生 blog SDK — browse posts, drill into details, explore by tag."""
from parse_apis.z_arlmy_me_api import ZArlmy, InputNotFound
client = ZArlmy()
# Browse the newest posts in the blog stream.
for summary in client.post_summaries.list(limit=5):
print(summary.title, summary.date, summary.excerpt)
# Drill down: take the first post summary and fetch full details.
summary = client.post_summaries.list(limit=1).first()
if summary is not None:
post = summary.details()
print(post.title, post.category, post.word_count, "words")
if post.next_post is not None:
print("Next →", post.next_post.title)
# Discover tags, then list posts under the first tag found.
tag = client.tags.list(limit=1).first()
if tag is not None:
for tagged_post in tag.posts(limit=3):
print(tag.name, "—", tagged_post.title, tagged_post.date)
# Point lookup using an id discovered earlier.
if summary is not None:
try:
detail = client.posts.get(post_id=summary.post_id)
print(detail.title, detail.reading_minutes, "min read")
except InputNotFound:
print("Post no longer exists")
print("exercised: post_summaries.list / details / tags.list / tag.posts / posts.get")
Returns one page of the blog's post stream, newest first, as the site's BLOG listing shows it: 20 posts per page with title, publish date, the one-line excerpt and post_id. The optional page input selects the page (omitted = first page); total_pages and has_more come from the site's own paginator. Requesting a page beyond total_pages returns a not-found input error. One request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number of the post stream. |
{
"type": "object",
"fields": {
"page": "integer, the page returned",
"posts": "array of post summaries: post_id (path key for get_post), title, date (YYYY-MM-DD), excerpt (one-line teaser), url",
"has_more": "boolean, whether a next page exists",
"total_pages": "integer, number of pages in the stream per the site's paginator"
},
"sample": {
"data": {
"page": 2,
"posts": [
{
"url": "https://z.arlmy.me/posts/TILs/thoughts/20260727_Recently/",
"date": "2026-08-20",
"title": "最近惦念 20260727",
"excerpt": "多用“似乎是的”,虚化掉一切试试看。",
"post_id": "TILs/thoughts/20260727_Recently"
}
],
"has_more": true,
"total_pages": 71
},
"status": "success"
}
}About the Arlmy API
Post Browsing and Filtering
The list_posts endpoint returns 20-post pages of the blog stream, newest first. Each item includes post_id, title, date (YYYY-MM-DD), excerpt, and url. The page parameter selects which page to retrieve; total_pages and has_more in the response tell you how far the stream extends. To filter by subject, list_posts_by_label accepts a name and a kind (category or tag) and returns every matching post in a single unpaginated response. Exact label names — required by list_posts_by_label — come from list_labels, which also returns per-category post_count values.
Full Post Content
get_post takes a post_id (the path segment emitted by list_posts or list_posts_by_label) and returns the complete post: title, date, updated (null when absent), category, tags array, word_count, changelog array, full html body, plain-text body, next_post neighbour reference, and canonical url. The changelog field is an empty array when the post carries no revision history.
Author Pages: NOW and Thinking Archive
get_now returns the author's NOW page as an array of sections, each with heading, items (plain-text bullets or paragraphs), and raw html. get_thinking_archive returns every dated entry in the Thinking archive, newest first, with each entry carrying a date and an items array of plain-text bullets. Nested sub-bullets are flattened into their parent with newlines. Both endpoints require no inputs and return everything in one response.
The Arlmy API is a managed, monitored endpoint for z.arlmy.me — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when z.arlmy.me 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 z.arlmy.me 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?+
- Build a read-later client that fetches full post HTML via get_post for offline reading
- Aggregate the thinking archive entries from get_thinking_archive into a searchable timeline
- Render a tag or category index page using list_labels counts and list_posts_by_label post lists
- Track when posts are revised by monitoring the updated field and changelog array returned by get_post
- Display the author's current focus areas by parsing the sections array from get_now
- Sync new posts into a personal knowledge base by polling list_posts and checking has_more
- Generate a reading-time report across all posts by collecting word_count values from get_post
| 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.