---
title: "Create model post or pack"
method: POST
path: "/admin/model-content/content"
tags: ["Admin Model Content"]
---

# Create model post or pack

`POST /admin/model-content/content`

## Request body

- CreateAdminModelContentDto
  - `modelId` string, required
  - `type` 'POST' | 'PACK', required
  - `title` string
  - `description` string
  - `price` number
  - `order` number
  - `isExplicit` boolean
  - `baseLikes` number — Synthetic social-proof baseline; real reactions are added on top. Omit on a pack to have the server generate one.
  - `baseDislikes` number
  - `baseUnlocks` number — Synthetic unlock baseline; real purchases are added on top. Omit on a pack to have the server generate one.
  - `coverMediaId` string — Media used as the pack cover. Defaults to the first media by order.
  - `isPrivateContentListed` boolean — Show this pack in the Private Content catalog.
  - `previewVideoS3Key` string, nullable — Key returned by confirm-upload with target=pack-preview. Null clears the teaser.
  - `previewVideoPosterS3Key` string, nullable
  - `media` AdminModelContentMediaInputDto[]
    - `id` string — Existing media id. Omit to create a new media row.
    - `type` 'PHOTO' | 'VIDEO', required
    - `s3Key` string, required
    - `videoS3Key` string
    - `previewS3Key` string
    - `nsfwThumbnailS3Key` string
    - `lockedCoverS3Key` string
    - `duration` number
    - `order` number
    - `price` number
    - `isLockedPreview` boolean

## Response `200`

- AdminModelContentViewDto
  - `id` string, required
  - `modelId` string, required
  - `modelName` string
  - `modelAvatarUrl` string
  - `type` 'POST' | 'PACK', required
  - `title` string
  - `description` string
  - `status` 'DRAFT' | 'PUBLISHED' | 'ARCHIVED', required
  - `price` number, required
  - `isPurchased` boolean, required
  - `isExplicit` boolean, required
  - `order` number, required
  - `publishedAt` string
  - `createdAt` string, required
  - `media` AdminModelContentMediaViewDto[], required
    - `id` string, required
    - `type` 'PHOTO' | 'VIDEO', required
    - `url` string
    - `videoUrl` string
    - `previewUrl` string
    - `nsfwThumbnailUrl` string
    - `lockedCoverUrl` string
    - `duration` number
    - `order` number, required
    - `price` number, required
    - `isPurchased` boolean, required
    - `isLocked` boolean, required
    - `s3Key` string, required
    - `videoS3Key` string
    - `previewS3Key` string
    - `nsfwThumbnailS3Key` string
    - `lockedCoverS3Key` string
  - `baseLikes` number, required
  - `baseDislikes` number, required
  - `baseUnlocks` number, required
  - `likesCount` number, required
  - `dislikesCount` number, required
  - `unlocksCount` number, required
  - `positiveRatePercent` number — Null until at least one reaction exists.
  - `photosCount` number, required
  - `videosCount` number, required
  - `totalVideoDurationSec` number, required
  - `coverMediaId` string
  - `isPrivateContentListed` boolean, required
  - `previewVideoS3Key` string, nullable — Looping blurred teaser shown while the pack is locked.
  - `previewVideoUrl` string, nullable
  - `previewVideoPosterS3Key` string, nullable
  - `previewVideoPosterUrl` string, nullable

---

[API](https://skmtc.dev/miaai/apis/backend-template-api.md) · [All operations](https://skmtc.dev/miaai/apis/backend-template-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/miaai/backend-template-api/revisions/2a8d88a5124f/schema)
