openapi: 3.1.0
info:
title: Civitai Site API
version: '1.0'
description: |
Browse and search the Civitai public catalog of Stable Diffusion, SDXL, Flux, and video models.
Exposes models, model versions, images, creators, tags, users, permissions, and the user vault.
Public read endpoints are cached; authenticated endpoints are not. Authenticate with a personal
API key issued at civitai.com using a Bearer token.
contact:
name: Civitai Developer Support
url: https://developer.civitai.com/
termsOfService: https://civitai.com/content/tos
license:
name: Civitai Terms of Service
url: https://civitai.com/content/tos
servers:
- url: https://civitai.com/api/v1
description: Civitai Site API
security:
- BearerAuth: []
- {}
tags:
- name: Models
description: Catalog of model checkpoints, LoRAs, embeddings, and VAEs.
- name: ModelVersions
description: Specific versions of a model with files, hashes, and AIR identifiers.
- name: Images
description: Community-shared generation outputs.
- name: Creators
description: Users who publish models.
- name: Tags
description: Catalog tag taxonomy.
- name: Users
description: User accounts.
- name: Permissions
description: Permission checks for the current bearer.
- name: Vault
description: A user's saved-model vault (membership tiers).
- name: Enums
description: Enumerations used throughout the API.
paths:
/models:
get:
operationId: listModels
summary: List Models
tags: [Models]
parameters:
- name: limit
in: query
schema: { type: integer, minimum: 1, maximum: 200, default: 100 }
- name: page
in: query
schema: { type: integer, minimum: 1 }
- name: query
in: query
schema: { type: string }
- name: tag
in: query
schema: { type: string }
- name: username
in: query
schema: { type: string }
- name: types
in: query
schema:
type: array
items:
type: string
enum: [Checkpoint, TextualInversion, Hypernetwork, AestheticGradient, LORA, LoCon, Controlnet, Poses, Wildcards, Workflows, Other]
- name: sort
in: query
schema:
type: string
enum: ['Highest Rated', 'Most Downloaded', 'Newest']
- name: period
in: query
schema:
type: string
enum: [AllTime, Year, Month, Week, Day]
- name: nsfw
in: query
schema: { type: boolean }
responses:
'200':
description: Page of models.
content:
application/json:
schema: { $ref: '#/components/schemas/ModelPage' }
'401': { $ref: '#/components/responses/Unauthorized' }
'429': { $ref: '#/components/responses/RateLimited' }
/models/{id}:
get:
operationId: getModel
summary: Get Model
tags: [Models]
parameters:
- { name: id, in: path, required: true, schema: { type: integer } }
responses:
'200':
description: Model detail.
content:
application/json:
schema: { $ref: '#/components/schemas/Model' }
'404': { $ref: '#/components/responses/NotFound' }
/model-versions/{id}:
get:
operationId: getModelVersion
summary: Get Model Version
tags: [ModelVersions]
parameters:
- { name: id, in: path, required: true, schema: { type: integer } }
responses:
'200':
description: Model version detail.
content:
application/json:
schema: { $ref: '#/components/schemas/ModelVersion' }
'404': { $ref: '#/components/responses/NotFound' }
/model-versions/mini/{id}:
get:
operationId: getModelVersionMini
summary: Get Model Version Mini
tags: [ModelVersions]
description: Lightweight model-version payload optimized for client tools.
parameters:
- { name: id, in: path, required: true, schema: { type: integer } }
responses:
'200':
description: Lightweight model version.
content:
application/json:
schema: { $ref: '#/components/schemas/ModelVersionMini' }
/model-versions/by-hash/{hash}:
get:
operationId: getModelVersionByHash
summary: Get Model Version By Hash
tags: [ModelVersions]
parameters:
- { name: hash, in: path, required: true, schema: { type: string }, description: 'AutoV1, AutoV2, SHA256, CRC32, or Blake3 hash of the model file.' }
responses:
'200':
description: Model version matching the file hash.
content:
application/json:
schema: { $ref: '#/components/schemas/ModelVersion' }
'404': { $ref: '#/components/responses/NotFound' }
/model-versions/by-hash:
post:
operationId: getModelVersionsByHashes
summary: Get Model Versions By Hashes
tags: [ModelVersions]
requestBody:
required: true
content:
application/json:
schema:
type: array
items: { type: string }
responses:
'200':
description: Map of hash to model version.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/ModelVersion' }
/model-versions/by-hash/ids:
post:
operationId: getModelVersionIdsByHashes
summary: Get Model Version IDs By Hashes
tags: [ModelVersions]
requestBody:
required: true
content:
application/json:
schema:
type: array
items: { type: string }
responses:
'200':
description: Map of hash to model version ID.
content:
application/json:
schema:
type: object
additionalProperties: { type: integer }
/images:
get:
operationId: listImages
summary: List Images
tags: [Images]
parameters:
- { name: limit, in: query, schema: { type: integer, default: 100, maximum: 200 } }
- { name: postId, in: query, schema: { type: integer } }
- { name: modelId, in: query, schema: { type: integer } }
- { name: modelVersionId, in: query, schema: { type: integer } }
- { name: username, in: query, schema: { type: string } }
- { name: nsfw, in: query, schema: { type: string, enum: [None, Soft, Mature, X] } }
- { name: sort, in: query, schema: { type: string, enum: ['Most Reactions', 'Most Comments', 'Newest'] } }
- { name: period, in: query, schema: { type: string, enum: [AllTime, Year, Month, Week, Day] } }
- { name: page, in: query, schema: { type: integer } }
responses:
'200':
description: Page of images.
content:
application/json:
schema: { $ref: '#/components/schemas/ImagePage' }
/creators:
get:
operationId: listCreators
summary: List Creators
tags: [Creators]
parameters:
- { name: limit, in: query, schema: { type: integer, default: 20, maximum: 200 } }
- { name: page, in: query, schema: { type: integer } }
- { name: query, in: query, schema: { type: string } }
responses:
'200':
description: Page of creators.
content:
application/json:
schema: { $ref: '#/components/schemas/CreatorPage' }
/tags:
get:
operationId: listTags
summary: List Tags
tags: [Tags]
parameters:
- { name: limit, in: query, schema: { type: integer, default: 20, maximum: 200 } }
- { name: page, in: query, schema: { type: integer } }
- { name: query, in: query, schema: { type: string } }
responses:
'200':
description: Page of tags.
content:
application/json:
schema: { $ref: '#/components/schemas/TagPage' }
/me:
get:
operationId: getCurrentUser
summary: Get Current User
tags: [Users]
security: [{ BearerAuth: [] }]
responses:
'200':
description: Authenticated user profile.
content:
application/json:
schema: { $ref: '#/components/schemas/User' }
'401': { $ref: '#/components/responses/Unauthorized' }
/users:
get:
operationId: listUsers
summary: List Users
tags: [Users]
parameters:
- { name: username, in: query, schema: { type: string } }
- { name: limit, in: query, schema: { type: integer } }
responses:
'200':
description: Matching users.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/User' }
/permissions/check:
get:
operationId: checkPermissions
summary: Check Permissions
tags: [Permissions]
security: [{ BearerAuth: [] }]
parameters:
- { name: entityType, in: query, required: true, schema: { type: string, enum: [Model, ModelVersion, Image, Post, Article] } }
- { name: entityId, in: query, required: true, schema: { type: integer } }
responses:
'200':
description: Permission decisions for the current bearer.
content:
application/json:
schema: { $ref: '#/components/schemas/PermissionResult' }
/vault/get:
get:
operationId: getVaultItem
summary: Get Vault Item
tags: [Vault]
security: [{ BearerAuth: [] }]
parameters:
- { name: modelVersionId, in: query, required: true, schema: { type: integer } }
responses:
'200':
description: Vault item.
content:
application/json:
schema: { $ref: '#/components/schemas/VaultItem' }
/vault/all:
get:
operationId: getAllVaultItems
summary: Get All Vault Items
tags: [Vault]
security: [{ BearerAuth: [] }]
responses:
'200':
description: All vault items for the current user.
content:
application/json:
schema:
type: array
items: { $ref: '#/components/schemas/VaultItem' }
/vault/check-vault:
get:
operationId: checkVault
summary: Check Vault Status
tags: [Vault]
security: [{ BearerAuth: [] }]
responses:
'200':
description: Vault subscription/storage status.
content:
application/json:
schema: { $ref: '#/components/schemas/VaultStatus' }
/vault/toggle-version:
post:
operationId: toggleVaultVersion
summary: Toggle Vault Version
tags: [Vault]
security: [{ BearerAuth: [] }]
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [modelVersionId]
properties:
modelVersionId: { type: integer }
responses:
'200':
description: Vault item after toggle.
content:
application/json:
schema: { $ref: '#/components/schemas/VaultItem' }
/enums:
get:
operationId: getEnums
summary: Get Enums
tags: [Enums]
responses:
'200':
description: Enumeration values used by the API.
content:
application/json:
schema:
type: object
additionalProperties: true
components:
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: token
description: Personal API token issued at https://civitai.com/user/account.
responses:
Unauthorized:
description: Missing or invalid bearer token.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
NotFound:
description: Resource not found.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
RateLimited:
description: Too many requests.
content:
application/json:
schema: { $ref: '#/components/schemas/Error' }
schemas:
Error:
type: object
properties:
error: { type: string }
message: { type: string }
code: { type: string }
Metadata:
type: object
properties:
currentPage: { type: integer }
pageSize: { type: integer }
nextPage: { type: string }
prevPage: { type: string }
totalItems: { type: integer }
totalPages: { type: integer }
Model:
type: object
properties:
id: { type: integer }
name: { type: string }
description: { type: string }
type: { type: string, enum: [Checkpoint, TextualInversion, Hypernetwork, AestheticGradient, LORA, LoCon, Controlnet, Poses, Wildcards, Workflows, Other] }
nsfw: { type: boolean }
nsfwLevel: { type: integer }
allowNoCredit: { type: boolean }
allowCommercialUse: { type: array, items: { type: string, enum: [None, Image, RentCivit, Rent, Sell] } }
allowDerivatives: { type: boolean }
allowDifferentLicense: { type: boolean }
stats: { $ref: '#/components/schemas/Stats' }
creator: { $ref: '#/components/schemas/Creator' }
tags: { type: array, items: { type: string } }
modelVersions: { type: array, items: { $ref: '#/components/schemas/ModelVersion' } }
ModelPage:
type: object
properties:
items: { type: array, items: { $ref: '#/components/schemas/Model' } }
metadata: { $ref: '#/components/schemas/Metadata' }
ModelVersion:
type: object
properties:
id: { type: integer }
modelId: { type: integer }
name: { type: string }
baseModel: { type: string, description: 'e.g. SD 1.5, SDXL 1.0, Flux.1 D' }
baseModelType: { type: string }
createdAt: { type: string, format: date-time }
updatedAt: { type: string, format: date-time }
publishedAt: { type: string, format: date-time }
trainedWords: { type: array, items: { type: string } }
air: { type: string, description: 'AI Resource Identifier, e.g. urn:air:sdxl:lora:civitai:12345@67890' }
downloadUrl: { type: string, format: uri }
files: { type: array, items: { $ref: '#/components/schemas/ModelFile' } }
images: { type: array, items: { $ref: '#/components/schemas/Image' } }
stats: { $ref: '#/components/schemas/Stats' }
ModelVersionMini:
type: object
properties:
id: { type: integer }
modelId: { type: integer }
name: { type: string }
baseModel: { type: string }
air: { type: string }
downloadUrl: { type: string, format: uri }
ModelFile:
type: object
properties:
id: { type: integer }
name: { type: string }
sizeKB: { type: number }
type: { type: string, enum: [Model, VAE, Config, Negative, Training Data, Archive, Other] }
format: { type: string, enum: [SafeTensor, PickleTensor, Other] }
pickleScanResult: { type: string }
virusScanResult: { type: string }
scannedAt: { type: string, format: date-time }
downloadUrl: { type: string, format: uri }
hashes:
type: object
properties:
AutoV1: { type: string }
AutoV2: { type: string }
SHA256: { type: string }
CRC32: { type: string }
Blake3: { type: string }
Image:
type: object
properties:
id: { type: integer }
url: { type: string, format: uri }
hash: { type: string }
width: { type: integer }
height: { type: integer }
nsfwLevel: { type: integer }
nsfw: { type: boolean }
createdAt: { type: string, format: date-time }
postId: { type: integer }
stats: { $ref: '#/components/schemas/Stats' }
meta:
type: object
additionalProperties: true
username: { type: string }
ImagePage:
type: object
properties:
items: { type: array, items: { $ref: '#/components/schemas/Image' } }
metadata: { $ref: '#/components/schemas/Metadata' }
Creator:
type: object
properties:
username: { type: string }
image: { type: string, format: uri }
modelCount: { type: integer }
link: { type: string, format: uri }
CreatorPage:
type: object
properties:
items: { type: array, items: { $ref: '#/components/schemas/Creator' } }
metadata: { $ref: '#/components/schemas/Metadata' }
Tag:
type: object
properties:
name: { type: string }
modelCount: { type: integer }
link: { type: string, format: uri }
TagPage:
type: object
properties:
items: { type: array, items: { $ref: '#/components/schemas/Tag' } }
metadata: { $ref: '#/components/schemas/Metadata' }
User:
type: object
properties:
id: { type: integer }
username: { type: string }
email: { type: string }
image: { type: string, format: uri }
tier: { type: string, enum: [Free, Founder, Bronze, Silver, Gold] }
createdAt: { type: string, format: date-time }
PermissionResult:
type: object
properties:
entityType: { type: string }
entityId: { type: integer }
canView: { type: boolean }
canEdit: { type: boolean }
canDelete: { type: boolean }
canDownload: { type: boolean }
VaultItem:
type: object
properties:
id: { type: integer }
modelVersionId: { type: integer }
modelId: { type: integer }
addedAt: { type: string, format: date-time }
status: { type: string, enum: [Pending, Stored, Failed] }
sizeKb: { type: number }
VaultStatus:
type: object
properties:
subscribed: { type: boolean }
storageUsedKb: { type: number }
storageLimitKb: { type: number }
tier: { type: string }
Stats:
type: object
properties:
downloadCount: { type: integer }
favoriteCount: { type: integer }
commentCount: { type: integer }
ratingCount: { type: integer }
rating: { type: number }
thumbsUpCount: { type: integer }
thumbsDownCount: { type: integer }