User-related API environment
Production user-related API docs
These pages describe the Production user-related API stack.
Use production OAuth credentials, production API base URLs, and production app URLs when following this documentation.
Need to test before going live? Switch to the Pre-live docs using the environment switcher above.
Get posts feed
Retrieve a paginated feed of client-visible Quran Reflect posts, including reflections and lessons. Re-reflections are excluded from client post-type filters. Supports filtering by authors, tags, Quran references, groups, pages, and configured client-visible post type IDs. For example, use tab=qdc&languages=2&filter[postTypeIds]=1 to retrieve English QDC reflections. Response items include engagement metadata such as likesCount, commentsCount, and recentComment when available. Use the dedicated comment endpoints to retrieve comment objects and totals. For ayah-by-ayah reads, use filter[references][0][chapterId], filter[references][0][from], and filter[references][0][to].
Query Parameters
Possible values: [latest, popular]
Default value: latest
Sort QDC feed results after language priority and Quran-reference match relevance. latest then orders by publishedAt descending. popular then orders by likesCount descending, followed by publishedAt descending. Both modes use id descending as the final tie-breaker. Use with tab=qdc, which returns promoted and moderator-reviewed content.
Possible values: [newest, latest, qdc, following, draft, favorite, most_popular, only_room_members, public, feed, trending, popular]
Feed tab type. Common tabs include feed for personalized content, trending for explore, following for posts from followed users, and qdc for promoted and moderator-reviewed posts; see the enum for all supported values. On tabs other than qdc, languages prioritizes selected languages but does not exclude other languages. With qdc, language selection limits the allowed languages; non-English selections include English as a fallback.
Comma-separated Quran Reflect language IDs: Arabic 1, English 2, Spanish 3, Bahasa Melayu 4, Urdu 5, Bahasa Indonesia 6, French 7, and Swahili 59. On tabs other than qdc, selected languages are prioritized but other languages may still be returned. Use tab=qdc&languages=2 to restrict QDC results to English; add filter[postTypeIds]=1 to return reflections only. Non-English QDC selections include English as a fallback. These IDs are separate from Content API /resources/languages IDs.
Possible values: >= 1
Default value: 1
Page number for pagination (default: 1).
Possible values: >= 1
Default value: 20
Number of posts per page (default: 20).
Whether to limit the feed to verified contributors. Public ayah-by-ayah reads typically combine this with indexed reference filters such as filter[references][0][chapterId], filter[references][0][from], and filter[references][0][to].
Possible values: [OR, AND]
Operator applied to multiple Quran reference filters.
Possible values: [OR, AND]
Operator applied to multiple tag filters.
Comma-separated client-visible Quran Reflect PostType IDs. Re-reflect is moderation-only and is excluded; requesting only that type returns an empty feed.
Comma-separated list of page subdomains to include.
Comma-separated list of group URLs to include.
Possible values: >= 1
Ending ayah number for reference filter index 0. For a single ayah, use the same value as from.
Possible values: >= 1
Starting ayah number for reference filter index 0. Pair with the matching chapterId and to values.
Possible values: >= 1
Reference filter example for index 0. Use additional indices such as filter[references][1][chapterId] for more references.
Comma-separated list of tag values to include.
Comma-separated list of author identifiers to include.
- 200
- 422
Feed retrieved successfully with paginated posts
Schema
- Array [
- Array [
- ]
- Array [
- ]
- Array [
- ]
- ]
data object[] required
tags object[]
references object[]
recentComment object
author object required
avatarUrls object required
Default value: false
room object nullable
Deprecated content-visibility projection. Use privacy instead.
Possible values: [public, closed, private]
Default value: false
mentions object[]
avatarUrls object required
Default value: false
Default value: false
Default value: false
Default value: false
Default value: false
Possible values: [0, 1, 2]
Default value: 0
@description 0: OnlyMembers, 1: Publicly, 2: AsRoom
Default value: false
Default value: 0
Default value: 0
Default value: 0
Default value: 0
Possible values: [1, 2, 3, 4, 5, 6, 30]
featured = 1, // Like Sticky posts, will be featured for a time period.Shown at top in feed and partner apps
promoted = 2, // High quality content.Shown at top(after featured) in feed and partner apps
normal = 3, // Default status, available in search, latest and popular tabs.In feed(if you're following the author)
hidden = 4, // Visible only to author or moderators, or via private share link.
private_note = 5, // Private notes, only visible to author or via private share link.These are the posts made "private" by moderators.
requested_review = 6, // User requested the review, treat them has hidden.Only visible to author and moderators
deleted = 30,
Possible values: [1, 2, 100]
Moderator review state. 1 = reviewed, 2 = pending review, 100 = legacy. This is separate from post visibility, which is controlled by moderationStatus.
Default value: 0
{
"total": 10,
"currentPage": 1,
"limit": 10,
"pages": 1,
"data": [
{
"tags": [
{
"language": "string",
"id": 0,
"name": "string"
}
],
"references": [
{
"id": "string",
"from": 0,
"to": 0,
"chapterId": 0
}
],
"author": {},
"recentComment": {
"id": 0,
"author": {
"postsCount": 0,
"avatarUrls": {
"small": "string",
"medium": "string",
"large": "string"
},
"id": "string",
"username": "string",
"verified": false,
"firstName": "string",
"lastName": "string",
"fullName": "string",
"memberType": 0
},
"body": "string",
"createdAt": "2026-09-07T09:07:55.075Z"
},
"room": {
"isAdmin": {},
"isOwner": {},
"privacy": "public",
"id": 0,
"subdomain": "string",
"roomType": "string",
"verified": false,
"name": "string",
"_group": "string"
},
"mentions": [
{
"postsCount": 0,
"avatarUrls": {
"small": "string",
"medium": "string",
"large": "string"
},
"id": "string",
"username": "string",
"verified": false,
"firstName": "string",
"lastName": "string",
"fullName": "string",
"memberType": 0,
"locations": {},
"followersCount": 0,
"displayName": "string"
}
],
"sourcePost": {},
"hasSourcePost": true,
"isSourcePostVisible": true,
"reReflectsCount": 0,
"isLiked": true,
"isByFollowedUser": true,
"isCommentedOn": true,
"isSaved": true,
"media": [
{}
],
"id": 0,
"authorId": "string",
"editSource": "string",
"privacySource": "string",
"body": "string",
"discussionId": 0,
"draft": false,
"createdAt": "2026-09-07T09:07:55.075Z",
"updatedAt": "2026-09-07T09:07:55.075Z",
"publishedAt": "2026-09-07T09:07:55.075Z",
"global": true,
"toxicityScore": 0,
"reported": false,
"views": 0,
"removed": false,
"verified": false,
"roomPostStatus": 0,
"hidden": false,
"commentsCount": 0,
"likesCount": 0,
"viewsCount": 0,
"readsCount": 0,
"languageId": 0,
"languageName": "string",
"moderationStatus": 1,
"reviewStatus": 1,
"reviewedAt": "2026-09-07T09:07:55.075Z",
"featuredAt": "2026-09-07T09:07:55.075Z",
"pushedUpAt": "2026-09-07T09:07:55.075Z",
"estimatedReadingTime": 0,
"roomId": 0,
"postTypeId": 0,
"postTypeName": "string",
"sourcePostId": 0
}
]
}
{
"total": 10,
"currentPage": 1,
"limit": 10,
"pages": 1,
"data": [
{
"tags": [
{
"language": "string",
"id": 1,
"name": "string"
}
],
"references": [
{
"id": "string",
"from": 1,
"to": 1,
"chapterId": 1
}
],
"author": {},
"recentComment": {
"id": 1,
"author": {
"postsCount": 1,
"avatarUrls": {
"small": "string",
"medium": "string",
"large": "string"
},
"id": "string",
"username": "string",
"verified": false,
"firstName": "string",
"lastName": "string",
"fullName": "string",
"memberType": 1
},
"body": "string",
"createdAt": "2026-04-02T00:00:00.000Z"
},
"room": {
"isPublic": true,
"isAdmin": {},
"isOwner": {},
"privacy": "public",
"id": 1,
"subdomain": "string",
"roomType": "string",
"verified": false,
"name": "string",
"_group": "string"
},
"mentions": [
{
"postsCount": 1,
"avatarUrls": {
"small": "string",
"medium": "string",
"large": "string"
},
"id": "string",
"username": "string",
"verified": false,
"firstName": "string",
"lastName": "string",
"fullName": "string",
"memberType": 1,
"locations": {},
"followersCount": 1,
"displayName": "string"
}
],
"hasSourcePost": true,
"isSourcePostVisible": true,
"reReflectsCount": 1,
"isLiked": true,
"isByFollowedUser": true,
"isCommentedOn": true,
"isSaved": true,
"media": [
{}
],
"id": 1,
"authorId": "string",
"editSource": "string",
"privacySource": "string",
"body": "string",
"discussionId": 1,
"draft": false,
"createdAt": "2026-04-02T00:00:00.000Z",
"updatedAt": "2026-04-02T00:00:00.000Z",
"publishedAt": "2026-04-02T00:00:00.000Z",
"global": true,
"toxicityScore": 1,
"reported": false,
"views": 1,
"removed": false,
"verified": false,
"roomPostStatus": 0,
"hidden": false,
"commentsCount": 0,
"likesCount": 0,
"viewsCount": 0,
"readsCount": 0,
"languageId": 1,
"languageName": "string",
"moderationStatus": 1,
"reviewStatus": 1,
"reviewedAt": "2026-04-02T00:00:00.000Z",
"featuredAt": "2026-04-02T00:00:00.000Z",
"pushedUpAt": "2026-04-02T00:00:00.000Z",
"estimatedReadingTime": 0,
"roomId": 1,
"postTypeId": 1,
"postTypeName": "string",
"sourcePostId": 1
}
]
}
Feed query validation failed. Unsupported values are identified by parameter; for example, an unsupported sortBy value is reported as INVALID.
Schema
- any
{
"details": {
"success": false,
"error": {
"code": "ValidationError",
"message": "Validation Error",
"details": {
"sortBy": "INVALID"
}
}
},
"message": "Validation Error",
"type": "unprocessable_entity",
"success": false
}
{
"details": {
"success": false,
"error": {
"code": "ValidationError",
"message": "Validation Error",
"details": {
"sortBy": "INVALID"
}
}
},
"message": "Validation Error",
"type": "unprocessable_entity",
"success": false
}