Books — entry 007 of 22

Ganjoor

Verified Aug 2026

REST API behind the Ganjoor open-source classical Persian poetry archive, covering hundreds of poets (Hafez, Rumi, Ferdowsi, and more) with full poem text, biographical metadata, manuscript images, and audio recitations. Every read endpoint (poets, poem categories, verses) is fully keyless; only the write endpoints used by the project's own contributor tools require an OAuth2 bearer token.

poetrypersianclassical-literatureaudioopen-source
AuthenticationNone requiredCall it straight away — no key, no signup.
HTTPSSupportedTraffic is encrypted in transit.
CORSEnabledCallable directly from browser JavaScript.
PricingFreeNo paid tier — free for the documented use case.
FormatsJSONResponses can be requested as JSON.

GreatAPIs Score

Score94out of 100
Authentication25/25No authentication required
Pricing20/20Free to use
Docs20/20Machine-readable spec file bundled
Formats9/15Single response format
Freshness20/20Verified within 6 months

Embed this badge

Scored 94 on greatapis.com
<a href="https://greatapis.com/api/ganjoor/"><img src="https://greatapis.com/badge/ganjoor.svg" alt="Scored 94 on greatapis.com"></a>

Auth quickstart

  1. No key needed — call it now.
Stored keyNo key stored

Your key is stored only in this browser (localStorage) and sent directly to the API — never to greatapis.

Endpoints

