|
swagger: '2.0'
info:
title: PeerTube
version: 1.0.0-beta
description: Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.
host: peertube.example.com
securityDefinitions:
OAuth2:
description: 'In the header: *Authorization: Bearer mytoken*'
type: oauth2
flow: password
# Not implemented yet
# authorizationUrl: https://example.com/oauth/authorize
tokenUrl: https://peertube.example.com/api/v1/users/token
basePath: '/api/v1'
schemes:
- https
paths:
'/accounts/{id}':
get:
tags:
- Accounts
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The id of the account'
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Account'
/accounts:
get:
tags:
- Accounts
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Account'
/config:
get:
tags:
- Config
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/ServerConfig'
/feeds/videos.{format}:
get:
tags:
- Feeds
produces:
- application/atom+xml
- application/rss+xml
- application/json
parameters:
- name: format
in: path
required: true
type: string
enum: [ 'xml', 'atom', 'json']
default: 'xml'
description: 'The format expected (xml defaults to RSS 2.0, atom to ATOM 1.0 and json to JSON FEED 1.0'
- name: accountId
in: query
required: false
type: number
description: 'The id of the local account to filter to (beware, users IDs and not actors IDs which will return empty feeds'
- name: accountName
in: query
required: false
type: string
description: 'The name of the local account to filter to'
responses:
'200':
description: successful operation
/jobs:
get:
security:
- OAuth2: [ ]
tags:
- Job
consumes:
- application/json
produces:
- application/json
parameters:
- name: state
in: path
required: true
type: string
description: 'The id of the account'
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: count
in: query
required: false
type: number
description: ''
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Job'
'/server/following/{host}':
delete:
security:
- OAuth2: [ ]
tags:
- ServerFollowing
consumes:
- application/json
produces:
- application/json
parameters:
- name: host
in: path
required: true
type: string
description: 'The host to unfollow '
responses:
'201':
description: successful operation
/server/followers:
get:
tags:
- ServerFollowing
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Follow'
/server/following:
get:
tags:
- ServerFollowing
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Follow'
post:
security:
- OAuth2: [ ]
tags:
- ServerFollowing
consumes:
- application/json
produces:
- application/json
parameters:
- in: body
name: body
schema:
$ref: '#/definitions/Follow'
responses:
'204':
description: successful operation
/users:
post:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- in: body
name: body
required: true
description: 'User to create'
schema:
$ref: '#/definitions/AddUser'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/AddUserResponse'
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/User'
'/users/{id}':
delete:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The user id '
responses:
'204':
description: successful operation
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The user id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/User'
put:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The user id '
- in: body
name: body
required: true
schema:
$ref: '#/definitions/UpdateUser'
responses:
'204':
description: successful operation
/users/me:
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/User'
put:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- in: body
name: body
required: true
schema:
$ref: '#/definitions/UpdateMe'
responses:
'204':
description: successful operation
/users/me/video-quota-used:
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters: []
responses:
'200':
description: successful operation
schema:
type: number
'/users/me/videos/{videoId}/rating':
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/GetMeVideoRating'
/users/me/videos:
get:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Video'
/users/register:
post:
tags:
- User
consumes:
- application/json
produces:
- application/json
parameters:
- in: body
name: body
required: true
schema:
$ref: '#/definitions/RegisterUser'
responses:
'204':
description: successful operation
/users/me/avatar/pick:
post:
security:
- OAuth2: [ ]
tags:
- User
consumes:
- multipart/form-data
produces:
- application/json
parameters:
- in: formData
name: avatarfile
type: file
description: The file to upload.
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Avatar'
/videos:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Video'
/videos/categories:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
type: string
/videos/licences:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
type: string
/videos/languages:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
type: string
/videos/privacies:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
responses:
'200':
description: successful operation
schema:
type: array
items:
type: string
/videos/search:
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/Video'
"/videos/{id}":
put:
security:
- OAuth2: [ ]
tags:
- Video
consumes:
- multipart/form-data
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id'
- name: thumbnailfile
in: formData
type: file
description: 'Video thumbnail file'
- name: previewfile
in: formData
type: file
description: 'Video preview file'
- name: category
in: formData
type: number
description: 'Video category'
- name: licence
in: formData
type: number
description: 'Video licence'
- name: language
in: formData
type: string
description: 'Video language'
- name: description
in: formData
type: string
description: 'Video description'
- name: support
in: formData
type: string
description: 'Text describing how to support the video uploader'
- name: nsfw
in: formData
type: boolean
description: 'Whether or not this video contains sensitive content'
- name: name
in: formData
type: string
description: 'Video name'
- name: tags
in: formData
type: string[]
description: 'Video tags'
- name: commentsEnabled
in: formData
type: boolean
description: 'Enable or disable comments for this video'
- name: privacy
in: formData
type: string
enum: [Public, Unlisted]
description: 'Video privacy'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Video'
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/Video'
delete:
security:
- OAuth2: [ ]
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
"/videos/{id}/description":
get:
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'200':
description: successful operation
schema:
type: string
"/videos/{id}/views":
post:
tags:
- Video
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
/videos/upload:
post:
security:
- OAuth2: [ ]
tags:
- Video
consumes:
- multipart/form-data
produces:
- application/json
parameters:
- name: videofile
in: formData
type: file
required: true
description: 'Video file'
- name: thumbnailfile
in: formData
type: file
required: true
description: 'Video thumbnail file'
- name: previewfile
in: formData
type: file
required: true
description: 'Video preview file'
- name: category
in: formData
type: number
description: 'Video category'
- name: licence
in: formData
type: number
description: 'Video licence'
- name: language
in: formData
type: string
description: 'Video language'
- name: description
in: formData
type: string
description: 'Video description'
- name: support
in: formData
type: string
description: 'Text describing how to support the video uploader'
- name: channelId
in: formData
required: true
type: number
description: 'Channel id that will contain this video'
- name: nsfw
in: formData
required: true
type: boolean
description: 'Whether or not this video contains sensitive content'
- name: name
in: formData
required: true
type: string
description: 'Video name'
- name: tags
in: formData
type: string[]
description: 'Video tags'
- name: commentsEnabled
in: formData
type: boolean
description: 'Enable or disable comments for this video'
- name: privacy
in: formData
required: true
type: string
enum: [Public, Unlisted, Private]
description: 'Video privacy'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/VideoUploadResponse'
/videos/abuse:
get:
security:
- OAuth2: [ ]
tags:
- VideoAbuse
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/VideoAbuse'
"/videos/{id}/abuse":
post:
security:
- OAuth2: [ ]
tags:
- VideoAbuse
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
"/videos/{videoId}/blacklist":
post:
security:
- OAuth2: [ ]
tags:
- VideoBlacklist
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
delete:
security:
- OAuth2: [ ]
tags:
- VideoBlacklist
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
/videos/blacklist:
get:
security:
- OAuth2: [ ]
tags:
- VideoBlacklist
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/VideoBlacklist'
/video-channels:
get:
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/VideoChannel'
/accounts/{accountId}/video-channels:
get:
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: accountId
in: path
required: true
type: string
description: 'The account id '
responses:
'200':
description: successful operation
schema:
type: array
items:
$ref: '#/definitions/VideoChannel'
post:
security:
- OAuth2: [ ]
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: accountId
in: path
required: true
type: string
description: 'The account id '
- in: body
name: body
schema:
$ref: '#/definitions/VideoChannelInput'
responses:
'204':
description: successful operation
"/account/{accountId}/video-channels/{id}":
get:
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: accountId
in: path
required: true
type: string
description: 'The account id '
- name: id
in: path
required: true
type: string
description: 'The video channel id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/VideoChannel'
put:
security:
- OAuth2: [ ]
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: accountId
in: path
required: true
type: string
description: 'The account id '
- name: id
in: path
required: true
type: string
description: 'The video channel id '
- in: body
name: body
schema:
$ref: '#/definitions/VideoChannelInput'
responses:
'204':
description: successful operation
delete:
security:
- OAuth2: [ ]
tags:
- VideoChannel
consumes:
- application/json
produces:
- application/json
parameters:
- name: accountId
in: path
required: true
type: string
description: 'The account id '
- name: id
in: path
required: true
type: string
description: 'The video channel id '
responses:
'204':
description: successful operation
"/videos/{videoId}/comment-threads":
get:
tags:
- VideoComment
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
- name: start
in: query
required: false
type: number
description: 'starting page'
- name: stop
in: query
required: false
type: number
description: 'stopping page'
- name: sort
in: query
required: false
type: number
description: 'sorting'
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/CommentThreadResponse'
post:
security:
- OAuth2: [ ]
tags:
- VideoComment
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/CommentThreadPostResponse'
"/videos/{videoId}/comment-threads/{threadId}":
get:
tags:
- VideoComment
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
- name: threadId
in: path
required: true
type: string
description: 'The thread id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/VideoCommentThreadTree'
"/videos/{videoId}/comments/{commentId}":
post:
security:
- OAuth2: [ ]
tags:
- VideoComment
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
- name: commentId
in: path
required: true
type: string
description: 'The comment id '
responses:
'200':
description: successful operation
schema:
$ref: '#/definitions/CommentThreadPostResponse'
delete:
security:
- OAuth2: [ ]
tags:
- VideoComment
consumes:
- application/json
produces:
- application/json
parameters:
- name: videoId
in: path
required: true
type: string
description: 'The video id '
- name: commentId
in: path
required: true
type: string
description: 'The comment id '
responses:
'204':
description: successful operation
"/videos/{id}/rate":
put:
security:
- OAuth2: [ ]
tags:
- VideoRate
consumes:
- application/json
produces:
- application/json
parameters:
- name: id
in: path
required: true
type: string
description: 'The video id '
responses:
'204':
description: successful operation
definitions:
VideoConstantNumber:
properties:
id:
type: number
label:
type: string
VideoConstantString:
properties:
id:
type: string
label:
type: string
VideoPrivacy:
type: string
enum: [Public, Unlisted, Private]
Video:
properties:
id:
type: number
uuid:
type: string
createdAt:
type: string
publishedAt:
type: string
updatedAt:
type: string
category:
$ref: "#/definitions/VideoConstantNumber"
licence:
$ref: "#/definitions/VideoConstantNumber"
language:
$ref: "#/definitions/VideoConstantString"
privacy:
$ref: "#/definitions/VideoPrivacy"
description:
type: string
duration:
type: number
isLocal:
type: boolean
name:
type: string
thumbnailPath:
type: string
previewPath:
type: string
embedPath:
type: string
views:
type: number
likes:
type: number
dislikes:
type: number
nsfw:
type: boolean
account:
type: object
properties:
name:
type: string
displayName:
type: string
url:
type: string
host:
type: string
avatar:
$ref: "#/definitions/Avatar"
VideoAbuse:
properties:
id:
type: number
reason:
type: string
reporterAccount:
$ref: "#/definitions/Account"
video:
type: object
properties:
id:
type: number
name:
type: string
uuid:
type: string
url:
type: string
createdAt:
type: string
VideoBlacklist:
properties:
id:
type: number
videoId:
type: number
createdAt:
type: string
updatedAt:
type: string
name:
type: string
uuid:
type: string
description:
type: string
duration:
type: number
views:
type: number
likes:
type: number
dislikes:
type: number
nsfw:
type: boolean
VideoChannel:
properties:
displayName:
type: string
description:
type: string
isLocal:
type: boolean
owner:
type: object
properties:
name:
type: string
uuid:
type: string
videos:
type: array
items:
$ref: "#/definitions/Video"
VideoComment:
properties:
id:
type: number
url:
type: string
text:
type: string
threadId:
type: number
inReplyToCommentId:
type: number
videoId:
type: number
createdAt:
type: string
updatedAt:
type: string
totalReplies:
type: number
account:
$ref: "#/definitions/Account"
VideoCommentThreadTree:
properties:
comment:
$ref: "#/definitions/VideoComment"
children:
type: array
items:
$ref: "#/definitions/VideoCommentThreadTree"
Avatar:
properties:
path:
type: string
createdAt:
type: string
updatedAt:
type: string
Actor:
properties:
id:
type: number
uuid:
type: string
url:
type: string
name:
type: string
host:
type: string
followingCount:
type: number
followersCount:
type: number
createdAt:
type: string
updatedAt:
type: string
avatar:
$ref: "#/definitions/Avatar"
Account:
allOf:
- $ref: "#/definitions/Actor"
- properties:
displayName:
type: string
User:
properties:
id:
type: number
username:
type: string
email:
type: string
displayNSFW:
type: boolean
autoPlayVideo:
type: boolean
role:
type: string
enum: [User, Moderator, Administrator]
videoQuota:
type: number
createdAt:
type: string
account:
$ref: "#/definitions/Account"
videoChannels:
type: array
items:
$ref: "#/definitions/VideoChannel"
ServerConfig:
properties:
signup:
type: object
properties:
allowed:
type: boolean
transcoding:
type: object
properties:
enabledResolutions:
type: array
items:
type: number
avatar:
type: object
properties:
file:
type: object
properties:
size:
type: object
properties:
max:
type: number
extensions:
type: array
items:
type: string
video:
type: object
properties:
file:
type: object
properties:
extensions:
type: array
items:
type: string
Follow:
properties:
id:
type: number
follower:
$ref: "#/definitions/Actor"
following:
$ref: "#/definitions/Actor"
score:
type: number
state:
type: string
enum: [pending, accepted]
createdAt:
type: string
updatedAt:
type: string
Job:
properties:
id:
type: number
state:
type: string
enum: [pending, processing, error, success]
category:
type: string
enum: [transcoding, activitypub-http]
handlerName:
type: string
handlerInputData:
type: string
createdAt:
type: string
updatedAt:
type: string
# Api responses
AddUserResponse:
properties:
id:
type: number
uuid:
type: string
VideoUploadResponse:
properties:
video:
type: object
properties:
id:
type: number
uuid:
type: string
CommentThreadResponse:
properties:
total:
type: number
data:
type: array
items:
$ref: "#/definitions/VideoComment"
CommentThreadPostResponse:
properties:
comment:
$ref: "#/definitions/VideoComment"
# Request bodies
AddUser:
properties:
username:
type: string
description: 'The user username '
password:
type: string
description: 'The user password '
email:
type: string
description: 'The user email '
videoQuota:
type: string
description: 'The user videoQuota '
role:
type: string
description: 'The user role '
required:
- username
- password
- email
- videoQuota
- role
UpdateUser:
properties:
id:
type: string
description: 'The user id '
email:
type: string
description: 'The updated email of the user '
videoQuota:
type: string
description: 'The updated videoQuota of the user '
role:
type: string
description: 'The updated role of the user '
required:
- id
- email
- videoQuota
- role
UpdateMe:
properties:
password:
type: string
description: 'Your new password '
email:
type: string
description: 'Your new email '
displayNSFW:
type: string
description: 'Your new displayNSFW '
autoPlayVideo:
type: string
description: 'Your new autoPlayVideo '
required:
- password
- email
- displayNSFW
- autoPlayVideo
GetMeVideoRating:
properties:
id:
type: string
description: 'Id of the video '
rating:
type: number
description: 'Rating of the video '
required:
- id
- rating
RegisterUser:
properties:
username:
type: string
description: 'The username of the user '
password:
type: string
description: 'The password of the user '
email:
type: string
description: 'The email of the user '
required:
- username
- password
- email
VideoChannelInput:
properties:
name:
type: string
description:
type: string
|