[
  {
    "section": "Health",
    "routes": [
      {
        "method": "GET",
        "path": "/health",
        "auth": "None",
        "body": null,
        "description": "Health check"
      }
    ]
  },
  {
    "section": "Users",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/users",
        "auth": "Admin",
        "body": null,
        "description": "List all users"
      },
      {
        "method": "POST",
        "path": "/api/admin/users",
        "auth": "Admin",
        "body": {
          "email": "string",
          "name": "string?",
          "password": "string (min 6)",
          "role": "\"moderator\"|\"creator\"|\"user\""
        },
        "description": "Create user"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/users",
        "auth": "Admin",
        "body": {
          "userId": "UUID",
          "name": "string",
          "email": "string",
          "phone": "\"+976########\"|null"
        },
        "description": "Update user profile"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/users",
        "auth": "Admin",
        "body": {
          "userId": "UUID"
        },
        "description": "Delete user"
      }
    ]
  },
  {
    "section": "Account",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/account",
        "auth": "User",
        "body": null,
        "description": "Get current user profile"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/account",
        "auth": "User",
        "body": {
          "name": "string?",
          "phone": "\"+976########\"?",
          "avatar_url": "string?"
        },
        "description": "Update current user profile"
      },
      {
        "method": "POST",
        "path": "/api/admin/account/password",
        "auth": "User",
        "body": {
          "password": "string",
          "newPassword": "string (min 6)"
        },
        "description": "Change password"
      }
    ]
  },
  {
    "section": "Media",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/media/anime/browse?category_id=&status=&search=&page=&limit=",
        "auth": "User",
        "body": null,
        "description": "Browse anime (paged, public)"
      },
      {
        "method": "GET",
        "path": "/api/admin/media/manga/browse?category_id=&status=&search=&page=&limit=",
        "auth": "User",
        "body": null,
        "description": "Browse manga (paged, public)"
      },
      {
        "method": "GET",
        "path": "/api/admin/media/webnovel/browse?category_id=&status=&search=&page=&limit=",
        "auth": "User",
        "body": null,
        "description": "Browse webnovels (paged, public)"
      },
      {
        "method": "GET",
        "path": "/api/admin/:type/feature/weekly-popular",
        "auth": "User",
        "body": null,
        "description": "Feature: weekly popular (type = anime|manga|webnovel)"
      },
      {
        "method": "GET",
        "path": "/api/admin/:type/feature/ranking?window=month|season",
        "auth": "User",
        "body": null,
        "description": "Feature: ranking top 10 by window (type = anime|manga|webnovel)"
      },
      {
        "method": "GET",
        "path": "/api/admin/:type/feature/random?limit=1|2&seed=",
        "auth": "User",
        "body": null,
        "description": "Feature: random picks, max 2 (type = anime|manga|webnovel)"
      },
      {
        "method": "GET",
        "path": "/api/admin/media/browse/:id",
        "auth": "User",
        "body": null,
        "description": "Get single media item"
      },
      {
        "method": "POST",
        "path": "/api/admin/media/browse/:id/view",
        "auth": "User",
        "body": null,
        "description": "Increment view count"
      },
      {
        "method": "GET",
        "path": "/api/admin/media?type=&category_id=&status=&search=",
        "auth": "Admin",
        "body": null,
        "description": "List media (admin)"
      },
      {
        "method": "GET",
        "path": "/api/admin/media/delete-requests",
        "auth": "Admin",
        "body": null,
        "description": "List creator delete requests"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/media/delete-requests/:requestId",
        "auth": "Admin",
        "body": {
          "action": "\"approve\"|\"decline\"",
          "decline_reason": "string?"
        },
        "description": "Review creator delete request"
      },
      {
        "method": "GET",
        "path": "/api/admin/media/:id",
        "auth": "Admin",
        "body": null,
        "description": "Get single media (admin)"
      },
      {
        "method": "POST",
        "path": "/api/admin/media",
        "auth": "Admin",
        "body": {
          "type": "string",
          "name": "string",
          "english_name": "string?",
          "photo_url": "string?",
          "thumbnail_url": "string?",
          "trailer_url": "string?",
          "description": "string?",
          "status": "\"ONGOING\"|\"COMPLETED\"|\"STOPPED\"",
          "category_ids": "UUID[]?",
          "rating": "number 0-10?",
          "episodes": "number?",
          "season": "string?",
          "studio": "string?",
          "release_date": "string?"
        },
        "description": "Create media"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/media/:id",
        "auth": "Admin",
        "body": {
          "name": "string?",
          "english_name": "string?",
          "photo_url": "string?",
          "thumbnail_url": "string?",
          "trailer_url": "string?",
          "description": "string?",
          "status": "\"ONGOING\"|\"COMPLETED\"|\"STOPPED\"?",
          "category_ids": "UUID[]?",
          "rating": "number 0-10?",
          "episodes": "number?",
          "season": "string?",
          "studio": "string?",
          "release_date": "string?"
        },
        "description": "Update media"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/media/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete media"
      }
    ]
  },
  {
    "section": "Categories",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/categories/browse?type=",
        "auth": "User",
        "body": null,
        "description": "Browse categories"
      },
      {
        "method": "GET",
        "path": "/api/admin/categories?type=",
        "auth": "Admin",
        "body": null,
        "description": "List categories (admin)"
      },
      {
        "method": "POST",
        "path": "/api/admin/categories",
        "auth": "Admin",
        "body": {
          "name": "string",
          "slug": "string",
          "type": "string"
        },
        "description": "Create category"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/categories/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete category"
      }
    ]
  },
  {
    "section": "Episodes & Chapters",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/media/:type/:mediaId/:segment",
        "auth": "User",
        "body": null,
        "description": "List units (anime→episodes, manga/webnovel→chapters)"
      },
      {
        "method": "POST",
        "path": "/api/admin/media/:type/:mediaId/:segment",
        "auth": "Admin",
        "body": {
          "episode_number": "number",
          "title": "string?",
          "thumbnail_url": "string?",
          "video_url": "string?",
          "pages": "string[]?",
          "content": "string?",
          "start_minute": "number?",
          "access_tier": "\"free\"|\"subscription\""
        },
        "description": "Create unit (media_id from URL)"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/media/:type/:segment/:id",
        "auth": "Admin",
        "body": {
          "episode_number": "number?",
          "title": "string?",
          "thumbnail_url": "string?",
          "video_url": "string?",
          "pages": "string[]?",
          "content": "string?",
          "start_minute": "number?",
          "access_tier": "\"free\"|\"subscription\"?"
        },
        "description": "Update unit"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/media/:type/:segment/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete unit"
      },
      {
        "method": "GET",
        "path": "/api/admin/episodes/:id/playback",
        "auth": "User",
        "body": null,
        "description": "Signed playback URL for an episode"
      }
    ]
  },
  {
    "section": "Cast & Actors",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/cast/:mediaId",
        "auth": "User",
        "body": null,
        "description": "List cast for a media"
      },
      {
        "method": "POST",
        "path": "/api/admin/cast",
        "auth": "Admin",
        "body": {
          "media_id": "UUID",
          "name": "string",
          "photo_url": "string?",
          "character_name": "string?",
          "character_photo_url": "string?",
          "role": "string?",
          "order": "number?"
        },
        "description": "Add cast member"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/cast/:id",
        "auth": "Admin",
        "body": {
          "name": "string?",
          "photo_url": "string?",
          "character_name": "string?",
          "character_photo_url": "string?",
          "role": "string?",
          "order": "number?"
        },
        "description": "Update cast member"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/cast/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete cast member"
      }
    ]
  },
  {
    "section": "FAQ",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/public/faqs",
        "auth": "None",
        "body": null,
        "description": "Public FAQ list"
      },
      {
        "method": "GET",
        "path": "/api/admin/faqs",
        "auth": "Admin",
        "body": null,
        "description": "Admin FAQ list"
      },
      {
        "method": "POST",
        "path": "/api/admin/faqs",
        "auth": "Admin",
        "body": {
          "question": "string",
          "answer": "string"
        },
        "description": "Create FAQ"
      },
      {
        "method": "PUT",
        "path": "/api/admin/faqs/:id",
        "auth": "Admin",
        "body": {
          "question": "string?",
          "answer": "string?",
          "order": "number?"
        },
        "description": "Update FAQ"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/faqs/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete FAQ"
      }
    ]
  },
  {
    "section": "Pricing",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/public/pricing",
        "auth": "None",
        "body": null,
        "description": "Public landing pricing plans (read-only legacy; managed data lives in subscription plans)"
      }
    ]
  },
  {
    "section": "Subscriptions",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/public/subscription-plans",
        "auth": "None",
        "body": null,
        "description": "Active subscription plans"
      },
      {
        "method": "GET",
        "path": "/api/admin/public/payment-settings",
        "auth": "None",
        "body": null,
        "description": "Public checkout payment instructions"
      },
      {
        "method": "POST",
        "path": "/api/admin/subscriptions/promo/validate",
        "auth": "User",
        "body": {
          "code": "string",
          "plan_id": "number"
        },
        "description": "Validate promo and calculate totals"
      },
      {
        "method": "POST",
        "path": "/api/admin/subscriptions/checkout/bonum",
        "auth": "User",
        "body": {
          "plan_id": "number",
          "promo_code": "string?"
        },
        "description": "Create a server-priced one-time Bonum QPay invoice and return its QR image and bank-app deeplinks"
      },
      {
        "method": "GET",
        "path": "/api/admin/subscriptions/orders/:id/status",
        "auth": "Order owner",
        "body": null,
        "description": "Read local payment and fulfillment status; browser polling never activates access"
      },
      {
        "method": "POST",
        "path": "/api/payments/bonum/webhook",
        "auth": "Bonum x-checksum-v2 HMAC",
        "body": "application/json (verified from exact raw bytes)",
        "description": "Process Bonum payment delivery and activate a QPay subscription exactly once"
      },
      {
        "method": "GET",
        "path": "/api/admin/subscription-plans",
        "auth": "Admin",
        "body": null,
        "description": "Admin subscription plan list"
      },
      {
        "method": "POST",
        "path": "/api/admin/subscription-plans",
        "auth": "Admin",
        "body": {
          "name": "string",
          "months": "number",
          "price_per_month": "number",
          "total_price": "number",
          "discount_percent": "number?",
          "currency": "string?",
          "popular": "boolean?",
          "active": "boolean?",
          "order": "number?"
        },
        "description": "Create subscription plan"
      },
      {
        "method": "PUT",
        "path": "/api/admin/subscription-plans/:id",
        "auth": "Admin",
        "body": {
          "name": "string?",
          "months": "number?",
          "price_per_month": "number?",
          "total_price": "number?",
          "discount_percent": "number?",
          "currency": "string?",
          "popular": "boolean?",
          "active": "boolean?",
          "order": "number?"
        },
        "description": "Update subscription plan"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/subscription-plans/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete subscription plan"
      },
      {
        "method": "GET",
        "path": "/api/admin/promo-codes",
        "auth": "Admin",
        "body": null,
        "description": "Admin promo code list"
      },
      {
        "method": "POST",
        "path": "/api/admin/promo-codes",
        "auth": "Admin",
        "body": {
          "code": "string",
          "discount_percent": "number",
          "active": "boolean?",
          "starts_at": "date?",
          "expires_at": "date?",
          "max_redemptions": "number?"
        },
        "description": "Create promo code"
      },
      {
        "method": "PUT",
        "path": "/api/admin/promo-codes/:id",
        "auth": "Admin",
        "body": {
          "code": "string?",
          "discount_percent": "number?",
          "active": "boolean?",
          "starts_at": "date?",
          "expires_at": "date?",
          "max_redemptions": "number?"
        },
        "description": "Update promo code"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/promo-codes/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete promo code"
      },
      {
        "method": "GET",
        "path": "/api/admin/payment-settings",
        "auth": "Admin",
        "body": null,
        "description": "Admin payment settings"
      },
      {
        "method": "PUT",
        "path": "/api/admin/payment-settings",
        "auth": "Admin",
        "body": {
          "qpay_qr_url": "string?",
          "qpay_description": "string?",
          "bank_name": "string?",
          "bank_account_name": "string?",
          "bank_account_number": "string?",
          "bank_iban": "string?"
        },
        "description": "Update payment settings"
      }
    ]
  },
  {
    "section": "Content Types",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/public/content-types",
        "auth": "None",
        "body": null,
        "description": "Public content types"
      },
      {
        "method": "GET",
        "path": "/api/admin/content-types",
        "auth": "Admin",
        "body": null,
        "description": "Admin content types list"
      },
      {
        "method": "POST",
        "path": "/api/admin/content-types",
        "auth": "Admin",
        "body": {
          "name": "string",
          "alias": "string"
        },
        "description": "Create content type"
      },
      {
        "method": "PUT",
        "path": "/api/admin/content-types/:id",
        "auth": "Admin",
        "body": {
          "name": "string?",
          "alias": "string?"
        },
        "description": "Update content type"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/content-types/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete content type"
      }
    ]
  },
  {
    "section": "Notifications",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/notifications/user",
        "auth": "User",
        "body": null,
        "description": "Get my notifications"
      },
      {
        "method": "GET",
        "path": "/api/admin/notifications",
        "auth": "Admin",
        "body": null,
        "description": "List all notifications"
      },
      {
        "method": "GET",
        "path": "/api/admin/notifications/users",
        "auth": "Admin",
        "body": null,
        "description": "List users for send-to selector"
      },
      {
        "method": "POST",
        "path": "/api/admin/notifications",
        "auth": "Admin",
        "body": {
          "title": "string",
          "description": "string",
          "type": "\"news\"|\"announcement\"|\"new_episode\"",
          "sent_to": "UUID?"
        },
        "description": "Send notification"
      },
      {
        "method": "GET",
        "path": "/api/admin/web-push/public-key",
        "auth": "User",
        "body": null,
        "description": "Get browser push public key"
      },
      {
        "method": "POST",
        "path": "/api/admin/web-push/subscriptions",
        "auth": "User",
        "body": {
          "endpoint": "string",
          "keys": {
            "p256dh": "string",
            "auth": "string"
          }
        },
        "description": "Save browser push subscription"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/web-push/subscriptions",
        "auth": "User",
        "body": {
          "endpoint": "string"
        },
        "description": "Remove browser push subscription"
      }
    ]
  },
  {
    "section": "Creator Applications",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/creator-applications/me",
        "auth": "User",
        "body": null,
        "description": "Get my latest creator application"
      },
      {
        "method": "POST",
        "path": "/api/admin/creator-applications",
        "auth": "User",
        "body": {
          "creator_name": "string",
          "legal_name": "string",
          "phone": "\"+976########\"",
          "bank_name": "string",
          "bank_account_name": "string",
          "bank_account_number": "string",
          "bank_iban": "string?",
          "terms_accepted": true
        },
        "description": "Submit or resubmit creator application"
      },
      {
        "method": "GET",
        "path": "/api/admin/creator-applications",
        "auth": "Admin",
        "body": null,
        "description": "List creator applications"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/creator-applications/:id",
        "auth": "Admin",
        "body": {
          "action": "\"accept\"|\"decline\"",
          "decline_reason": "string?"
        },
        "description": "Accept or decline creator application"
      }
    ]
  },
  {
    "section": "Static Pages",
    "routes": [
      {
        "method": "GET",
        "path": "/api/admin/static-pages/public/:slug",
        "auth": "None",
        "body": null,
        "description": "Get page by slug (public)"
      },
      {
        "method": "GET",
        "path": "/api/admin/static-pages",
        "auth": "User",
        "body": null,
        "description": "List all static pages"
      },
      {
        "method": "GET",
        "path": "/api/admin/static-pages/:id",
        "auth": "User",
        "body": null,
        "description": "Get page by ID"
      },
      {
        "method": "POST",
        "path": "/api/admin/static-pages",
        "auth": "Admin",
        "body": {
          "name": "string",
          "slug": "string",
          "content": "string (HTML)"
        },
        "description": "Create static page"
      },
      {
        "method": "PATCH",
        "path": "/api/admin/static-pages/:id",
        "auth": "Admin",
        "body": {
          "name": "string?",
          "slug": "string?",
          "content": "string?"
        },
        "description": "Update static page"
      },
      {
        "method": "DELETE",
        "path": "/api/admin/static-pages/:id",
        "auth": "Admin",
        "body": null,
        "description": "Delete static page"
      }
    ]
  },
  {
    "section": "Upload",
    "routes": [
      {
        "method": "POST",
        "path": "/api/admin/upload",
        "auth": "Admin",
        "body": "multipart/form-data (field: file, images only, max 5MB)",
        "description": "Upload image to Bunny Storage. Videos upload directly to Bunny Stream via /upload/bunny-tus."
      }
    ]
  }
]