Auth
oauth2
AppUser32
GET/api/usersPaginated Users Information (if user does not have user:view permission list only contains him/her information) (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
filterByEmailquerynostring
filterByNickNamequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/usersadd a new user (if you are trying to add an admin user you yourself should be admin) (Auth policies: user:add)
Request body

application/json — RegisterRAppUser

Responses
StatusDescriptionSchema
200OKRegisterRAppUser
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/users/base64imageGet User Image in base 64 (Auth)
Parameters
NameInRequiredType
idquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/behaviour/loglog user bad behaviuor (Auth policies: user:administer)
Request body

application/json — UserCauseViewModel

Responses
StatusDescriptionSchema
200OKRUserBehaviourLog
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/users/behaviour/log/{userId}get user behaviour logs (Auth policies: user:administer)
Parameters
NameInRequiredType
userIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/users/captchaimageget a captcha image for signup or forgot password
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/users/checkmysessionCheck if my session is valid (Auth)
Parameters
NameInRequiredType
sessionIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/users/delsessionLogout user (users need user:delothersession to logout other users) (Auth)
Parameters
NameInRequiredType
userIdquerynostring
sessionIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/users/email/change/{newmail}/{secret} (Auth)
Parameters
NameInRequiredType
newmailpathyesstring
secretpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/email/request/change/{newmail} (Auth)
Parameters
NameInRequiredType
newmailpathyesstring
Request body

application/json — ChangeEmailViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/finalizesignupfinalize signup process
Request body

application/json — VerifiedSignUpViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
POST/api/users/forgotpasswordstart forgot password process by email
Request body

application/json — UnverifiedSignUpViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/users/imageGet User Image (Auth)
Parameters
NameInRequiredType
idquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/imageSet User Image (via FormData, specifying userId as 'id' in formData ) - if Files.count is 0 image would be removed - (users need user:modify to change other users image) (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/users/isadminChecks if user is admin (Auth)
Parameters
NameInRequiredType
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/kickoutkick out a user (Auth policies: user:administer)
Request body

application/json — UserCauseViewModel

Responses
StatusDescriptionSchema
200OKRUserBehaviourLog
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/users/loginlogin
Request body

application/json — LoginViewModel

Responses
StatusDescriptionSchema
200OKLoggedOnUserModel
400Bad Request—
PUT/api/users/relogin/{sessionId}renew an expired session
Parameters
NameInRequiredType
sessionIdpathyesstring
Responses
StatusDescriptionSchema
200OKLoggedOnUserModel
400Bad Request—
POST/api/users/resetpasswordreset password
Request body

application/json — ResetPasswordViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/users/securableitemsget logged on user securableitems (permissions) (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/users/selfdelete/finalize/{code}finalize user self delete (Auth)
Parameters
NameInRequiredType
codepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/selfdelete/startstart user self delete process (send a verification email to user) (Auth)
Request body

application/json — SelfDeleteViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/users/sessionsView User Sessions (user needs user:sessions permission to view other users sessions) (Auth)
Parameters
NameInRequiredType
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/setmypasswordset my password (Auth)
Request body

application/json — SetPasswordModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/users/signupsignup
Request body

application/json — UnverifiedSignUpViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/users/verifyverify signup / forgot password / self delete user
Parameters
NameInRequiredType
typequeryno—
secretquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/users/{id}returns user information (if user does not have user:view permission trying to view other users' information fails with a forbidden error) (Auth)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OKPublicRAppUser
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/users/{id}update existing user (if you are trying to update an admin user you yourself should be admin) (if user does not have user:modify permission trying to modify other users' information fails with a forbidden error) (Auth)
Parameters
NameInRequiredType
idpathyesstring
Request body

application/json — RegisterRAppUser

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/users/{id}delete user (only admin users can delete other admin users, a user cannot delete himself/herself) (Auth policies: user:delete)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/users/{id}/rolesreturns user roles (if user does not have user:view permission trying to view other users' information fails with a forbidden error) (Auth)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/users/{id}/roles/{role}add user to role (Auth policies: user:modify)
Parameters
NameInRequiredType
idpathyesstring
rolepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/users/{id}/roles/{role}remove user from role (Auth policies: user:modify)
Parameters
NameInRequiredType
idpathyesstring
rolepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
Artifact86
GET/api/artifactsget all published artifacts (including CoverImage info but not items info)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/artifactsAdd new artifact (multipart/form-data) const data = new FormData(); data.append('name', 'تست'); data.append('description', ''); data.append('srcUrl', ''); data.append('picTitle', 'تست'); data.append('picDescription', ''); data.append('file', this.file); data.append('picSrcUrl', ''); (Auth policies: artifact:add)
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecord
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ai/create/imagescreate images for ganjoor (Auth policies: artifact:modify)
Parameters
NameInRequiredType
startPoetIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ai/create/images/offlinecreate images for ganjoor - offline (Auth policies: artifact:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/bookmarkuser bookmarks (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/bookmark/item/{itemId}item bookmarks info (Auth)
Parameters
NameInRequiredType
itemIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/bookmark/item/{itemId}bookmark item (Auth)
Parameters
NameInRequiredType
itemIdpathyesstring
Responses
StatusDescriptionSchema
200OKRUserBookmark
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/bookmark/{artifactId}artifact bookmarks info (Auth)
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/bookmark/{artifactId}bookmark artifact (Auth)
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OKRUserBookmark
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/bookmark/{bookmarkId}item bookmarks info (Auth)
Parameters
NameInRequiredType
bookmarkIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/favuser favorites (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/fav/item/{itemId}fav item (Auth)
Parameters
NameInRequiredType
itemIdpathyesstring
Responses
StatusDescriptionSchema
200OKRUserBookmark
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/fav/{artifactId}fav artifact (Auth)
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OKRUserBookmark
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/ganjoorget suggested ganjoor links (Auth)
Parameters
NameInRequiredType
statusqueryno—
notSyncedquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/ganjoorsuggest ganjoor link (Auth)
Request body

application/json — LinkSuggestion

Responses
StatusDescriptionSchema
200OKGanjoorLinkViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/ganjoorremove ganjoor link (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdquerynostring
removeItemLinkquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/ganjoor/nextunsychedimagefinds next unsynchronized suggested link with an aleady synched one from the artificat if exists, return value might be null or an array with length 1 or 2 (has paging-headers) (Auth)
Parameters
NameInRequiredType
skipquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ganjoor/review/{linkId}/{result}review suggested ganjoor link (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdpathyesstring
resultpathyes—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ganjoor/sync/{linkId}/{displayOnPage}mark suggested ganjoor link as synchronized (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdpathyesstring
displayOnPagepathyesboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ganjoor/toctoc / temporary one time api / to be removed (Auth policies: artifact:ganjoor)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ganjoorlink/fillsourcestart filling GanjoorLink table OriginalSource values (Auth policies: artifact:ganjoor)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/ganjoorlink/settextorigin/{ganjoorCatId}/{artifactId}start setting an artifact items as a category poems text original source (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
ganjoorCatIdpathyesinteger
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/importimport from external resources (Auth policies: artifact:import)
Parameters
NameInRequiredType
srcTypequerynostring
resourceNumberquerynostring
friendlyUrlquerynostring
resourcePrefixquerynostring
skipUploadquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/itemupdate an artifact item info
Request body

application/json — RArtifactItemRecord

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/artifacts/item/{artifactFriendlyUrl}add a new item to an artifact (Auth policies: artifact:modify)
Parameters
NameInRequiredType
artifactFriendlyUrlpathyesstring
Request body

multipart/form-data

Responses
StatusDescriptionSchema
200OKRArtifactItemRecord
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/itemsof/{id}/{start}/{count}get artifact images according to start and count params
Parameters
NameInRequiredType
idpathyesstring
startpathyesinteger
countpathyesinteger
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
404Not Found—
POST/api/artifacts/itemtagvalue/{itemId}add new tag value to item (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
itemIdpathyesstring
Request body

application/json — RTag

Responses
StatusDescriptionSchema
200OKRTagValue
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/itemtagvalue/{itemId}/{global}edit item attribute value (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
itemIdpathyesstring
globalquerynoboolean
Request body

application/json — RTagValue

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/artifacts/itemtagvalue/{itemId}/{tagId}/{valueId}/move/{upordown}changes order of tag values based on their position in an item (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
itemIdpathyesstring
tagIdpathyesstring
valueIdpathyesstring
upordownpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/itemtagvalue/{itemId}/{tagValueId}remove tag from item (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
itemIdpathyesstring
tagValueIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/jobs (Auth policies: artifact:add)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/keep-alivekeep alive (for import background service)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/artifacts/limited/{friendlyUrl}/{count}get specific artifact info with limited number of images
Parameters
NameInRequiredType
friendlyUrlpathyesstring
countpathyesinteger
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
404Not Found—
POST/api/artifacts/noteadd note for artifact (Auth)
Request body

application/json — PostUserNote

Responses
StatusDescriptionSchema
200OKRUserNoteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/note/allall users public notes
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/artifacts/note/itemadd note for artifact item (Auth)
Request body

application/json — PostUserNote

Responses
StatusDescriptionSchema
200OKRUserNoteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/note/item/private/{itemId}get private notes for artifact item (Auth)
Parameters
NameInRequiredType
itemIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/note/item/{itemId}get public notes for artifact item
Parameters
NameInRequiredType
itemIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/artifacts/note/privateuser public notes (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/note/private/{artifactId}get private notes for artifact (Auth)
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/note/publicuser public notes (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/note/reportreport a public note (Auth)
Request body

application/json — PostRUserNoteAbuseReportViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/note/report/{id}delete a report for abuse in public user notes (Auth policies: note:moderate)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/note/reported/moderate/{reportid}delete a reported user note (accept the complaint) (Auth policies: note:moderate)
Parameters
NameInRequiredType
reportidpathyesstring
Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/note/{artifactId}get private notes for artifact
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/artifacts/note/{noteId}Edit User Notes (Auth)
Parameters
NameInRequiredType
noteIdpathyesstring
Request body

application/json — PostUserNote

Responses
StatusDescriptionSchema
200OKRUserNoteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/note/{noteId}delete user notes (Auth)
Parameters
NameInRequiredType
noteIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/notes/reportedGet a list of reported notes (Auth policies: note:moderate)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/originalimages/removestart removing original images (Auth policies: artifact:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/pinterestget suggested pinterest links (Auth)
Parameters
NameInRequiredType
statusqueryno—
notSyncedquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/pinterestsuggest pinterest link for ganjoor (Auth)
Request body

application/json — PinterestSuggestion

Responses
StatusDescriptionSchema
200OKPinterestLinkViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/pinterestremove pinterest link (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/pinterest/review/{linkId}/{result}review suggested ganjoor pinterest link (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdpathyesstring
altTextquerynostring
resultpathyes—
reviewDescquerynostring
imageUrlquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/pinterest/sync/{linkId}mark suggested pinterest ganjoor link as synchronized (Auth policies: artifact:ganjoor)
Parameters
NameInRequiredType
linkIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/reexamineimportdue to a bug in loc json outputs some artifacts with more than 1000 pages were downloaded incompletely (Auth policies: artifact:import)
Parameters
NameInRequiredType
passquerynostring
skipUploadquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/retryimportretry import (Auth policies: artifact:import)
Parameters
NameInRequiredType
jobTypequeryno—
skipUploadquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/searchsearch artifacts
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
termquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/artifacts/search/itemssearch artifact items
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
termquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/artifacts/secureget all artifacts visible by user (including CoverImage info but not items info) (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/secure/limited/{friendlyUrl}/{count}gets specified publish artifact info (including CoverImage + images) (Auth)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
countpathyesinteger
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/secure/{artifactUrl}/{itemUrl}gets specified publish artifact item info (including images + attributes) (Auth)
Parameters
NameInRequiredType
artifactUrlpathyesstring
itemUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactItemRecordViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/secure/{friendlyUrl}gets specified publish artifact info (including CoverImage + images) (Auth)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/secure/{friendlyUrl}/filteritemsbytag/{tagFriendlyUrl}gets specified publish artifact info (including CoverImage + images) where its items are filteted by tag (Auth)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
tagFriendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/secure/{friendlyUrl}/filteritemsbytag/{tagFriendlyUrl}/{valueFriendlyUrl}gets specified publish artifact info (including CoverImage + images) where its items are filteted by tag (Auth)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
tagFriendlyUrlpathyesstring
valueFriendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/tagget all tags
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/artifacts/tagadd new tag (Auth policies: tag:modify)
Request body

application/json — RTag

Responses
StatusDescriptionSchema
200OKRTag
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/tag/move/{tagid}/in/item/{itemId}/{upordown}changes order of tags based on their position in artifact items (Auth policies: tag:modify)
Parameters
NameInRequiredType
tagIdpathyesstring
itemIdpathyesstring
upordownpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/tag/move/{tagid}/in/{artifactId}/{upordown}changes order of tags based on their position in artifacts (Auth policies: tag:modify)
Parameters
NameInRequiredType
tagIdpathyesstring
artifactIdpathyesstring
upordownpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/tag/{friendlyUrl}
Parameters
NameInRequiredType
friendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRTag
400Bad Request—
PUT/api/artifacts/tag/{tagid}edit tag (Auth policies: tag:modify)
Parameters
NameInRequiredType
tagidpathyesstring
Request body

application/json — RTag

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/artifacts/tagbundle/{friendlyUrl}get tag bundle by frindly url
Parameters
NameInRequiredType
friendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRTagBundleViewModel
400Bad Request—
404Not Found—
GET/api/artifacts/tagbundle/{friendlyUrl}/{valueUrl}get tag value bundle by frindly url
Parameters
NameInRequiredType
friendlyUrlpathyesstring
valueUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactTagViewModel
400Bad Request—
404Not Found—
GET/api/artifacts/tagged/{tagUrl}/{valueUrl}
Parameters
NameInRequiredType
tagUrlpathyesstring
valueUrlpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
DELETE/api/artifacts/tagvalue/{artifactId}/{tagValueId}remove tag from artifact (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
artifactIdpathyesstring
tagValueIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/artifacts/tagvalue/{artifactid}add new tag value to artifact (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
artifactIdpathyesstring
Request body

application/json — RTag

Responses
StatusDescriptionSchema
200OKRTagValue
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/artifacts/tagvalue/{artifactid}/{global}edit artifact attribute value (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
artifactidpathyesstring
globalquerynoboolean
Request body

application/json — RTagValue

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/artifacts/tagvalue/{artifactid}/{tagId}/{valueId}/move/{upordown}changes order of tag values based on their position in an artifact (Auth policies: artifact:edittag)
Parameters
NameInRequiredType
artifactIdpathyesstring
tagIdpathyesstring
valueIdpathyesstring
upordownpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/tagvalue/{tagId}/{friendlyUrl}get tag value by frindly url
Parameters
NameInRequiredType
tagIdpathyesstring
friendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRTagValue
400Bad Request—
PUT/api/artifacts/upload/external/{friendlyUrl}upload artifact to external server (Auth policies: artifact:modify)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
skipUploadquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/artifacts/{artifactId}remove unpublished artifact having no notes and not bookmarked (Auth policies: artifact:delete)
Parameters
NameInRequiredType
artifactIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/artifacts/{artifactUrl}/{itemUrl}gets specified publish artifact item info (including images + attributes)
Parameters
NameInRequiredType
artifactUrlpathyesstring
itemUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactItemRecordViewModel
400Bad Request—
404Not Found—
GET/api/artifacts/{friendlyUrl}gets specified publish artifact info (including CoverImage + images)
Parameters
NameInRequiredType
friendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
404Not Found—
GET/api/artifacts/{friendlyUrl}/filteritemsbytag/{tagFriendlyUrl}gets specified publish artifact info (including CoverImage + images) where its items are filteted by tag
Parameters
NameInRequiredType
friendlyUrlpathyesstring
tagFriendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
404Not Found—
GET/api/artifacts/{friendlyUrl}/filteritemsbytag/{tagFriendlyUrl}/{valueFriendlyUrl}gets specified publish artifact info (including CoverImage + images) where its items are filteted by tag
Parameters
NameInRequiredType
friendlyUrlpathyesstring
tagFriendlyUrlpathyesstring
valueFriendlyUrlpathyesstring
Responses
StatusDescriptionSchema
200OKRArtifactMasterRecordViewModel
400Bad Request—
404Not Found—
PUT/api/artifacts/{id}edit artifactt master record (user should have additional permissions artifact:awaiting and artifact:publish to change status of artifact) (Auth policies: artifact:modify)
Parameters
NameInRequiredType
idpathyesstring
Request body

application/json — RArtifactMasterRecord

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/artifacts/{id}/coverSet Artifact Cover Item Index (Auth policies: artifact:modify)
Parameters
NameInRequiredType
idpathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
AuditLog1
GET/api/auditlogsget all audit logs ordered by time (Auth policies: audit:view)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
userNamequerynostring
orderByTimeDescendingquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
ContributionStats4
GET/api/contributions/{dataType}/by/userdatatype grouped by user
Parameters
NameInRequiredType
dataTypepathyesstring
PageNumberquerynointeger
PageSizequerynointeger
dayquerynostring
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/contributions/{dataType}/dailydaily stats
Parameters
NameInRequiredType
dataTypepathyesstring
PageNumberquerynointeger
PageSizequerynointeger
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/contributions/{dataType}/summarysummed up stats of data
Parameters
NameInRequiredType
dataTypepathyesstring
Responses
StatusDescriptionSchema
200OKSummedUpViewModel
400Bad Request—
GET/api/contributions/{userId}user contribution
Parameters
NameInRequiredType
userIdpathyesstring
Responses
StatusDescriptionSchema
200OKUserContributionsViewModel
400Bad Request—
DonationAccounting13
GET/api/donationsreturns all donations
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/donationsadd donation + regenerate donations page (Auth policies: ganjoor:donations)
Request body

application/json — GanjoorDonationViewModel

Responses
StatusDescriptionSchema
200OKGanjoorDonationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/donations/accountinfo/visibleis account info settings is on or off (for deciding to regenerate donations page based on it) (Auth policies: ganjoor:donations)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/donations/expensereturns all expenses
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/donations/expenseadd expense + regenerate donations page (Auth policies: ganjoor:donations)
Request body

application/json — GanjoorExpense

Responses
StatusDescriptionSchema
200OKGanjoorDonationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/donations/expense/{id}expense by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorExpense
400Bad Request—
PUT/api/donations/expense/{id}update expense date and description + regenerate donations page (Auth policies: ganjoor:donations)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — UpdateDateDescriptionViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/donations/expense/{id}delete expense (Auth policies: ganjoor:donations)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/donations/onetimeimportone time import (Auth policies: ganjoor:donations)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/donations/pageregenerate donations page (Auth policies: ganjoor:donations)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/donations/{id}donation by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorDonationViewModel
400Bad Request—
PUT/api/donations/{id}update donation date and donorname + regenerate donations page (Auth policies: ganjoor:donations)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — UpdateDateDescriptionViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/donations/{id}delete donation + regenerate donations page (Auth policies: ganjoor:donations)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
ExternalFTP3
GET/api/ftpqueued ftp uploads (Auth policies: ftp:moderate)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ftp/resetreset ftp queue (Auth policies: ftp:moderate)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ftp/startprocess ftp queue (Auth policies: ftp:moderate)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
FAQ14
POST/api/faqadd a new faq item (Auth policies: faq:moderate)
Request body

application/json — FAQItem

Responses
StatusDescriptionSchema
200OKFAQCategory
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/faqupdate an existing faq item (Auth policies: faq:moderate)
Request body

application/json — FAQItem

Responses
StatusDescriptionSchema
200OKFAQCategory
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/catget published categories
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/faq/catadd a new faq category (Auth policies: faq:moderate)
Request body

application/json — FAQCategory

Responses
StatusDescriptionSchema
200OKFAQCategory
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/faq/catupdate an existing faq category (Auth policies: faq:moderate)
Request body

application/json — FAQCategory

Responses
StatusDescriptionSchema
200OKFAQCategory
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/cat/itemsget published category items
Parameters
NameInRequiredType
catIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/faq/cat/items/secureget all category items (Auth policies: faq:moderate)
Parameters
NameInRequiredType
catIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/cat/secureget all categories (Auth policies: faq:moderate)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/cat/secure/{id}get category by id (Auth policies: faq:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKFAQCategory
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/faq/cat/{id}delete a faq category (Auth policies: faq:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/pinnedget published pinned items
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/faq/secure/{id}get item by id (Auth policies: faq:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKFAQItem
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/faq/{id}get published item by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKFAQItem
400Bad Request—
DELETE/api/faq/{id}delete a faq item (Auth policies: faq:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
Ganjoor209
PUT/api/ganjoor/ai/generate/poem/geogeo tag poems using AI (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
startFromquerynointeger
countquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/ai/generate/poem/summariesfill poem summaries using open ai (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
startFromquerynointeger
countquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/ai/generate/summariesfill couplet summaries using open ai (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
startFromquerynointeger
countquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/bookmarkuser bookmarks (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
qquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/bookmark/switch/ret/{poemId}/{coupletIndex}switch bookmark and return bookmark id ('0' for switching off a bookmark) (Auth)
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/bookmark/switch/{poemId}/{coupletIndex}switch bookmark (Auth)
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/bookmark/{bookmarkId}modify bookmark private note (Auth)
Parameters
NameInRequiredType
bookmarkIdpathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/bookmark/{bookmarkId}delete bookmark (Auth)
Parameters
NameInRequiredType
bookmarkIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/bookmark/{poemId}get poem user bookmarks (only Id, CoupletIndex and DateTime are valid in the output view model) (Auth)
Parameters
NameInRequiredType
poemIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/bookmark/{poemId}/{coupletIndex}is the poem couplet is bookmarked by user (Auth)
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/bookmark/{poemId}/{coupletIndex}Bookmark couplet if it is not (Auth)
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/bookslist of books
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/catcat by full url
Parameters
NameInRequiredType
urlquerynostring
poemsquerynoboolean
mainSectionsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
404Not Found—
POST/api/ganjoor/cat/correctionsend cat corrections (Auth)
Request body

application/json — GanjoorCatCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorCatCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/cat/correction/last/{id}returns last unreviewed correction from the user for a cat (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorCatCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/cat/correction/moderatemoderate cat correction (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorCatCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorCatCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/cat/correction/nextget next unreviewed cat correction (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
skipquerynointeger
onlyUserCorrectionsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorCatCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/cat/correction/{id}get cat correction by id (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorCatCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/cat/correction/{id}delete unreviewed user cat corrections for a poem (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/cat/corrections/allget list of all suggested cat corrections (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/cat/corrections/mineget list of user suggested cat corrections (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/extra/{id}set category extra info (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorCatViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/cat/language/{id}/{language}set category poems language tag (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
languagepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/poemformat/{id}/{poemformat}set category poems language tag (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
poemformatpathyes—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/recaptionpoems/{id}batch rename cat poems (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — GanjoorBatchNamingModel

Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/reslugpoems/{id}batch resulg category poems (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/startassigningrhymes/{id}/{retag} (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
retagpathyesboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/startassigningrhythms/{id}/{retag}start assigning poem rhythms (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
retagpathyesboolean
rhythmquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/subcats/startgentoc/{id}start generating sub cats TOC (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
ganjoorTOCqueryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/toc/regenregenerate TOCs (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/cat/toc/{id}/{options}generate category toc (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
optionspathyes—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/cat/toc/{id}/{options}directly insert generated TOC (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
optionspathyes—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/cat/{id}cat by id
Parameters
NameInRequiredType
idpathyesinteger
poemsquerynoboolean
mainSectionsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
404Not Found—
DELETE/api/ganjoor/cat/{id}delete a category (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/cat/{id}/corrections/effectiveeffective corrections for a cat
Parameters
NameInRequiredType
idpathyesinteger
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/cat/{id}/geotagget a categoty poem tags
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/cat/{id}/imagesget category poem related images
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/cat/{id}/papersourcesget paper sources for a catgeory
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/ganjoor/cat/{id}/regenrelatedsectionsregenerate category related sections (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/centuriesgets list of poets grouped by centuries (first one is the pinned ones)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/ganjoor/commentpost new comment (Auth)
Request body

application/json — GanjoorCommentPostViewModel

Responses
StatusDescriptionSchema
200OKGanjoorCommentSummaryViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/commentdelete user's own comment (Auth)
Parameters
NameInRequiredType
idquerynointeger
Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/comment/awaiting/deletedelete awaiting comment (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
idquerynointeger
Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/comment/awaiting/publishpublish awaiting comment (Auth policies: ganjoor:moderate)
Request body

application/json

Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/comment/reportreport a comment (Auth)
Request body

application/json — GanjoorPostReportCommentViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/comment/report/{id}delete a report (without deleting corresponding comment) (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/comment/reported/moderate/{reportid}delete reported other users comment (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
reportidpathyesinteger
Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/comment/{id}edit user's own comment (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json

Responses
StatusDescriptionSchema
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/comment/{id}/editlink/{coupletIndex}link or unlink user's own comment to a coupletIndex (Auth)
Parameters
NameInRequiredType
idpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/commentsget recent comments
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
filterUserIdquerynostring
termquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/comments/awaitingget awaiting comments (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/comments/mineget logged on users recent comments (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/comments/reportedget list of reported comments (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/comments/{id}get a single comment information (only published comments, replies are not included)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorCommentFullViewModel
400Bad Request—
404Not Found—
POST/api/ganjoor/correction/moderatemoderate poem correction (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorPoemCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/correction/{id}get correction by id (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/corrections/allget list of all suggested corrections (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
userIdquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/corrections/mineget list of user suggested corrections (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/couplet/{poemId}/{coupletIndex}/sectionsget couplet sections
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/ganjoor/duplicates/finish/{srcCatId}/{destCatId}start removing category duplicates (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
srcCatIdpathyesinteger
destCatIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/duplicates/manual/{srcCatId}/{srcPoemId}/{destPoemId}manually add a duplicate for a poems (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
srcCatIdpathyesinteger
srcPoemIdpathyesinteger
destPoemIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/duplicates/{catId}list of category saved duplicated poems (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
catIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/duplicates/{id}delete a duplicate (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/duplicates/{srcCatId}/{destCatId}Finding Category Poems Duplicates (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
srcCatIdpathyesinteger
destCatIdpathyesinteger
hardTryquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/fillpoemscoupletindicesstart filling poems couplet indices (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/fillsectioncoupletcountsfill section couplet counts (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/fixlongurlsincommentsexamine comments for long links (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/generatemissingbookcoversgenerate missing book covers (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/generaterelatedsectionsinfostart generating related sections info for wholepoem sections (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
regeneratequerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/hafez/faalget a random poem from hafez
Responses
StatusDescriptionSchema
200OKGanjoorPoemCompleteViewModel
400Bad Request—
POST/api/ganjoor/healthcheckexamine site pages for broken links (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/maintenance/regenfulltitlesregenerate poem full titles to fix an old bug (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/naskbansynchronize https:://naskban.ir links (logs in and then out to naskban.ir using auth info) (Auth policies: ganjoor:moderate)
Request body

application/json — LoginViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/naskban (Auth policies: ganjoor:moderate)
Request body

application/json — LoginViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/naskbandelete poem related naskban images by url (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
naskbanUrlquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/naskban/humanreviewed/{naskbanBookId}/{catId}/{humanReviewed}mark naskban links for poems of a categiory and its children as human reviewed (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
naskbanBookIdpathyesinteger
catIdpathyesinteger
humanReviewedpathyesboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/naskban/import/matchingbooksimport naskban ganjoor matchings (Auth policies: ganjoor:moderate)
Request body

application/json — LoginViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/naskban/import/poetbooks/{poetId}discover poet naskban paper sources (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
poetIdpathyesinteger
Request body

application/json — LoginViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/naskban/textoriginal/{naskbanBookId}/{catId}/{textOriginal}mark naskban links a text original for a category (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
naskbanBookIdpathyesinteger
catIdpathyesinteger
textOriginalpathyesboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/oldversion/{id}get old version of page (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorModifyPageViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/ontime/fixbandcoupletsstart band couplets fix (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/pagepage by url
Parameters
NameInRequiredType
urlquerynostring
catPoemsquerynoboolean
commentSortOrderqueryno—
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
404Not Found—
POST/api/ganjoor/pageadd new page (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorPage

Responses
StatusDescriptionSchema
200OKGanjoorPage
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/page/cache/{id}clean cache by id (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/page/oldversions/{id}older versions of a page (modifications history except for current version) (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/page/{id}modify page (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — GanjoorModifyPageViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/page/{id}delete page (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/pageurlpage url by id
Parameters
NameInRequiredType
idquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/ganjoor/papersources/import/{poetid}import paper sources from museum (Auth policies: ganjoor:moderate)
Parameters
NameInRequiredType
poetidpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/periodsregenerate half centuries (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poemget poem by url
Parameters
NameInRequiredType
urlquerynostring
catInfoquerynoboolean
catPoemsquerynoboolean
rhymesquerynoboolean
recitationsquerynoboolean
imagesquerynoboolean
songsquerynoboolean
commentsquerynoboolean
verseDetailsquerynoboolean
navigationquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoemCompleteViewModel
400Bad Request—
404Not Found—
PUT/api/ganjoor/poem/adminedit/{id}modify poem => only these fields: NoIndex, RedirectFromFullUrl, MixedModeOrder (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — GanjoorModifyPageViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poem/analysisrhyme/{id}find poem rhyme
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjooRhymeAnalysisResult
400Bad Request—
GET/api/ganjoor/poem/analysisrhythm/{id}analysis poem to find its prosody information
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/ganjoor/poem/breakbreak a poem from a verse forward (Auth policies: ganjoor:modify)
Request body

application/json — PoemVerseOrder

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/poem/comment/{id}/rateRate a comment (like / dislike / clear rating) (Auth)
Parameters
NameInRequiredType
idpathyesinteger
valuequerynointeger
Responses
StatusDescriptionSchema
200OKGanjoorCommentRatingResultViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/poem/correctionsend poem corrections (Auth)
Request body

application/json — GanjoorPoemCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poem/correction/last/{id}returns last unreviewed correction from the user for a poem (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poem/correction/nextget next unreviewed correction (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
skipquerynointeger
onlyUserCorrectionsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/poem/correction/{id}delete unreviewed user corrections for a poem (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoemCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/poem/geotagadd poem geo tag (Auth policies: ganjoor:modify)
Request body

application/json — PoemGeoDateTag

Responses
StatusDescriptionSchema
200OKPoemGeoDateTag
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/poem/geotagupdate poem tag (Auth policies: ganjoor:modify)
Request body

application/json — PoemGeoDateTag

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/poem/geotag/{id}delete poem tag (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/poem/randomget a random poem from a poet (c.ganjoor.net replacement), 0 means random poet, حافظ (2)، خیام (3)، ابوسعید ابوالخیر (26)، صائب (22)، سعدی (7)، باباطاهر (28)، مولوی (5)، اوحدی (19)، خواجو (20)، شهریار (35)، عراقی (21)، فروغی بسطامی (32)، سلمان ساوجی (40)، محتشم کاشانی (29)، امیرخسرو دهلوی (34)، سیف فرغانی (31)، عبید زاکانی (33)، هاتف اصفهانی (25) یا رهی معیری (41)
Parameters
NameInRequiredType
poetIdquerynointeger
Responses
StatusDescriptionSchema
200OKGanjoorPoemCompleteViewModel
400Bad Request—
GET/api/ganjoor/poem/{id}get poem by id
Parameters
NameInRequiredType
idpathyesinteger
catInfoquerynoboolean
catPoemsquerynoboolean
rhymesquerynoboolean
recitationsquerynoboolean
imagesquerynoboolean
songsquerynoboolean
commentsquerynoboolean
verseDetailsquerynoboolean
navigationquerynoboolean
relatedpoemsquerynoboolean
commentSortOrderqueryno—
Responses
StatusDescriptionSchema
200OKGanjoorPoemCompleteViewModel
400Bad Request—
404Not Found—
DELETE/api/ganjoor/poem/{id}delete a poem (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poem/{id}/commentsGet Poem Comments
Parameters
NameInRequiredType
idpathyesinteger
coupletIndexquerynointeger
sortOrderqueryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/comments/myratingsget the logged on user's own rating values for a poem's comments (meant to be merged client-side into an already fetched, anonymously cacheable comment list) (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/poem/{id}/corrections/effectiveeffective corrections for poem
Parameters
NameInRequiredType
idpathyesinteger
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/poem/{id}/geotagget poem tags ordered by LunarDateTotalNumber then by Id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/poem/{id}/imagesget poem images (PlainText/HtmlText are intentionally empty)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/quotedsget quoted poems for a poem
Parameters
NameInRequiredType
idpathyesinteger
skipquerynointeger
itemsCountquerynointeger
onlyClaimedByBothPoetsquerynoboolean
publishedquerynoboolean
chosenForMainListquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/quoteds/{relatedId}two poems quoted records
Parameters
NameInRequiredType
idpathyesinteger
relatedIdpathyesinteger
publishedquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/recitationsget poem recitations (PlainText/HtmlText are intentionally empty)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/recitations/upvotesget user upvoted recitations of a poem (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/poem/{id}/sections/regenerateregenerate poem sections (dangerous: wipes out existing data) (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/poem/{id}/songsget poem songs
Parameters
NameInRequiredType
idpathyesinteger
approvedquerynoboolean
trackTypequeryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poem/{id}/versesget poem verses by id
Parameters
NameInRequiredType
idpathyesinteger
coupletIndexquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/ganjoor/poemformats/fillmissingfill missing poem formats (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/poems/searchsearch
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
termquerynostring
poetIdquerynointeger
catIdquerynointeger
equerynoarray
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poems/similarGet Similar Poems accroding to prosody and rhyme informations
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
metrequerynostring
rhymequerynostring
poetIdquerynointeger
catIdquerynointeger
languagequerynostring
formatqueryno—
termquerynostring
coupletCountsFromquerynointeger
coupletCountsToquerynointeger
equerynoarray
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poetpoet by url
Parameters
NameInRequiredType
urlquerynostring
Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
404Not Found—
POST/api/ganjoor/poetcreate new poet (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorPoetViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/poet/image/{id}set poet image (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/poet/image/{url}.gifget poet image
Parameters
NameInRequiredType
urlpathyesstring
nocachequerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poet/image/{url}.pngget poet image with png ext
Parameters
NameInRequiredType
urlpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poet/{id}poet by id
Parameters
NameInRequiredType
idpathyesinteger
catPoemsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoetCompleteViewModel
400Bad Request—
404Not Found—
PUT/api/ganjoor/poet/{id}update poet info (except for image) (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — GanjoorPoetViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/poet/{id}starts deleting poet job ` (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/poetsget list of published poets without their biography
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/poets/secureget list of all poets (including unpublished ones) with their bio (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/probablemetre/dismiss/{id}dismiss ganjoor poem probable metre (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/probablemetre/listget a list of ganjoor poems probable metres
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/probablemetre/nextget next ganjoor poem probable metre
Responses
StatusDescriptionSchema
200OKGanjoorPoemSection
400Bad Request—
404Not Found—
PUT/api/ganjoor/probablemetre/save/{id}save ganjoor poem probable metre (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/ganjoor/prosody/transfer/{srcId}/{destId}transfer poems and sections from a meter to another one and delete the source meter (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
srcIdpathyesinteger
destIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/publicdata/batchexportstart exporting all published Ganjoor data to the public git-tracked JSON data set (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/publicdata/import(re)build local Ganjoor content from a public data export tree (local folder or HTTP) — intended for local development use, not for production servers (Auth policies: ganjoor:import)
Request body

application/json — PublicDataImportRequestDto

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/quotedget quoted poems
Parameters
NameInRequiredType
poetIdquerynointeger
relatedPoetIdquerynointeger
chosenquerynoboolean
publishedquerynoboolean
claimedquerynoboolean
indirectquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/ganjoor/quotedinsert quoted (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorQuotedPoemViewModel

Responses
StatusDescriptionSchema
200OKGanjoorQuotedPoemViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/quotedupdate quoted (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorQuotedPoemViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/quoteddelete quoted (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/quoted/discover/{poetId}/{relatedPoetId}/{breakOnFirstSimilar}/{relatedSubCatId}discover related poems (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
poetIdpathyesinteger
relatedPoetIdpathyesinteger
breakOnFirstSimilarpathyesboolean
relatedSubCatIdpathyesinteger
insertReversequerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/quoted/extractextracting quoted poems (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/quoted/moderatemoderate quoted poems (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorQuotedPoemModerationViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/quoted/pages/generateregenerate related poems pages (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/quoted/pages/generate/{poetId}/{relatedPoetId}regenerate two poets similar page (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
poetIdpathyesinteger
relatedPoetIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/quoted/suggestget list of user suggested corrections (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/quoted/suggestsuggest new quote (for normal users) (Auth)
Request body

application/json — GanjoorQuotedPoemViewModel

Responses
StatusDescriptionSchema
200OKGanjoorQuotedPoemViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/quoted/suggestion/nextnext unmoderated quoted poem (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
skipquerynointeger
Responses
StatusDescriptionSchema
200OKGanjoorQuotedPoemViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/quoted/{id}get quoted by id
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OKGanjoorQuotedPoemViewModel
400Bad Request—
PUT/api/ganjoor/rebuild/mundexstart updating mundex page (Auth policies: ganjoor:songrevu)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/rebuild/statsregenerate stats page (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/redirecturlget redirect url for a url
Parameters
NameInRequiredType
urlquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
POST/api/ganjoor/refillcoupletindices/{poemId}refill couplet indices for poem (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
poemIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/regenplaintext/{catId}separate verses in poem.PlainText with Environment.NewLine instead of SPACE (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
catIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/rhythmsreturns ganjoor metre list ordered by rhythm
Parameters
NameInRequiredType
sortOnVerseCountquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/section/analyserhyme/{id}find poem section rhyming letters
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjooRhymeAnalysisResult
400Bad Request—
POST/api/ganjoor/section/correctionsend a correction for a section (Auth)
Request body

application/json — GanjoorPoemSectionCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoemSectionCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/correction/last/{id}returns last unreviewed correction from the user for a section (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoemSectionCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/correction/nextget next unreviewed correction for poem sections (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
skipquerynointeger
deletedUserSectionsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPoemSectionCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/correction/{id}get section correction by id (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoemSectionCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/ganjoor/section/correction/{id}delete unreviewed user corrections for a poem section (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/corrections/allget list of all suggested corrections (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/section/corrections/mineget list of user suggested corrections (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/section/moderatemoderate poem section correction (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorPoemSectionCorrectionViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoemSectionCorrectionViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/{id}/corrections/effectiveeffective corrections for section
Parameters
NameInRequiredType
idpathyesinteger
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/section/{poemId}/{sectionIndex}/relatedGet Section Related ones
Parameters
NameInRequiredType
poemIdpathyesinteger
sectionIndexpathyesinteger
skipquerynointeger
itemsCountquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
DELETE/api/ganjoor/section/{poemId}/{sectionIndex}/{convertVerses}delete a poem section (section should not be linked to a poem verse of types other than paragraphs or comments) (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
poemIdpathyesinteger
sectionIndexpathyesinteger
convertVersespathyesboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/section/{sectionId}get a specific poem section
Parameters
NameInRequiredType
sectionIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/ganjoor/sections/tagged/languagelanguage tagged poem sections
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
languagequerynostring
poetIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/ganjoor/sections/updaterelatedupdate related sections manually (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
metreIdquerynointeger
rhymequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/sections/{poemId}get all poem sections
Parameters
NameInRequiredType
poemIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
POST/api/ganjoor/singlecouplets/startfindingrhymesstart finding rhymes (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/sitemapstart building sitemap (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/sitemap/tajikbuild tj.ganjoor.net site map (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/songget next unreviewed song (Auth)
Parameters
NameInRequiredType
skipquerynointeger
onlyMinequerynoboolean
Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
POST/api/ganjoor/songsuggest song for poem (Auth)
Request body

application/json — PoemMusicTrackViewModel

Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/songreview song (Auth policies: ganjoor:songrevu)
Request body

application/json — PoemMusicTrackViewModel

Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/ganjoor/songdelete a poem song by id (Auth policies: ganjoor:songrevu)
Parameters
NameInRequiredType
idquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/song/adddirectly insert a poem related song (Auth policies: ganjoor:songadd)
Request body

application/json — PoemMusicTrackViewModel

Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/song/mysuggestionsuser suggested songs (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/song/updatemodify a published song (Auth policies: ganjoor:songrevu)
Request body

application/json — PoemMusicTrackViewModel

Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/song/user/stats/{userId}history of suggested songs by a user (Auth policies: ganjoor:songrevu)
Parameters
NameInRequiredType
userIdpathyesstring
Responses
StatusDescriptionSchema
200OKUserSongSuggestionsHistory
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/song/{id}get song by id (Auth policies: ganjoor:songrevu)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKPoemMusicTrackViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/ganjoor/sourcedigital source from tag
Parameters
NameInRequiredType
sourceUrlSlugquerynostring
Responses
StatusDescriptionSchema
200OKDigitalSource
400Bad Request—
POST/api/ganjoor/source/stats/rebuildupdate digital sources stats (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/source/{catId}tag category with source (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
catIdpathyesinteger
Request body

application/json — DigitalSource

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/sqlite/batchexportstart exporting all poets (Auth policies: ganjoor:songrevu)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/sqlite/export/{poetId}export a poet to sqlite database (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
poetIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/sqlite/import/cat/{catId}import category data from ganjoor SQLite database (form file) (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
catIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/sqlite/import/{poetId}imports data from ganjoor SQLite database (form file) (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
poetIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/sqlite/update/{poetId}Apply corrections from sqlite (Auth policies: ganjoor:import)
Parameters
NameInRequiredType
poetIdpathyesinteger
notequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/startfindingmissingrhythmsStart Finding Missing Rhythms (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
onlyPoemsWithRhymesquerynoboolean
poemsNumquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/tajik/pagetajik page by url
Parameters
NameInRequiredType
urlquerynostring
catPoemsquerynoboolean
Responses
StatusDescriptionSchema
200OKGanjoorPageCompleteViewModel
400Bad Request—
404Not Found—
GET/api/ganjoor/tajik/poetstajik poets
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/ganjoor/tajik/publicdata/batchexportstart exporting the Tajik (Cyrillic) overlay data to its own, separate public git-tracked JSON data set — only poets/categories/poems with an actual Tajik translation are included (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/tajik/regenerate-htmlre-runs the Tajik poet/category HTML generators for every already-imported poet and category page, overwriting their stored TajikHtmlText. Needed one-time after changing either generator function (e.g. adding poem excerpts to the table of contents), since the normal SQLite import skips pages that already exist and never refreshes them. Runs as a background job - check the Admin area's LongRunningJobs page for progress. (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/tajik/restore-poem-htmlrecovery job: regenerates TajikHtmlText for Tajik poems whose stored HTML currently contains a link (the signature left by the CatPage id corruption bug) - use after RegenerateTajikCatAndPoetHtmlText (or anything else) may have corrupted poem pages. Check the Admin area's LongRunningJobs page for progress. (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/tajik/searchsearch tajik poems
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
termquerynostring
poetIdquerynointeger
catIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/ganjoor/tajik/sqlite/onetime/import (Auth policies: ganjoor:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/user/profile/{id}Get user public profile
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OKGanjoorUserPublicProfile
400Bad Request—
404Not Found—
GET/api/ganjoor/wordcounts/bycatcomparison of word counts for poets
Parameters
NameInRequiredType
termquerynostring
PageNumberquerynointeger
PageSizequerynointeger
catIdquerynointeger
poetIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/wordcounts/bycat/countCategoryWordCount for a specific term in a category
Parameters
NameInRequiredType
termquerynostring
catIdquerynointeger
poetIdquerynointeger
Responses
StatusDescriptionSchema
200OKCategoryWordCount
400Bad Request—
PUT/api/ganjoor/wordcounts/fillwordcountsone time fixer for word counts new RowNmbrInCat fields (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/ganjoor/wordcounts/fillwordcountsummeriesone time fixer for category word count summries (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/ganjoor/wordcounts/rebuild/{poetId}build word counts (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
resetquerynoboolean
poetIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/ganjoor/wordcounts/{catId}category word counts
Parameters
NameInRequiredType
catIdpathyesinteger
termquerynostring
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/ganjoor/wordsums/{catId}category words summary
Parameters
NameInRequiredType
catIdpathyesinteger
Responses
StatusDescriptionSchema
200OKCategoryWordCountSummary
400Bad Request—
GanjoorPoetSuggestedPhotos7
POST/api/poetphotosadd a suggestion for poets photos (send form) with these fields: poetId, title, description, srcUrl and an image attachment (Auth)
Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedPictureViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/poetphotosmodify a suggestion for poets photos (Auth policies: ganjoor:photos)
Request body

application/json — GanjoorPoetSuggestedPictureViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/poetphotos/poet/{id}returns list of suggested photos for a poet
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/poetphotos/reject/{id}reject a suggestion for poets photos (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/poetphotos/unpublished/nextreturn the next unpublished suggested line for poets (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
skipquerynointeger
Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedPictureViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/poetphotos/{id}returns a single suggested photo (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedPictureViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/poetphotos/{id}delete published suggested photo (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GanjoorPoetSuggestedSpecLines7
POST/api/poetspecsadd a suggestion for poets spec lines (Auth)
Request body

application/json — GanjoorPoetSuggestedSpecLineViewModel

Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedSpecLineViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/poetspecsmodify a suggestion for poets spec lines (Auth policies: ganjoor:photos)
Request body

application/json — GanjoorPoetSuggestedSpecLineViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/poetspecs/poet/{id}returns list of suggested spec lines for a poet
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/poetspecs/reject/{id}reject a suggestion for poets spec lines (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/poetspecs/unpublished/nextreturn the next unpublished suggested line for poets (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
skipquerynointeger
Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedSpecLineViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/poetspecs/{id}returns specific suggested line for poets (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorPoetSuggestedSpecLineViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/poetspecs/{id}delete published suggested spec line (Auth policies: ganjoor:photos)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GeoLocation5
GET/api/locationsget all locations
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/locationsadd new location (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorGeoLocation

Responses
StatusDescriptionSchema
200OKGanjoorGeoLocation
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/locationsupdate an existing location (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorGeoLocation

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/locations/{id}get location by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorGeoLocation
400Bad Request—
DELETE/api/locations/{id} (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
Image5
GET/api/images/cropped/{id}Generate Cropped Image Based On ThumbnailCoordinates For Notes (Auth)
Parameters
NameInRequiredType
idpathyesstring
leftquerynonumber
topquerynonumber
widthquerynonumber
heightquerynonumber
Responses
StatusDescriptionSchema
200OKRImage
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/images/replace/{id}replace an image (Auth policies: artifact:modify)
Parameters
NameInRequiredType
idpathyesstring
Request body

multipart/form-data

Responses
StatusDescriptionSchema
200OKRPictureFile
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/images/{id}/{degIn90mul}Rotate Image in 90 deg. multiplicants: 90, 180 or 270 (Auth policies: artifact:modify)
Parameters
NameInRequiredType
idpathyesstring
degIn90mulpathyesinteger
Responses
StatusDescriptionSchema
200OKRPictureFile
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/images/{size}/{id}.jpgreturns image stream with image/jpeg MIME type
Parameters
NameInRequiredType
idpathyesstring
sizepathyesstring
mimeForResizedquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/images/{size}/{id}.webpreturns image stream with image/webp MIME type
Parameters
NameInRequiredType
idpathyesstring
sizepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
MusicCatalogue2
GET/api/musiccatalogue/golha/collection/{id}/programsgolha collection programs
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/musiccatalogue/golha/program/{id}/tracksprogram tracks
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
Notification10
GET/api/notificationsGet User Notifications (Auth)
Parameters
NameInRequiredType
notificationTypequeryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/notificationsDelete All Read Notifications (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/notifications/all/{email}notfy all users (Auth policies: notif:bulk)
Parameters
NameInRequiredType
emailpathyesboolean
Request body

application/json — NewNotificationViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/notifications/allreadSet All User Notifications Status Read (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/notifications/allunreadSet All User Notifications Status Unread (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/notifications/paginatedGet User Notifications (Paginated Version) (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
notificationTypequeryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/notifications/unread/countGet unread user notifications count (Auth)
Parameters
NameInRequiredType
notificationTypequeryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/notifications/{notificationId}Switch Notification Status (Auth)
Parameters
NameInRequiredType
notificationIdpathyesstring
Responses
StatusDescriptionSchema
200OKRUserNotificationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/notifications/{notificationId}Delete Notification (Auth)
Parameters
NameInRequiredType
notificationIdpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/notifications/{userId}notify a sepcific user (Auth policies: notif:add)
Parameters
NameInRequiredType
userIdpathyesstring
Request body

application/json — NewNotificationViewModel

Responses
StatusDescriptionSchema
200OKRUserNotificationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
Numbering9
GET/api/numberingsget all numberings
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/numberingsadd new numbering (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorNumbering

Responses
StatusDescriptionSchema
200OKGanjoorNumbering
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/numberingsupdate an existing numbering (Auth policies: ganjoor:modify)
Request body

application/json — GanjoorNumbering

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/numberings/cat/{id}get all numberings related to a category
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/numberings/couplet/{poemId}/{coupletIndex}get all numbering patterns for a couplet
Parameters
NameInRequiredType
poemIdpathyesinteger
coupletIndexpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/numberings/generatemissinggenerate missing default numberings and start counting (Auth policies: ganjoor:modify)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/numberings/recount/start/{id}recount a numbering (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/numberings/{id}get numbering by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorNumbering
400Bad Request—
DELETE/api/numberings/{id} (Auth policies: ganjoor:modify)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
Recitation40
GET/api/audioGets audio narrations, user must have recitation::moderate permission to be able to see all users narrations (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
allUsersquerynoboolean
statusqueryno—
searchTermquerynostring
mistakesquerynoboolean
recitationTypequeryno—
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/audioReciation Upload (Auth)
Parameters
NameInRequiredType
replacequerynoboolean
recitationTypequeryno—
Responses
StatusDescriptionSchema
200OKUploadSession
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/catany/{catId}check if a category has any recitations
Parameters
NameInRequiredType
catIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/cattop1/{catId}get category top one recitations
Parameters
NameInRequiredType
catIdpathyesinteger
includePoemTextquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/cattop1/{catId}/rssrss for category top one recitations
Parameters
NameInRequiredType
catIdpathyesinteger
includePoemTextquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/audio/chownTransfer Recitations Ownership (for recitations owned by current user) (Auth)
Parameters
NameInRequiredType
targetEmailAddressquerynostring
artistNamequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/audio/errors/approved/{id}remove approved mistake (Auth policies: recitation:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/errors/reportget errors reported for recitations (Auth policies: recitation:moderate)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/audio/errors/reportreport an error in a recitation (Auth)
Request body

application/json — RecitationErrorReportViewModel

Responses
StatusDescriptionSchema
200OKRecitationErrorReportViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/audio/errors/report/accept/{id}accepts a reported error for recitations, change status of the recitation to rejected and notify the reporter and recitation owner (and deletes the report) (Auth policies: recitation:moderate)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/audio/errors/report/editedit approved mistake of a recitation text (Auth policies: recitation:moderate)
Request body

application/json — RecitationErrorReportViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/audio/errors/report/saveaccepts a reported error for recitations, add mistake to approve the mistake and notify the reporter and recitation owner (and deletes the report) (Auth policies: recitation:moderate)
Request body

application/json — RecitationErrorReportViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/audio/errors/report/{id}reject a reported error for recitations and notify the reporter (and deletes the report) (Auth policies: recitation:moderate)
Parameters
NameInRequiredType
idpathyesinteger
rejectionNotequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/audio/ffMakes recitations of فریدون فرح‌اندوز first recitations (Auth policies: recitation:import)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/audio/file/{id}.mp3get the corresponding mp3 file for the narration
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
GET/api/audio/file/{id}.xmlget the corresponding xml file for the recitation
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/audio/healthcheckstarts checking recitaions with missing files and add them to reported errors list job (Auth policies: recitation:moderate)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/audio/moderate/{id}Moderate pending narration (for moderating other users' recitations you also need recitation:moderate permission) (Auth policies: recitation:publish)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — RecitationModerateViewModel

Responses
StatusDescriptionSchema
200OKRecitationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/audio/profileGet User Profiles (Auth)
Parameters
NameInRequiredType
artistNamequerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/audio/profileAdd a narration profile (Auth)
Request body

application/json — UserRecitationProfileViewModel

Responses
StatusDescriptionSchema
200OKUserRecitationProfileViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/audio/profileUpdate a narration profile (Auth)
Request body

application/json — UserRecitationProfileViewModel

Responses
StatusDescriptionSchema
200OKUserRecitationProfileViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/profile/defGet User Default Profile (Auth)
Responses
StatusDescriptionSchema
200OKUserRecitationProfileViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/audio/profile/{id}Delete a narration profile (Auth)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/publishedreturns paginated published recitations (if poetId or catId is non-zero its ordered by poemId ascending if not it is ordered by publish date descending)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
searchTermquerynostring
poetIdquerynointeger
catIdquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/published/rsscreates an RSS file from recent published recitations
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/published/{id}get published recitation by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKPublicRecitationViewModel
400Bad Request—
404Not Found—
GET/api/audio/publishqueuepublishing tracker data (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
unfinishedquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/audio/retrypublishretry publish unpublished narrations
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/syncqueueSynchronization Queue (Auth)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/uploadenabledupload, update, moderate and delete operations on recitations might temporarily become disabled, this method gets the current status remarks: the value of this flag is provided as a custom header called audio-upload-enabled in some common GET methods in order to reduce the need for a separate query (Auth)
Responses
StatusDescriptionSchema
200OK—
401Unauthorized—
403Forbidden—
GET/api/audio/uploadsGet User Uploads (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
allUsersquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/verses/{id}Gets Verse Sync Information
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
PUT/api/audio/vote/switch/{id}revoke recitaion up vote (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/audio/vote/{id}up vote a recitation (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/audio/vote/{id}revoke recitaion up vote (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/votesget user upvoted recitations (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/audio/votes/{poemId}/scorescompute poem recitations order (no update)
Parameters
NameInRequiredType
poemIdpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/audio/xml/{id}get the corresponding xml file contents (xml) for the narration
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
404Not Found—
PUT/api/audio/{id}updates narration metadata (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — RecitationViewModel

Responses
StatusDescriptionSchema
200OKRecitationViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
DELETE/api/audio/{id}Delete a recitation (Auth)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
RGenericOptions8
GET/api/options/global/{name}get global option value, Security Warning: every authenticated user could see value of global options, so do not store sensitive data into them or you can override this behaviour in your derived class (Auth)
Parameters
NameInRequiredType
namepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/options/global/{name}set global option value, Security Warning: every authenticated user could change value of global options, so do not store sensitive data into them or you can override this behaviour in your derived class (Auth)
Parameters
NameInRequiredType
namepathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/options/global/{workspace}/{name}get workspace global option value, Security Warning: every authenticated user in a workspace could see value of global options, so do not store sensitive data into them or you can override this behaviour in your derived class (Auth)
Parameters
NameInRequiredType
workspacepathyesstring
namepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/options/global/{workspace}/{name}set global option value, Security Warning: every authenticated user could change value of global options, so do not store sensitive data into them or you can override this behaviour in your derived class (Auth)
Parameters
NameInRequiredType
workspacepathyesstring
namepathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/options/{name}get user level option, if option value is not found it returns empty string (Auth)
Parameters
NameInRequiredType
namepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/options/{name}get user level option (Auth)
Parameters
NameInRequiredType
namepathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/options/{workspace}/{name}get user level option in a workspace, if option value is not found it returns empty string (Auth)
Parameters
NameInRequiredType
workspacepathyesstring
namepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/options/{workspace}/{name}get user level option in a workspace (Auth)
Parameters
NameInRequiredType
workspacepathyesstring
namepathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
RImage2
POST/api/rimagestemporary api for uploading temporary images (Auth policies: audit:view)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/rimages/{id}.{ext}return image with custom extension
Parameters
NameInRequiredType
idpathyesstring
extpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
RLongRunningJobs3
GET/api/rjobsget long running jobs (Auth policies: audit:view)
Parameters
NameInRequiredType
succeededquerynoboolean
failedquerynoboolean
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/rjobsdelete a specific job record, this could be used for deleting records which are not cleanable using the "cleanup" method (Auth policies: audit:view)
Parameters
NameInRequiredType
idquerynostring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/rjobs/cleanupclean up old jobs (Auth policies: audit:view)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
Role8
GET/api/rolesAll Roles Information (Auth policies: role:view)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/rolesadd a new role (Auth policies: role:add)
Request body

application/json — RAppRole

Responses
StatusDescriptionSchema
200OKRAppRole
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/roles/permissions/{roleName}lists role permissions (Auth policies: role:view)
Parameters
NameInRequiredType
roleNamepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/roles/permissions/{roleName}Saves role permissions (Auth policies: role:modify)
Parameters
NameInRequiredType
roleNamepathyesstring
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/roles/securableitemsGet All SecurableItems
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
GET/api/roles/{roleName}returns role information (Auth policies: role:view)
Parameters
NameInRequiredType
roleNamepathyesstring
Responses
StatusDescriptionSchema
200OKRAppRole
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
PUT/api/roles/{roleName}update existing role (Auth policies: role:modify)
Parameters
NameInRequiredType
roleNamepathyesstring
Request body

application/json — RAppRole

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/roles/{roleName}delete role (Auth policies: role:delete)
Parameters
NameInRequiredType
roleNamepathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
SiteBanners5
GET/api/bannersget all defined site banners (Auth policies: ganjoor:banners)
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/bannersadd site banner (send form) with these fields: alt, url and an image attachment (Auth policies: ganjoor:banners)
Responses
StatusDescriptionSchema
200OKGanjoorSiteBannerViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/bannersdelete site banner (Auth policies: ganjoor:banners)
Parameters
NameInRequiredType
idquerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
GET/api/banners/randomget a random active site banner
Responses
StatusDescriptionSchema
200OKGanjoorSiteBannerViewModel
400Bad Request—
401Unauthorized—
404Not Found—
PUT/api/banners/{id}modify site banner (Auth policies: ganjoor:banners)
Parameters
NameInRequiredType
idpathyesinteger
Request body

application/json — GanjoorSiteBannerModifyViewModel

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
404Not Found—
Translation5
GET/api/translations/languagesget all languages
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
POST/api/translations/languagesadd new language (Auth policies: ganjoor:translations)
Request body

application/json — GanjoorLanguage

Responses
StatusDescriptionSchema
200OKGanjoorLanguage
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/translations/languagesupdate an existing language (Auth policies: ganjoor:translations)
Request body

application/json — GanjoorLanguage

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
GET/api/translations/languages/{id}get language by id
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OKGanjoorLanguage
400Bad Request—
DELETE/api/translations/languages/{id} (Auth policies: ganjoor:translations)
Parameters
NameInRequiredType
idpathyesinteger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
UserVisitsTracking4
GET/api/trackingget user history (Auth)
Parameters
NameInRequiredType
PageNumberquerynointeger
PageSizequerynointeger
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
POST/api/trackingadd a user history track (Auth)
Request body

application/json

Responses
StatusDescriptionSchema
200OKGanjoorUserPrePoemVisitViewModel
400Bad Request—
401Unauthorized—
403Forbidden—
PUT/api/trackingstart or stop tracking user (Auth)
Request body

application/json

Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—
DELETE/api/tracking/{id}delete a user history track (Auth)
Parameters
NameInRequiredType
idpathyesstring
Responses
StatusDescriptionSchema
200OK—
400Bad Request—
401Unauthorized—
403Forbidden—

Try it

Developer reference

Base URLhttps://api.ganjoor.net
Key endpoints
  • GET/api/ganjoor/poets
  • GET/api/ganjoor/poet/{id}
  • GET/api/ganjoor/poem

Availability

Uptime100%
Median latency693 ms
Last checkUp · 200 · Sep 2026

17 checks since Aug 2026. A person runs this check by hand, not an automated monitor.

Changelog

Spec versionv1
Tracked paths402
  • Aug 2026gained an OpenAPI spec
  • Sep 20261 path added

Tracking since Sep 2026. See every tracked change ↗ ·Subscribe with RSS ↗