Available to every authenticated member. Returns only the caller's goal.
Needs read:user or read:showcase. A read:showcase token gets the goal without
notify_milestones, notify_lapses and email_updates.
/api/v1/user/reading-goal/api/v1/user/reading-stats/year/api/v1/user/reading-stats/calendar/api/v1/user/reading/in-progress/api/v1/user/reading-goalAvailable to every authenticated member. Returns only the caller's goal.
Needs read:user or read:showcase. A read:showcase token gets the goal without
notify_milestones, notify_lapses and email_updates.
yearintegerUTC year; defaults to the current year.
Example: 2026
Success
Headers: X-RateLimit-Limit, X-RateLimit-Remaining
dataobjectrequireddata.yearintegerrequiredExample: 2026
data.targetinteger or nullrequiredExample: 12
data.read_countintegerrequiredExample: 0
data.percentnumber or nullrequiredExample: 0
data.completedbooleanrequiredExample: false
data.expected_readsinteger or nullrequiredExample: 8
data.pace_differenceinteger or nullrequiredExample: -8
data.remaininginteger or nullrequiredExample: 12
data.reads_per_weekinteger or nullrequiredExample: 1
data.editablebooleanrequiredExample: true
data.last_year_readsinteger or nullrequiredExample: 0
data.suggested_targetinteger or nullrequiredExample: 12
data.timezonestringrequiredExample: "UTC"
data.is_publicbooleanrequiredExample: false
data.notify_milestonesbooleanLeft out for a read:showcase token.
Example: false
data.notify_lapsesbooleanLeft out for a read:showcase token.
Example: false
data.email_updatesbooleanLeft out for a read:showcase token.
Example: false
data.share_urlstring or nullrequiredExample: "https://versedb.com/user/reader/2026"
yearsarray of integersrequiredThe request could not be processed.
messagestringrequiredExample: "Unauthenticated."
Example body, from the documented examples
{
"message": "Unauthenticated."
}The token holds neither read:user nor read:showcase.
messagestringrequiredExample: "Insufficient token scope."
Example body, from the documented examples
{
"message": "Insufficient token scope."
}Rate limit exceeded. This endpoint allows 300/hour (free) or 1,000/hour (PRO). Wait for the number of seconds in the Retry-After header before retrying.
Headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining
messagestringrequiredExample: "Too Many Attempts."
Example body, from the documented examples
{
"message": "Too Many Attempts."
}curl --request GET \
'https://versedb.com/api/v1/user/reading-goal' \
--header 'Authorization: Bearer {YOUR_AUTH_KEY}' \
--header 'Accept: application/json'Example response 200
{
"data": {
"year": 2026,
"target": 12,
"read_count": 0,
"percent": 0,
"completed": false,
"expected_reads": 8,
"pace_difference": -8,
"remaining": 12,
"reads_per_week": 1,
"editable": true,
"last_year_reads": 0,
"suggested_target": 12,
"timezone": "UTC",
"is_public": false,
"notify_milestones": false,
"notify_lapses": false,
"email_updates": false,
"share_url": "https://versedb.com/user/reader/2026"
},
"years": [
2026
]
}/api/v1/user/reading-stats/yearPro feature. Includes goal progress, daily and monthly counts, pace, streaks, rankings and completed series for the authenticated member.
Needs read:user or read:showcase. A read:showcase token gets progress without
notify_milestones, notify_lapses and email_updates.
yearintegerUTC year; defaults to the current year.
Example: 2026
Success
Headers: X-RateLimit-Limit, X-RateLimit-Remaining
dataobjectrequireddata.progressobjectrequireddata.progress.yearintegerrequiredExample: 2026
data.progress.targetinteger or nullrequiredExample: 12
data.progress.read_countintegerrequiredExample: 0
data.progress.percentnumber or nullrequiredExample: 0
data.progress.completedbooleanrequiredExample: false
data.progress.expected_readsinteger or nullrequiredExample: 8
data.progress.pace_differenceinteger or nullrequiredExample: -8
data.progress.remaininginteger or nullrequiredExample: 12
data.progress.reads_per_weekinteger or nullrequiredExample: 1
data.progress.editablebooleanrequiredExample: true
data.progress.last_year_readsinteger or nullrequiredExample: 0
data.progress.suggested_targetinteger or nullrequiredExample: 12
data.progress.timezonestringrequiredExample: "UTC"
data.progress.is_publicbooleanrequiredExample: false
data.progress.notify_milestonesbooleanLeft out for a read:showcase token.
Example: false
data.progress.notify_lapsesbooleanLeft out for a read:showcase token.
Example: false
data.progress.email_updatesbooleanLeft out for a read:showcase token.
Example: false
data.progress.share_urlstring or nullrequiredExample: "https://versedb.com/user/reader/2026"
data.daysarray of objectsrequireddata.days[].datestring or nullrequiredExample: "2026-01-01"
data.days[].countintegerrequiredExample: 0
data.days[].totalintegerrequiredExample: 0
data.days[].expectednumberrequiredExample: 0.03287671232876712
data.monthsobjectrequiredReads in each month, keyed 1 to 12.
data.months.1integerrequiredExample: 0
data.months.2integerrequiredExample: 0
data.months.3integerrequiredExample: 0
data.months.4integerrequiredExample: 0
data.months.5integerrequiredExample: 0
data.months.6integerrequiredExample: 0
data.months.7integerrequiredExample: 0
data.months.8integerrequiredExample: 0
data.months.9integerrequiredExample: 0
data.months.10integerrequiredExample: 0
data.months.11integerrequiredExample: 0
data.months.12integerrequiredExample: 0
data.breakdownsobjectrequireddata.breakdowns.seriesarray of objectsrequireddata.breakdowns.series[].idintegerrequiredExample: 42
data.breakdowns.series[].namestring or nullrequiredExample: "Saga"
data.breakdowns.series[].totalintegerrequiredExample: 3
data.breakdowns.publishersarray of objectsrequireddata.breakdowns.publishers[].idintegerrequiredExample: 42
data.breakdowns.publishers[].namestring or nullrequiredExample: "Saga"
data.breakdowns.publishers[].totalintegerrequiredExample: 3
data.breakdowns.creatorsarray of objectsrequireddata.breakdowns.creators[].idintegerrequiredExample: 42
data.breakdowns.creators[].namestring or nullrequiredExample: "Saga"
data.breakdowns.creators[].totalintegerrequiredExample: 3
data.breakdowns.genresarray of objectsrequireddata.breakdowns.genres[].idintegerrequiredExample: 42
data.breakdowns.genres[].namestring or nullrequiredExample: "Saga"
data.breakdowns.genres[].totalintegerrequiredExample: 3
data.breakdowns.charactersarray of objectsrequireddata.breakdowns.characters[].idintegerrequiredExample: 42
data.breakdowns.characters[].namestring or nullrequiredExample: "Saga"
data.breakdowns.characters[].totalintegerrequiredExample: 3
data.active_daysintegerrequiredExample: 0
data.longest_streakintegerrequiredExample: 0
data.current_streakintegerrequiredExample: 0
data.projected_readsintegerrequiredExample: 0
data.projected_finishstring or nullrequiredExample: null
data.this_weekintegerrequiredExample: 0
data.this_monthintegerrequiredExample: 0
data.monthly_targetinteger or nullrequiredExample: 3
data.busiest_monthinteger or nullrequiredExample: null
data.finished_seriesarray of objectsrequireddata.finished_series[].idintegerrequiredExample: 42
data.finished_series[].namestring or nullrequiredExample: "Saga"
data.finished_series[].totalintegerrequiredExample: 54
data.finished_series[].finished_atstring or nullrequiredExample: "2026-03-01 10:00:00"
yearsarray of integersrequiredThe request could not be processed.
messagestringrequiredExample: "Unauthenticated."
Example body, from the documented examples
{
"message": "Unauthenticated."
}The token holds neither read:user nor read:showcase, or the member has no Pro.
messagestringrequiredExample: "Insufficient token scope."
Example body, from the documented examples
{
"message": "Insufficient token scope."
}Rate limit exceeded. This endpoint allows 300/hour (free) or 1,000/hour (PRO). Wait for the number of seconds in the Retry-After header before retrying.
Headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining
messagestringrequiredExample: "Too Many Attempts."
Example body, from the documented examples
{
"message": "Too Many Attempts."
}curl --request GET \
'https://versedb.com/api/v1/user/reading-stats/year' \
--header 'Authorization: Bearer {YOUR_AUTH_KEY}' \
--header 'Accept: application/json'Example response 200
{
"data": {
"progress": {
"year": 2026,
"target": 12,
"read_count": 0,
"percent": 0,
"completed": false,
"expected_reads": 8,
"pace_difference": -8,
"remaining": 12,
"reads_per_week": 1,
"editable": true,
"last_year_reads": 0,
"suggested_target": 12,
"timezone": "UTC",
"is_public": false,
"notify_milestones": false,
"notify_lapses": false,
"email_updates": false,
"share_url": "https://versedb.com/user/reader/2026"
},
"days": [
{
"date": "2026-01-01",
"count": 0,
"total": 0,
"expected": 0.03287671232876712
}
],
"months": {
"1": 0,
"2": 0,
"3": 0,
"4": 0,
"5": 0,
"6": 0,
"7": 0,
"8": 0,
"9": 0,
"10": 0,
"11": 0,
"12": 0
},
"breakdowns": {
"series": [
{
"id": 42,
"name": "Saga",
"total": 3
}
],
"publishers": [
{
"id": 42,
"name": "Saga",
"total": 3
}
],
"creators": [
{
"id": 42,
"name": "Saga",
"total": 3
}
],
"genres": [
{
"id": 42,
"name": "Saga",
"total": 3
}
],
"characters": [
{
"id": 42,
"name": "Saga",
"total": 3
}
]
},
"active_days": 0,
"longest_streak": 0,
"current_streak": 0,
"projected_reads": 0,
"projected_finish": null,
"this_week": 0,
"this_month": 0,
"monthly_target": 3,
"busiest_month": null,
"finished_series": [
{
"id": 42,
"name": "Saga",
"total": 54,
"finished_at": "2026-03-01 10:00:00"
}
]
},
"years": [
2026
]
}/api/v1/user/reading-stats/calendarPro feature. Returns up to 60 reads per page, newest first.
Needs read:user or read:showcase; both get the same response.
yearintegerUTC year; defaults to the current year.
Example: 2026
monthintegerMonth from 1 to 12; defaults to the current UTC month.
Example: 9
pageintegerPage number, starting at 1.
Example: 1
Success
Headers: X-RateLimit-Limit, X-RateLimit-Remaining
dataarray of objectsrequireddata[].idintegerrequiredExample: 5678
data[].datestring or nullrequiredExample: "2026-09-14"
data[].namestring or nullrequiredExample: "Saga (2012) #1"
data[].urlstring or nullrequiredExample: "https://versedb.com/issue/5678/saga-1"
data[].coverstring or nullrequiredExample: "https://...-cover_sm.webp"
current_pageintegerrequiredExample: 1
last_pageintegerrequiredExample: 1
totalintegerrequiredExample: 0
The request could not be processed.
messagestringrequiredExample: "Unauthenticated."
Example body, from the documented examples
{
"message": "Unauthenticated."
}The token holds neither read:user nor read:showcase, or the member has no Pro.
messagestringrequiredExample: "Insufficient token scope."
Example body, from the documented examples
{
"message": "Insufficient token scope."
}Rate limit exceeded. This endpoint allows 300/hour (free) or 1,000/hour (PRO). Wait for the number of seconds in the Retry-After header before retrying.
Headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining
messagestringrequiredExample: "Too Many Attempts."
Example body, from the documented examples
{
"message": "Too Many Attempts."
}curl --request GET \
'https://versedb.com/api/v1/user/reading-stats/calendar' \
--header 'Authorization: Bearer {YOUR_AUTH_KEY}' \
--header 'Accept: application/json'Example response 200
{
"data": [
{
"id": 5678,
"date": "2026-09-14",
"name": "Saga (2012) #1",
"url": "https://versedb.com/issue/5678/saga-1",
"cover": "https://...-cover_sm.webp"
}
],
"current_page": 1,
"last_page": 1,
"total": 0
}/api/v1/user/reading/in-progressReturns display fields only; page URLs, resume positions and private account data are excluded. Finished and unavailable books are omitted, with content preferences applied. Newest first.
Needs read:user or read:showcase; both get the same response.
limitintegerResults per page (1-50); defaults to 12.
Example: 12
pageintegerPage number, starting at 1.
Example: 1
Success
Headers: X-RateLimit-Limit, X-RateLimit-Remaining
dataarray of objectsrequireddata[].issueobjectrequireddata[].issue.idintegerrequiredExample: 5678
data[].issue.namestring or nullrequiredExample: "The Beginning"
data[].issue.slugstringrequiredExample: "saga-1-5678"
data[].issue.issue_numberstring or nullrequiredExample: "1"
data[].issue.cover_urlstring or nullrequiredExample: "https://...-cover_lg.webp"
data[].issue.is_nsfwbooleanrequiredExample: false
data[].issue.release_datestring or nullrequiredExample: "2012-03-14"
data[].issue.seriesobjectrequireddata[].issue.series.namestring or nullrequiredExample: "Saga"
data[].issue.series.publisher_namestring or nullrequiredExample: "Image Comics"
data[].percentnumberrequiredExample: 42.5
metaobjectrequiredmeta.current_pageintegerrequiredExample: 1
meta.last_pageintegerrequiredExample: 1
meta.per_pageintegerrequiredExample: 12
meta.totalintegerrequiredExample: 0
Unauthenticated. The bearer token is missing, invalid, or revoked.
messagestringrequiredExample: "Unauthenticated."
Example body, from the documented examples
{
"message": "Unauthenticated."
}The token holds neither read:user nor read:showcase.
messagestringrequiredExample: "Insufficient token scope."
Example body, from the documented examples
{
"message": "Insufficient token scope."
}Rate limit exceeded. This endpoint allows 300/hour (free) or 1,000/hour (PRO). Wait for the number of seconds in the Retry-After header before retrying.
Headers: Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining
messagestringrequiredExample: "Too Many Attempts."
Example body, from the documented examples
{
"message": "Too Many Attempts."
}curl --request GET \
'https://versedb.com/api/v1/user/reading/in-progress' \
--header 'Authorization: Bearer {YOUR_AUTH_KEY}' \
--header 'Accept: application/json'Example response 200
{
"data": [
{
"issue": {
"id": 5678,
"name": "The Beginning",
"slug": "saga-1-5678",
"issue_number": "1",
"cover_url": "https://...-cover_lg.webp",
"is_nsfw": false,
"release_date": "2012-03-14",
"series": {
"name": "Saga",
"publisher_name": "Image Comics"
}
},
"percent": 42.5
}
],
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 12,
"total": 0
}
}X-RateLimit-LimitintegerRequest quota per hour for your tier.
X-RateLimit-RemainingintegerRequests remaining in the current window.
Retry-AfterintegerSeconds to wait before retrying.