RealWorld API Article Response Structure: Complete JSON Format Guide
When querying article endpoints in the RealWorld API, the server returns a JSON object containing an articles array and an articlesCount integer, with each article transformed by the articleMapper function before serialization.
The RealWorld API provides a standardized backend specification for testing frontend implementations. When building clients that consume article data from the gothinkster/realworld repository, understanding the exact RealWorld API article response structure ensures your components parse the JSON correctly across all list and feed endpoints.
Top-Level Response Properties
Every article query endpoint returns a consistent wrapper object with two properties.
The articles Array
The articles property contains an array of article objects matching your query criteria. According to the route handlers in apps/api/server/routes/api/articles/index.get.ts and apps/api/server/routes/api/articles/feed.get.ts, the system packages the transformed data as { articles, articlesCount } before sending the response.
The articlesCount Field
The articlesCount property is an integer representing the total number of articles satisfying the query parameters, ignoring pagination limits. This value enables frontend clients to calculate total pages for pagination controls.
Article Object Schema
Each object inside the articles array follows the structure defined in apps/api/server/utils/article.mapper.ts. The articleMapper utility converts raw database rows into the public API shape.
Core Article Fields
- slug: URL-friendly identifier string (e.g.,
"how-to-code-123") - title: Article title string
- description: Short summary string
- body: Full content string (omitted from list endpoints via
omit: { body: true }) - tagList: Array of strings representing attached tags
- createdAt: ISO-8601 date string of creation timestamp
- updatedAt: ISO-8601 date string of last update timestamp
Engagement and Author Data
- favorited: Boolean indicating if the requesting user has favorited the article (defaults to
falsefor unauthenticated requests) - favoritesCount: Integer count of total users who favorited the article
- author: Object containing
username,image, andfollowedByboolean properties (mapped viaauthor.mapper.ts)
Source Code Implementation
The response structure is assembled in specific route handlers and utility functions within the repository.
Route Handlers
In apps/api/server/routes/api/articles/index.get.ts, the global article list handler executes the query, retrieves both the paginated results and total count, and returns them as a structured object. The personalized feed endpoint in apps/api/server/routes/api/articles/feed.get.ts follows an identical pattern but filters by followed authors.
Data Transformation
The articleMapper function in apps/api/server/utils/article.mapper.ts handles the transformation logic, ensuring consistent field naming and calculating the favorited status based on the requesting user's ID.
Practical Query Examples
The following examples demonstrate how to request and handle the article response structure against the live RealWorld API.
Fetching Global Articles with cURL
curl -s "https://api.realworld.io/api/articles?limit=5&offset=0" \
-H "Accept: application/json"
Expected Response:
{
"articles": [
{
"slug": "how-to-code-123",
"title": "How to code",
"description": "A short guide",
"tagList": ["programming", "tutorial"],
"createdAt": "2024-09-01T12:34:56.789Z",
"updatedAt": "2024-09-02T08:20:10.123Z",
"favorited": false,
"favoritesCount": 3,
"author": {
"username": "johndoe",
"image": "https://api.realworld.io/images/johndoe.jpg",
"followedBy": false
}
}
],
"articlesCount": 42
}
Consuming the API with JavaScript Fetch
async function loadArticles(page = 1, limit = 10) {
const offset = (page - 1) * limit;
const res = await fetch(
`https://api.realworld.io/api/articles?limit=${limit}&offset=${offset}`,
{ headers: { Accept: "application/json" } }
);
const { articles, articlesCount } = await res.json();
console.log(`Total articles: ${articlesCount}`);
return { articles, articlesCount };
}
Authenticated Feed Request
When accessing the personalized feed at GET /api/articles/feed, include an authorization header. The response structure remains identical to the global list, but filters to articles by followed authors:
curl -s "https://api.realworld.io/api/articles/feed?limit=5" \
-H "Authorization: Token <YOUR_JWT>"
Summary
- The RealWorld API article response structure always includes
articles(array) andarticlesCount(integer) at the top level. - Article objects contain metadata fields (
slug,title,description), timestamps, tag arrays, and engagement metrics (favorited,favoritesCount). - The
bodyfield is intentionally omitted from list endpoints to reduce payload size. - The
articleMapperutility inapps/api/server/utils/article.mapper.tsstandardizes the transformation from database records to API responses. - Route handlers in
index.get.tsandfeed.get.tspackage the data consistently across global and personalized feeds.
Frequently Asked Questions
What endpoints return the articles response structure?
The endpoints GET /api/articles, GET /api/articles?author={username}, GET /api/articles?tag={tag}, GET /api/articles?favorited={username}, and GET /api/articles/feed all return the same JSON structure containing the articles array and articlesCount integer.
Why is the article body missing from the response?
The body field is excluded from list responses via the omit: { body: true } configuration in the query options to optimize performance. You must call GET /api/articles/{slug} to retrieve the full article body.
How does the API calculate the favorited field?
The favorited boolean reflects whether the requesting user's ID appears in the article's favorites list. For unauthenticated requests, this value defaults to false as implemented in the articleMapper logic.
What is the default pagination limit for article queries?
The default limit parameter is 10 articles per request, controlled by the route handlers in apps/api/server/routes/api/articles/index.get.ts and feed.get.ts. Use the offset parameter to paginate through results.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →