Meeras
PoetsSherGhazalsNazmsTagsCollections
Sign in
Meeras

A living archive of Urdu and Hindi poetry — free, open, in three scripts.

Explore
PoetsSherGhazalsNazmsMoods & themesTop 20Collections
About
About MeerasDictionaryAPI docs
Legal
ContactPrivacy PolicyTerms of Use
© 2026 Meeras · An open archive

Meeras API Documentation

Public, read-only API. Free for non-commercial use, rate-limited per IP. The reference below is generated from the live OpenAPI specification; endpoint and field names are language-neutral.

Open the interactive console

Endpoints

  • Admin45
  • Auth9
  • Collections2
  • Engagement8
  • Home1
  • Lughat2
  • Me6
  • Poets3
  • Search1
  • Super-admin4
  • System2
  • Tags3
  • Works7

Admin

get/admin/commentsList comments for moderation (offset paginated; filter by status/user/work/flagged/deleted)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
statusquery—
userIdquery—
workIdquery—
flaggedquery
—
includeDeletedquery—
sortquery—

Responses

200 — A page of comments in admin shape.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
statusstringyes
moderationReasonstringnullyes
flagCountnumberyes
createdAtstringyes

Errors

  • 403 — FORBIDDEN (non-admin)
patch/admin/comments/{id}/approveApprove a pending comment

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The approved comment.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
statusstringyes
moderationReasonstringnullyes
flagCountnumberyes
createdAtstringyes

Errors

  • 403 — FORBIDDEN (non-admin)
  • 404 — NOT_FOUND
  • 409 — COMMENT_INVALID_TRANSITION (not pending)
patch/admin/comments/{id}/rejectReject a pending or approved comment (reason ≥ 20 chars)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
reasonstringyes

Responses

200 — The rejected comment.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
statusstringyes
moderationReasonstringnullyes

Errors

  • 403 — FORBIDDEN (non-admin)
  • 404 — NOT_FOUND
  • 422 — VALIDATION_FAILED (reason too short)
patch/admin/comments/{id}/restoreRestore a soft-deleted comment

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The restored comment.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
statusstringyes
moderationReasonstringnullyes
flagCountnumberyes
createdAtstringyes

Errors

  • 403 — FORBIDDEN (non-admin)
  • 404 — NOT_FOUND
get/admin/submissionsList submissions (admin; offset-paginated; FIFO by submittedAt; defaults to pending)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
statusquery—
entityTypequery—
submitterIdquery—
actionquery—

Responses

200 — A page of submissions.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not an admin)
patch/admin/submissions/{id}/approveApprove a pending submission — publishes the entity (admin)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
notesstring—

Responses

200 — The approved submission and the published entity.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
submissionobjectyes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnull

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not an admin)
  • 404 — NOT_FOUND
  • 409 — SUBMISSION_INVALID_TRANSITION (not pending)
  • 422 — SUBMISSION_INCOMPLETE
patch/admin/submissions/{id}/rejectReject a pending submission (admin; reason ≥ 20 chars)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
reasonstringyes

Responses

200 — The rejected submission.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not an admin)
  • 404 — NOT_FOUND
  • 409 — SUBMISSION_INVALID_TRANSITION (not pending)
  • 422 — VALIDATION_FAILED (reason too short)
patch/admin/submissions/{id}/needs-revisionSend a pending submission back for revision (admin; notes ≥ 10 chars)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
notesstringyes

Responses

200 — The submission, now needs_revision.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not an admin)
  • 404 — NOT_FOUND
  • 409 — SUBMISSION_INVALID_TRANSITION (not pending)
  • 422 — VALIDATION_FAILED (notes too short)
post/admin/poetsCreate a poet (admin)

Request body

FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bioShortobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bioFullobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
eraenumyes
languagesWrittenInarray<string>yes
copyrightStatusenumyes
sourceAttributionstringyes

Responses

201 — Poet created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS
  • 422 — VALIDATION_FAILED
patch/admin/poets/{id}Update a poet (admin, If-Match required)

Parameters

NameInRequiredDescription
idpathyes
If-Matchheaderyes

Request body

FieldTypeRequiredDescription
slugstring—
nameobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bioShortobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bioFullobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
eraenum—
languagesWrittenInarray<string>—
copyrightStatusenum—
sourceAttributionstring—

Responses

200 — Poet updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 409 — VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (incl. missing If-Match)
delete/admin/poets/{id}Soft-delete a poet (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Poet soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/poets/{id}/restoreRestore a soft-deleted poet (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Poet restored.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
eraenumyes
submissionStatusstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
post/admin/worksCreate a work (admin, sher only in Phase 1)

Request body

FieldTypeRequiredDescription
typeenumyes
poetIdstringyes
slugstringyes
bodyobjectyes
FieldTypeRequiredDescription
enarray<any>yes
hiarray<any>yes
urarray<any>yes
tagsarray<string>yes
languageenumyes
sourceAttributionstringyes

Responses

201 — Work created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND (poet missing or not approved)
  • 409 — ALREADY_EXISTS
  • 422 — VALIDATION_FAILED (incl. non-sher type, zero tags)
patch/admin/works/{id}Update a work (admin, If-Match required)

Parameters

NameInRequiredDescription
idpathyes
If-Matchheaderyes

Request body

FieldTypeRequiredDescription
poetIdstring—
slugstring—
bodyobject—
FieldTypeRequiredDescription
enarray<any>yes
hiarray<any>yes
urarray<any>yes
tagsarray<string>—
languageenum—
sourceAttributionstring—

Responses

200 — Work updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 409 — VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (incl. missing If-Match, immutable slug/poetId)
delete/admin/works/{id}Soft-delete a work (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Work soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/works/{id}/restoreRestore a soft-deleted work (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Work restored.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
post/admin/tagsCreate a tag (admin)

Request body

FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
typeenumyes
sortPrioritynumber—
isFeaturedboolean—

Responses

201 — Tag created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS
  • 422 — VALIDATION_FAILED
patch/admin/tags/{id}Update a tag (admin, If-Match required)

Parameters

NameInRequiredDescription
idpathyes
If-Matchheaderyes

Request body

FieldTypeRequiredDescription
slugstring—
nameobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
typeenum—
sortPrioritynumber—
isFeaturedboolean—

Responses

200 — Tag updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 409 — VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (incl. missing If-Match, immutable slug)
delete/admin/tags/{id}Soft-delete a tag (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Tag soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/tags/{id}/restoreRestore a soft-deleted tag (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Tag restored.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
typeenumyes
isFeaturedbooleanyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
post/admin/lughatCreate a dictionary entry (admin)

Request body

FieldTypeRequiredDescription
slugstringyes
headwordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnull—
exampleSherIdstringnull—

Responses

201 — Dictionary entry created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
headwordobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS
  • 422 — VALIDATION_FAILED
patch/admin/lughat/{id}Update a dictionary entry (admin, If-Match required)

Parameters

NameInRequiredDescription
idpathyes
If-Matchheaderyes

Request body

FieldTypeRequiredDescription
slugstring—
headwordobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnull—
exampleSherIdstringnull—

Responses

200 — Dictionary entry updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
headwordobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 409 — VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (incl. missing If-Match, immutable slug)
delete/admin/lughat/{id}Soft-delete a dictionary entry (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Dictionary entry soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/lughat/{id}/restoreRestore a soft-deleted dictionary entry (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Dictionary entry restored.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
headwordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequired

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
get/admin/works/{id}/glossesList a work's Lughat glosses (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The work's glosses.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
workIdstringyes
tokenobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coupletIndexnumberyes
lineIndexnumberyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
post/admin/works/{id}/glossesAdd a Lughat gloss to a work (admin)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
tokenobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coupletIndexnumberyes
lineIndexnumberyes
occurrencenumber—
dictionaryEntryIdstringnull—
meaningobjectnull—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
displayPrioritynumber—

Responses

201 — Gloss created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
workIdstringyes
tokenobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS (token slot already annotated)
  • 422 — VALIDATION_FAILED (incl. non-approved work, exactly-one-source rule)
delete/admin/works/{id}/glosses/{glossId}Remove a Lughat gloss from a work (admin)

Parameters

NameInRequiredDescription
idpathyes
glossIdpathyes

Responses

204 — Gloss removed.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
get/admin/featured-todayList pinned featured-today days, newest first (admin)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—

Responses

200 — A page of pinned days.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
datestringyes
topSherIdsarray<string>yes
featuredPoetIdstringyes
featuredCollectionIdstringnullyes
recommendedPoetIdsarray<string>yes
createdBystringyes
createdAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
post/admin/featured-todayPin a featured-today day (admin)

Request body

FieldTypeRequiredDescription
datestringyes
topSherIdsarray<string>yes
featuredPoetIdstringyes
featuredCollectionIdstringnull—
wordOfDayobjectyes
FieldTypeRequiredDescription
wordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
recommendedPoetIdsarray<string>yes

Responses

201 — Day pinned.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
datestringyes
topSherIdsarray<string>yes
featuredPoetIdstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS (date already pinned)
  • 422 — VALIDATION_FAILED (bad date, wrong ref counts, missing sher/poet)
patch/admin/featured-today/{id}Update a pinned day (admin; date is immutable)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
datestring—
topSherIdsarray<string>—
featuredPoetIdstring—
featuredCollectionIdstringnull—
wordOfDayobject—
FieldTypeRequiredDescription
wordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
Field
recommendedPoetIdsarray<string>—

Responses

200 — Day updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
datestringyes
topSherIdsarray<string>yes
featuredPoetIdstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 422 — VALIDATION_FAILED (immutable date, bad refs)
delete/admin/featured-today/{id}Delete a pinned day (admin, hard delete)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Day deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
get/admin/featured-today/calendarCalendar of pinned days over a range (default today + 14d), entries hydrated (admin)

Parameters

NameInRequiredDescription
startDatequery—
endDatequery—

Responses

200 — Days in the range, each with its entry or null.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
daysarray<object>yes
FieldTypeRequiredDescription
datestringyes
entryobject—

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 422 — VALIDATION_FAILED (bad date format)
get/admin/featured-today/preview-todayToday's pinned day, hydrated (admin) — what the home page will show

Responses

200 — Today's hydrated entry, or null.

FieldTypeRequiredDescription
successenumyes
dataobject—

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
get/admin/collectionsList collections including unpublished (admin, offset-paginated)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
categoryquery—
isFeaturedquery—
includeDeletedquery—

Responses

200 — A page of collections.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
post/admin/collectionsCreate a collection (admin)

Request body

FieldTypeRequiredDescription
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
descriptionobjectnull—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
worksarray<object>—
FieldTypeRequiredDescription
workIdstringyes
orderintegeryes
editorialNoteobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coverImageUrlstringnull—
coverColorstringnull—
categoryenum—
tagsarray<string>—
displayPrioritynumber—
isFeaturedboolean—
isPublishedboolean—

Responses

201 — Collection created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS
  • 422 — VALIDATION_FAILED (bad works array, missing title)
get/admin/collections/{id}Get a collection by id with hydrated works (admin; incl. unpublished + soft-deleted)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The collection with hydrated works.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/collections/{id}Update a collection (admin, If-Match required)

Parameters

NameInRequiredDescription
idpathyes
If-Matchheaderyes

Request body

FieldTypeRequiredDescription
slugstring—
titleobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
descriptionobjectnull—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
worksarray<object>—
FieldTypeRequiredDescription
workIdstringyes
orderintegeryes
editorialNoteobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coverImageUrlstringnull—
coverColorstringnull—
categoryenum—
tagsarray<string>—
displayPrioritynumber—
isFeaturedboolean—
isPublishedboolean—

Responses

200 — Collection updated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 409 — VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (incl. missing If-Match, immutable slug)
delete/admin/collections/{id}Soft-delete a collection (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Collection soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
patch/admin/collections/{id}/restoreRestore a soft-deleted collection (admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Collection restored.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
post/admin/collections/{id}/worksAdd a work to a collection (admin; appends or inserts at an order)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
workIdstringyes
orderinteger—
editorialNoteobject—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes

Responses

200 — The updated collection.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND (collection missing)
  • 409 — ALREADY_EXISTS (work already in the collection)
  • 422 — VALIDATION_FAILED (order collision, missing/unapproved work)
patch/admin/collections/{id}/works/reorderReorder a collection's works (admin; must cover every work)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
orderarray<object>yes
FieldTypeRequiredDescription
workIdstringyes
orderintegeryes

Responses

200 — The updated collection.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldType

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND
  • 422 — VALIDATION_FAILED (incomplete mapping or duplicate order/workId)
delete/admin/collections/{id}/works/{workId}Remove a work from a collection (admin; the Work itself is untouched)

Parameters

NameInRequiredDescription
idpathyes
workIdpathyes

Responses

200 — The updated collection.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
categoryenumyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND (collection missing or work not in collection)
get/admin/related-worksList related-works links, offset-paginated, filterable by fromWorkId (admin)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
fromWorkIdquery—

Responses

200 — A page of links.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
fromWorkIdstringyes
toWorkIdstringyes
relationshipTypeenumyes
editorialNoteobjectnullyes
FieldTypeRequiredDescription
enstring

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
post/admin/related-worksCreate a related-works link (admin)

Request body

FieldTypeRequiredDescription
fromWorkIdstringyes
toWorkIdstringyes
relationshipTypeenumyes
editorialNoteobjectnull—
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bidirectionalboolean—
displayPrioritynumber—

Responses

201 — Link created.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
fromWorkIdstringyes
toWorkIdstringyes
relationshipTypeenumyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 409 — ALREADY_EXISTS (duplicate from/to/type)
  • 422 — VALIDATION_FAILED (self-reference, missing/unapproved work)
delete/admin/related-works/{id}Delete a related-works link (admin, hard delete)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Link deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN
  • 404 — NOT_FOUND

Auth

get/auth/csrfBootstrap a CSRF token

Sets the `meeras_csrf` cookie and returns its value in the body. Frontend echoes the value in `X-CSRF-Token` on every state-changing request. CSRF-exempt (the bootstrapping endpoint).

Responses

200 — CSRF token issued.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
csrfTokenstringyes
post/auth/registerRegister a new user

Creates a user with `isEmailVerified=false` and queues a verification email. Rate-limited 5/15min per IP. No cookies set; user cannot log in until verified.

Request body

FieldTypeRequiredDescription
emailstringyes
passwordstringyes
displayNamestringyes

Responses

201 — Created.

FieldTypeRequiredDescription
post/auth/verify-emailVerify email + auto-login

Consumes the verification token, sets `isEmailVerified=true`, and issues access/refresh/csrf cookies (auto-login per BACKEND_ARCHITECTURE §4.4).

Request body

FieldTypeRequiredDescription
tokenstringyes

Responses

200 — Verified + auto-logged in.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
post/auth/resend-verificationResend a verification email (enumeration-safe)

Always returns 200 regardless of whether the email matches a real user (email enumeration prevention). Rate-limited 5/15min per IP.

Request body

FieldTypeRequiredDescription
emailstringyes

Responses

200 — OK (silent for unknown emails).

FieldTypeRequiredDescription
successenumyes
dataobjectyes
post/auth/loginLog in with email + password

Issues access/refresh/csrf cookies on success. Unknown-email and wrong-password both return the same 401 INVALID_CREDENTIALS (email enumeration prevention). Rate-limited 10/15min per IP.

Request body

FieldTypeRequiredDescription
emailstringyes
passwordstringyes

Responses

200 — Logged in.

FieldTypeRequiredDescription
successenumyes
post/auth/refreshRotate refresh token (with reuse detection)

Rotates the refresh JWT in the same family. Replaying a previously-rotated token triggers immediate family revocation and returns 401 REFRESH_REUSE_DETECTED. Rate-limited 30/15min per IP.

Responses

200 — Rotated.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
refreshedenumyes

Errors

post/auth/logoutLog out and revoke the refresh family

Revokes every refresh token in the current family with `revokeReason="logout"` and clears all three auth cookies. Idempotent.

Responses

200 — Logged out.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription

Errors

  • 403 — CSRF_FAILED
post/auth/request-password-resetRequest a password-reset email (enumeration-safe)

Always returns 200 regardless of whether the email matches a real user (email enumeration prevention). Rate-limited 5/15min per IP.

Request body

FieldTypeRequiredDescription
emailstringyes

Responses

200 — OK (silent for unknown emails).

FieldTypeRequiredDescription
successenumyes
dataobjectyes
post/auth/reset-passwordReset password + revoke all refresh families

Sets a new password (subject to strength + common-list validation) and revokes EVERY refresh family for the user — all devices are logged out.

Request body

FieldTypeRequiredDescription
tokenstringyes
newPasswordstringyes

Responses

200 — Password reset.

FieldTypeRequiredDescription
successenumyes

Collections

get/collectionsList published collections (public, cursor-paginated, filterable)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
categoryquery—
isFeaturedquery—
tagsquery—
sortquery—

Responses

200 — A page of collections.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
titleobjectyes
FieldType

Errors

  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
get/collections/{slug}Get a published collection by slug with its works hydrated (public)

Parameters

NameInRequiredDescription
slugpathyes

Responses

200 — The collection with hydrated works.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field

Engagement

get/works/{id}/commentsList approved comments on a work (public; cursor-paginated; no-store)

Parameters

NameInRequiredDescription
idpathyes
limitquery—
cursorquery—

Responses

200 — A page of approved comments with author displayName.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
languagestringyes
statusstringyes
createdAtstringyes
post/works/{id}/commentsPost a comment on a work (auth + verified email; rate limited; enters pending)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
textstringyes
languagestring—

Responses

201 — The created (pending) comment.

patch/comments/{id}Edit your own still-pending comment (owner only)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
textstringyes

Responses

200 — The updated comment.

FieldTypeRequiredDescription
delete/comments/{id}Soft-delete a comment (owner or admin)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Soft-deleted.

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not owner or admin)
  • 404 — NOT_FOUND
post/works/{id}/likeLike a work (auth + verified email; per-user rate limited)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Liked.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
delete/works/{id}/likeUnlike a work (idempotent; auth + verified email)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Unliked (idempotent — succeeds even if no like existed).

Errors

  • 401 — UNAUTHORIZED
post/works/{id}/bookmarkBookmark a work (auth + verified email; per-user rate limited)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — Bookmarked.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
delete/works/{id}/bookmarkRemove a bookmark (idempotent; auth + verified email)

Parameters

NameInRequiredDescription
idpathyes

Responses

204 — Un-bookmarked (idempotent — succeeds even if none existed).

Errors

  • 401 — UNAUTHORIZED

Home

get/homeThe homepage's featured-today curation (today's pinned day, else the most recent).

Responses

200 — The featured-today payload, or null when nothing has ever been pinned.

FieldTypeRequiredDescription
successenumyes
dataobjectnullyes
FieldTypeRequiredDescription
datestringyes
topSherarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
slugstringyes
bodyobject—
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
featuredPoetobject—
recommendedPoetsarray<object>yes
wordOfDayobjectyes
FieldTypeRequiredDescription
wordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
Field

Lughat

get/lughatList dictionary entries (public, cacheable, searchable by q)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
qquery—
sortquery—

Responses

200 — A page of dictionary entries.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
headwordobjectyes
FieldTypeRequiredDescription
enstringyes
histring

Errors

  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
get/lughat/{slug}Get a dictionary entry by slug (public, cacheable)

Parameters

NameInRequiredDescription
slugpathyes

Responses

200 — The dictionary entry.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field

Me

get/me/submissionsList your own submissions (auth; cursor-paginated; filterable by status)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
statusquery—

Responses

200 — A page of your submissions.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes
reviewNotesstringnullyes

Errors

  • 401 — UNAUTHORIZED
post/me/submissionsSave a new draft submission (poet role; 5/hour rate limit)

Request body

FieldTypeRequiredDescription
entityTypestringyes
entityIdstring—
actionstringyes
payloadobjectyes
licenseTypestringyes
licenseAttestationstringyes
patch/me/submissions/{id}Edit your draft (owner only; requires If-Match version)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
payloadobjectyes

Responses

200 — The updated draft.

FieldTypeRequiredDescription
delete/me/submissions/{id}Cancel your draft (soft-delete; owner only)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The cancelled (soft-deleted) submission.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
post/me/submissions/{id}/submitSubmit your draft for review (draft|needs_revision → pending)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The submission, now pending.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
get/me/bookmarksList your bookmarks with the embedded work + poet (auth; cursor-paginated)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—

Responses

200 — A page of your bookmarks.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes

Poets

get/poetsList poets (public, cursor-paginated, filterable by era/isFeatured/languagesWrittenIn)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
eraquery—
isFeaturedquery—
languagesWrittenInquery—
sortquery—

Responses

200 — A page of poets.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldType

Errors

  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
get/poets/{slug}Get a poet by slug (public)

Parameters

NameInRequiredDescription
slugpathyes

Responses

200 — The poet.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldType
get/poets/{slug}/worksList a poet's works (public, cursor-paginated, filterable by type)

Parameters

NameInRequiredDescription
slugpathyes
limitquery—
cursorquery—
typequery—
sortquery—

Responses

200 — A page of the poet’s works.

Search

get/searchCross-script search over works (Atlas Search backed; optional auth; rate-limited)

Parameters

NameInRequiredDescription
qqueryyes
typequery—
scriptquery—
limitquery—
cursorquery—

Responses

200 — A page of matching works plus meta.search { query, totalHits, tookMs }.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—

Errors

  • 422 — VALIDATION_FAILED (q missing or fewer than 2 chars)
  • 429 — RATE_LIMITED (per-IP search ceiling exceeded)

Super-admin

get/super-admin/usersList users with search + role filter (super-admin only)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
qquery—
rolequery—

Responses

200 — Paginated user rows (includes email for the super-admin context).

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
emailstringyes
displayNamestringyes
roleenumyes
isEmailVerifiedbooleanyes
lastLoginAtstringnullyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (actor is not a super_admin)
  • 422 — VALIDATION_FAILED
post/super-admin/users/{id}/promoteChange a user’s role (super-admin only)

Parameters

NameInRequiredDescription
idpathyes

Request body

FieldTypeRequiredDescription
targetRoleenumyes
reasonstringyes

Responses

200 — Role changed; returns the updated user.

get/super-admin/audit-logsList audit-log entries (super-admin only)

Parameters

NameInRequiredDescription
pagequery—
pageSizequery—
actorIdquery—
actorRolequery—
entityTypequery—
entityIdquery—
action
get/super-admin/audit-logs/{id}Get a single audit-log entry (super-admin only)

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — A single redacted audit-log entry.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field

System

get/healthzLiveness probe

Returns 200 with process uptime and version. Used by orchestration platforms to confirm the process is running. Does not check downstream dependencies.

Responses

200 — The process is alive.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
statusenumyes
uptimenumberyes
versionstringyes
get/readyzReadiness probe

Returns 200 once the process can serve traffic (Mongo connection healthy). Returns 503 SERVICE_UNAVAILABLE while the database is unreachable. Orchestration platforms route traffic based on this.

Responses

200 — Ready to serve traffic.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
statusenumyes
uptime

Tags

get/tagsList tags (public, cacheable taxonomy, filterable by type)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
typequery—
sortquery—

Responses

200 — A page of tags.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes

Errors

  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
get/tags/{slug}Get a tag by slug with a live works count (public, cacheable)

Parameters

NameInRequiredDescription
slugpathyes

Responses

200 — The tag plus recentWorksCount.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
get/tags/{slug}/worksList a tag's works (public, cursor-paginated, filterable by type)

Parameters

NameInRequiredDescription
slugpathyes
limitquery—
cursorquery—
typequery—
sortquery—

Responses

200 — A page of the tag's works.

Works

get/ghazalsList ghazals (public, cursor-paginated, newest-first, live poets only)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—

Responses

200 — A page of ghazals.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
matlaCoupletIndexnumbernullyes
maqtaCoupletIndexnumbernullyes
languagestringyes

Errors

  • 422 — VALIDATION_FAILED (bad limit or cursor)
get/ghazals/{id}Get a single ghazal by id (public), with embedded poet summary

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The ghazal.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
get/nazmsList nazms (public, cursor-paginated, newest-first, live poets only)

Parameters

NameInRequiredDescription
limitquery—
cursorquery—

Responses

200 — A page of nazms.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
get/nazms/{id}Get a single nazm by id (public), with embedded poet summary

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The nazm.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
get/sherSher feed (public): recent (cursor-paginated) or random; filterable by tag slugs / poetId

Parameters

NameInRequiredDescription
limitquery—
cursorquery—
modequery—
tagsquery—
poetIdquery—

Responses

200 — A page of sher (live poets only).

get/sher/{id}Get a single sher by id (public), with embedded poet summary

Parameters

NameInRequiredDescription
idpathyes

Responses

200 — The sher.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
Field
get/works/{id}/relatedPublic: related works for a work, hydrated with poet, in display-priority order

Parameters

NameInRequiredDescription
idpathyes
limitquery—

Responses

200 — Related works (possibly empty).

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
flagCount
number
yes
createdAtstringyes
action
string
yes
statusstringyes
reviewerIdstringnullyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
resultingEntityIdstringnullyes
createdAtstringyes
yes
actionstringyes
statusstringyes
reviewerIdstringnullyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
resultingEntityIdstringnullyes
createdAtstringyes
entityobjectyes
reviewerId
stringnull
yes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
resultingEntityIdstringnullyes
createdAtstringyes
reviewerId
stringnull
yes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
resultingEntityIdstringnullyes
createdAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
eraenumyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
eraenumyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
version
number
yes
createdAtstringyes
updatedAtstringyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
typeenumyes
isFeaturedbooleanyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
typeenumyes
isFeaturedbooleanyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
submissionStatus
string
yes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnullyes
exampleSherIdstringnullyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnullyes
exampleSherIdstringnullyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Description
enstringyes
histringyes
urstringyes
partOfSpeechstringnullyes
exampleSherIdstringnullyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
occurrence
number
yes
dictionaryEntryIdstringnullyes
meaningobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
displayPrioritynumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
coupletIndexnumberyes
lineIndexnumberyes
occurrencenumberyes
dictionaryEntryIdstringnullyes
meaningobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
displayPrioritynumberyes
createdAtstringyes
updatedAtstringyes
updatedAtstringyes
urstringyes
exampleSherIdstringnull—
featuredCollectionIdstringnullyes
recommendedPoetIdsarray<string>yes
createdBystringyes
createdAtstringyes
updatedAtstringyes
Type
Required
Description
enstringyes
histringyes
urstringyes
exampleSherIdstringnull—
featuredCollectionIdstringnullyes
recommendedPoetIdsarray<string>yes
createdBystringyes
createdAtstringyes
updatedAtstringyes
urstringyes
categoryenumyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
isFeatured
boolean
yes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
isFeatured
boolean
yes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
enstringyes
histringyes
urstringyes
categoryenumyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
isPublishedbooleanyes
isFeaturedbooleanyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
yes
histringyes
urstringyes
bidirectionalbooleanyes
displayPrioritynumberyes
submissionStatusstringyes
createdAtstringyes
updatedAtstringyes
editorialNoteobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
bidirectionalbooleanyes
displayPrioritynumberyes
submissionStatusstringyes
createdAtstringyes
updatedAtstringyes
success
enum
yes
dataobjectyes
FieldTypeRequiredDescription
userIdstringyes
requiresEmailVerificationenumyes

Errors

  • 403 — CSRF_FAILED
  • 409 — EMAIL_TAKEN
  • 422 — VALIDATION_FAILED / PASSWORD_TOO_WEAK
  • 429 — RATE_LIMITED
FieldTypeRequiredDescription
userobjectyes
FieldTypeRequiredDescription
_idstringyes
displayNamestringyes
roleenumyes
preferredScriptenumyes
preferredUiLanguageenumyes
poetProfileIdstringnullyes
isEmailVerifiedbooleanyes
lastLoginAtstringnullyes
createdAtstringyes
updatedAtstringyes

Errors

  • 401 — EMAIL_VERIFICATION_INVALID
  • 403 — CSRF_FAILED
  • 422 — VALIDATION_FAILED
FieldTypeRequiredDescription

Errors

  • 403 — CSRF_FAILED
  • 422 — VALIDATION_FAILED
  • 429 — RATE_LIMITED
dataobjectyes
FieldTypeRequiredDescription
userobjectyes
FieldTypeRequiredDescription
_idstringyes
displayNamestringyes
roleenumyes
preferredScriptenumyes
preferredUiLanguageenumyes
poetProfileIdstringnullyes
isEmailVerifiedbooleanyes
lastLoginAtstringnullyes
createdAtstringyes
updatedAtstringyes

Errors

  • 401 — INVALID_CREDENTIALS
  • 403 — EMAIL_NOT_VERIFIED / CSRF_FAILED
  • 422 — VALIDATION_FAILED
  • 429 — RATE_LIMITED
  • 401 — TOKEN_INVALID / TOKEN_EXPIRED / REFRESH_REUSE_DETECTED
  • 403 — CSRF_FAILED
  • 429 — RATE_LIMITED
FieldTypeRequiredDescription

Errors

  • 403 — CSRF_FAILED
  • 422 — VALIDATION_FAILED
  • 429 — RATE_LIMITED
dataobjectyes
FieldTypeRequiredDescription

Errors

  • 401 — PASSWORD_RESET_INVALID
  • 403 — CSRF_FAILED
  • 422 — VALIDATION_FAILED / PASSWORD_TOO_WEAK
Required
Description
enstringyes
histringyes
urstringyes
descriptionobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coverImageUrlstringnullyes
coverColorstringnullyes
categoryenumyes
tagsarray<string>yes
displayPrioritynumberyes
isFeaturedbooleanyes
isPublishedbooleanyes
publishedAtstringnullyes
statsobjectyes
FieldTypeRequiredDescription
viewCountnumberyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Type
Required
Description
_idstringyes
slugstringyes
titleobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
descriptionobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
coverImageUrlstringnullyes
coverColorstringnullyes
categoryenumyes
tagsarray<string>yes
displayPrioritynumberyes
isFeaturedbooleanyes
isPublishedbooleanyes
publishedAtstringnullyes
statsobjectyes
FieldTypeRequiredDescription
viewCountnumberyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
worksarray<object>yes
FieldTypeRequiredDescription
workobject—
editorialNoteobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
ordernumberyes

Errors

  • 404 — NOT_FOUND (missing, unpublished, or soft-deleted)
user
objectnull
yes
FieldTypeRequiredDescription
displayNamestringyes
FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
languagestringyes
statusstringyes
createdAtstringyes
userobjectnullyes
FieldTypeRequiredDescription
displayNamestringyes

Errors

  • 401 — UNAUTHORIZED
  • 404 — NOT_FOUND (work missing or not approved)
  • 422 — VALIDATION_FAILED (empty / HTML) or COMMENT_TOO_LONG
  • 429 — RATE_LIMITED
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
userIdstringyes
workIdstringyes
textstringyes
languagestringyes
statusstringyes
createdAtstringyes
userobjectnullyes
FieldTypeRequiredDescription
displayNamestringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not the owner)
  • 404 — NOT_FOUND (missing or soft-deleted)
  • 409 — COMMENT_INVALID_TRANSITION (not pending)
  • 422 — VALIDATION_FAILED (empty / HTML)
Type
Required
Description
likedenumyes

Errors

  • 401 — UNAUTHORIZED
  • 404 — NOT_FOUND (work missing, soft-deleted, or not approved)
  • 409 — ALREADY_LIKED (already liked by this user)
  • 429 — RATE_LIMITED (per-user like ceiling exceeded)
Type
Required
Description
bookmarkedenumyes

Errors

  • 401 — UNAUTHORIZED
  • 404 — NOT_FOUND (work missing, soft-deleted, or not approved)
  • 409 — ALREADY_EXISTS (already bookmarked by this user)
  • 429 — RATE_LIMITED (per-user bookmark ceiling exceeded)
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
Type
Required
Description
enstringyes
histringyes
urstringyes
exampleSherobjectnullyes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
slugstringyes
bodyobject—
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
yes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnullyes
exampleSherIdstringnullyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes
Type
Required
Description
_idstringyes
slugstringyes
headwordobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
meaningobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
partOfSpeechstringnullyes
exampleSherIdstringnullyes
submissionStatusstringyes
versionnumberyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND
revisionNotes
stringnull
yes
submittedAtstringnullyes
versionnumberyes
createdAtstringyes

Responses

201 — The created draft.

FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
versionnumberyes
createdAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — ATTRIBUTION_NOT_ALLOWED
  • 422 — VALIDATION_FAILED or SUBMISSION_INCOMPLETE
  • 429 — RATE_LIMITED
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
versionnumberyes
createdAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not the owner)
  • 409 — SUBMISSION_INVALID_TRANSITION or VERSION_MISMATCH
  • 422 — VALIDATION_FAILED (missing If-Match) or SUBMISSION_INCOMPLETE
Type
Required
Description
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
versionnumberyes
createdAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not the owner)
  • 409 — SUBMISSION_INVALID_TRANSITION
Field
Type
Required
Description
_idstringyes
submitterIdstringyes
entityTypestringyes
entityIdstringnullyes
actionstringyes
statusstringyes
reviewNotesstringnullyes
revisionNotesstringnullyes
submittedAtstringnullyes
versionnumberyes
createdAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (not the owner) or ATTRIBUTION_NOT_ALLOWED
  • 409 — SUBMISSION_INVALID_TRANSITION
FieldTypeRequiredDescription
workIdstringyes
createdAtstringyes
workobjectyes

Errors

  • 401 — UNAUTHORIZED
Required
Description
enstringyes
histringyes
urstringyes
eraenumyes
isFeaturedbooleanyes
sortPrioritynumberyes
createdAtstringyes
updatedAtstringyes
Required
Description
_idstringyes
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
eraenumyes
isFeaturedbooleanyes
sortPrioritynumberyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND
Field
Type
Required
Description
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND (poet slug not found)
  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
languagestringyes
createdAtstringyes
updatedAtstringyes
createdAtstringyes
FieldTypeRequiredDescription
successenumyes
dataobjectyes
FieldTypeRequiredDescription
_idstringyes
displayNamestringyes
roleenumyes
preferredScriptenumyes
preferredUiLanguageenumyes
poetProfileIdstringnullyes
isEmailVerifiedbooleanyes
createdAtstringyes
updatedAtstringyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (actor is not a super_admin)
  • 404 — NOT_FOUND (target user does not exist)
  • 409 — LAST_SUPER_ADMIN (cannot demote the last super_admin)
  • 422 — VALIDATION_FAILED
  • 429 — RATE_LIMITED
query
—
startDatequery—
endDatequery—
sortquery—

Responses

200 — Paginated, redacted audit-log entries.

FieldTypeRequiredDescription
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
actorIdstringyes
actorRoleenumyes
actionstringyes
entityTypestringyes
entityIdstringyes
beforeobject—
afterobject—
metadataobjectnullyes
createdAtstringyes
actorobjectnullyes
FieldTypeRequiredDescription
displayNamestringyes
entityLabelstringnullyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (actor is not a super_admin)
  • 422 — VALIDATION_FAILED
Type
Required
Description
_idstringyes
actorIdstringyes
actorRoleenumyes
actionstringyes
entityTypestringyes
entityIdstringyes
beforeobject—
afterobject—
metadataobjectnullyes
createdAtstringyes
actorobjectnullyes
FieldTypeRequiredDescription
displayNamestringyes
entityLabelstringnullyes

Errors

  • 401 — UNAUTHORIZED
  • 403 — FORBIDDEN (actor is not a super_admin)
  • 404 — NOT_FOUND
number
yes
versionstringyes

Errors

  • 503 — Not ready — a downstream dependency is unavailable.
urstringyes
descriptionobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
typeenumyes
coverImageUrlstringnullyes
sortPrioritynumberyes
isFeaturedbooleanyes
statsobjectyes
FieldTypeRequiredDescription
workCountnumberyes
poetCountnumberyes
createdAtstringyes
updatedAtstringyes
Type
Required
Description
_idstringyes
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
descriptionobjectnullyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
typeenumyes
coverImageUrlstringnullyes
sortPrioritynumberyes
isFeaturedbooleanyes
statsobjectyes
FieldTypeRequiredDescription
workCountnumberyes
poetCountnumberyes
createdAtstringyes
updatedAtstringyes
recentWorksCountnumberyes

Errors

  • 404 — NOT_FOUND
Field
Type
Required
Description
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND (tag slug not found)
  • 422 — VALIDATION_FAILED (bad limit or unknown sort field)
submissionStatus
string
yes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes
Type
Required
Description
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
matlaCoupletIndexnumbernullyes
maqtaCoupletIndexnumbernullyes
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND (no such ghazal, wrong type, or soft-deleted poet)
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes

Errors

  • 422 — VALIDATION_FAILED (bad limit or cursor)
Type
Required
Description
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND (no such nazm, wrong type, or soft-deleted poet)
Field
Type
Required
Description
successenumyes
dataarray<object>yes
FieldTypeRequiredDescription
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes

Errors

  • 422 — VALIDATION_FAILED (bad limit/mode/poetId)
Type
Required
Description
_idstringyes
typeenumyes
poetIdstringyes
slugstringyes
bodyobject—
languagestringyes
submissionStatusstringyes
isFeaturedbooleanyes
poetobjectyes
FieldTypeRequiredDescription
slugstringyes
nameobjectyes
FieldTypeRequiredDescription
enstringyes
histringyes
urstringyes
createdAtstringyes
updatedAtstringyes

Errors

  • 404 — NOT_FOUND (no such sher, wrong type, or soft-deleted poet)
FieldTypeRequiredDescription
workobject—
relationshipTypeenumyes
editorialNoteobject—

Errors

  • 404 — NOT_FOUND (work missing, soft-deleted, or not approved)