1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410 |
- openapi: 3.0.0
- info:
- title: PeerTube
- version: 4.0.0
- contact:
- name: PeerTube Community
- url: https://joinpeertube.org
- license:
- name: AGPLv3.0
- url: https://github.com/Chocobozzz/PeerTube/blob/master/LICENSE
- x-logo:
- url: https://joinpeertube.org/img/brand.png
- altText: PeerTube Project Homepage
- description: |
- The PeerTube API is built on HTTP(S) and is RESTful. You can use your favorite
- HTTP/REST library for your programming language to use PeerTube. The spec API is fully compatible with
- [openapi-generator](https://github.com/OpenAPITools/openapi-generator/wiki/API-client-generator-HOWTO)
- which generates a client SDK in the language of your choice - we generate some client SDKs automatically:
- - [Python](https://framagit.org/framasoft/peertube/clients/python)
- - [Go](https://framagit.org/framasoft/peertube/clients/go)
- - [Kotlin](https://framagit.org/framasoft/peertube/clients/kotlin)
- See the [REST API quick start](https://docs.joinpeertube.org/api-rest-getting-started) for a few
- examples of using the PeerTube API.
- # Authentication
- When you sign up for an account on a PeerTube instance, you are given the possibility
- to generate sessions on it, and authenticate there using an access token. Only __one
- access token can currently be used at a time__.
- ## Roles
- Accounts are given permissions based on their role. There are three roles on
- PeerTube: Administrator, Moderator, and User. See the [roles guide](https://docs.joinpeertube.org/admin-managing-users?id=roles) for a detail of their permissions.
- # Errors
- The API uses standard HTTP status codes to indicate the success or failure
- of the API call, completed by a [RFC7807-compliant](https://tools.ietf.org/html/rfc7807) response body.
- ```
- HTTP 1.1 404 Not Found
- Content-Type: application/problem+json; charset=utf-8
- {
- "detail": "Video not found",
- "docs": "https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo",
- "status": 404,
- "title": "Not Found",
- "type": "about:blank"
- }
- ```
- We provide error `type` values for [a growing number of cases](https://github.com/Chocobozzz/PeerTube/blob/develop/shared/models/server/server-error-code.enum.ts),
- but it is still optional. Types are used to disambiguate errors that bear the same status code
- and are non-obvious:
- ```
- HTTP 1.1 403 Forbidden
- Content-Type: application/problem+json; charset=utf-8
- {
- "detail": "Cannot get this video regarding follow constraints",
- "docs": "https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo",
- "status": 403,
- "title": "Forbidden",
- "type": "https://docs.joinpeertube.org/api-rest-reference.html#section/Errors/does_not_respect_follow_constraints"
- }
- ```
- Here a 403 error could otherwise mean that the video is private or blocklisted.
- ### Validation errors
- Each parameter is evaluated on its own against a set of rules before the route validator
- proceeds with potential testing involving parameter combinations. Errors coming from validation
- errors appear earlier and benefit from a more detailed error description:
- ```
- HTTP 1.1 400 Bad Request
- Content-Type: application/problem+json; charset=utf-8
- {
- "detail": "Incorrect request parameters: id",
- "docs": "https://docs.joinpeertube.org/api-rest-reference.html#operation/getVideo",
- "instance": "/api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180",
- "invalid-params": {
- "id": {
- "location": "params",
- "msg": "Invalid value",
- "param": "id",
- "value": "9c9de5e8-0a1e-484a-b099-e80766180"
- }
- },
- "status": 400,
- "title": "Bad Request",
- "type": "about:blank"
- }
- ```
- Where `id` is the name of the field concerned by the error, within the route definition.
- `invalid-params.<field>.location` can be either 'params', 'body', 'header', 'query' or 'cookies', and
- `invalid-params.<field>.value` reports the value that didn't pass validation whose `invalid-params.<field>.msg`
- is about.
- ### Deprecated error fields
- Some fields could be included with previous versions. They are still included but their use is deprecated:
- - `error`: superseded by `detail`
- - `code`: superseded by `type` (which is now an URI)
- # Rate limits
- We are rate-limiting all endpoints of PeerTube's API. Custom values can be set by administrators:
- | Endpoint (prefix: `/api/v1`) | Calls | Time frame |
- |------------------------------|---------------|--------------|
- | `/*` | 50 | 10 seconds |
- | `POST /users/token` | 15 | 5 minutes |
- | `POST /users/register` | 2<sup>*</sup> | 5 minutes |
- | `POST /users/ask-send-verify-email` | 3 | 5 minutes |
- Depending on the endpoint, <sup>*</sup>failed requests are not taken into account. A service
- limit is announced by a `429 Too Many Requests` status code.
- You can get details about the current state of your rate limit by reading the
- following headers:
- | Header | Description |
- |-------------------------|------------------------------------------------------------|
- | `X-RateLimit-Limit` | Number of max requests allowed in the current time period |
- | `X-RateLimit-Remaining` | Number of remaining requests in the current time period |
- | `X-RateLimit-Reset` | Timestamp of end of current time period as UNIX timestamp |
- | `Retry-After` | Seconds to delay after the first `429` is received |
- # CORS
- This API features [Cross-Origin Resource Sharing (CORS)](https://fetch.spec.whatwg.org/),
- allowing cross-domain communication from the browser for some routes:
- | Endpoint |
- |------------------------- ---|
- | `/api/*` |
- | `/download/*` |
- | `/lazy-static/*` |
- | `/.well-known/webfinger` |
- In addition, all routes serving ActivityPub are CORS-enabled for all origins.
- externalDocs:
- url: https://docs.joinpeertube.org/api-rest-reference.html
- tags:
- - name: Register
- description: |
- As a visitor, you can use this API to open an account (if registrations are open on
- that PeerTube instance). As an admin, you should use the dedicated [User creation
- API](#operation/addUser) instead.
- - name: Session
- x-displayName: Login/Logout
- description: |
- Sessions deal with access tokens over time. Only __one session token can currently be used at a time__.
- - name: Accounts
- description: >
- Accounts encompass remote accounts discovered across the federation,
- and correspond to the main Actor, along with video channels a user can create, which
- are also Actors.
- When a comment is posted, it is done with your Account's Actor.
- - name: Users
- description: >
- Using some features of PeerTube require authentication, for which User
- provide different levels of permission as well as associated user
- information. Each user has a corresponding local Account for federation.
- - name: My User
- description: >
- Operations related to your own User, when logged-in.
- - name: My Subscriptions
- description: >
- Operations related to your subscriptions to video channels, their
- new videos, and how to keep up to date with their latest publications!
- - name: My History
- description: >
- Operations related to your watch history.
- - name: My Notifications
- description: >
- Notifications following new videos, follows or reports. They allow you
- to keep track of the interactions and overall important information that
- concerns you. You MAY set per-notification type delivery preference, to
- receive the info either by mail, by in-browser notification or both.
- - name: Config
- description: >
- Each server exposes public information regarding supported videos and
- options.
- - name: Job
- description: >
- Jobs are long-running tasks enqueued and processed by the instance
- itself. No additional worker registration is currently available.
- - name: Instance Follows
- description: >
- Managing servers which the instance interacts with is crucial to the
- concept of federation in PeerTube and external video indexation. The PeerTube
- server then deals with inter-server ActivityPub operations and propagates
- information across its social graph by posting activities to actors' inbox
- endpoints.
- externalDocs:
- url: https://docs.joinpeertube.org/admin-following-instances?id=instances-follows
- - name: Instance Redundancy
- description: >
- Redundancy is part of the inter-server solidarity that PeerTube fosters.
- Manage the list of instances you wish to help by seeding their videos according
- to the policy of video selection of your choice. Note that you have a similar functionality
- to mirror individual videos, see [video mirroring](#tag/Video-Mirroring).
- externalDocs:
- url: https://docs.joinpeertube.org/admin-following-instances?id=instances-redundancy
- - name: Plugins
- description: >
- Managing plugins installed from a local path or from NPM, or search for new ones.
- externalDocs:
- url: https://docs.joinpeertube.org/api-plugins
- - name: Abuses
- description: |
- Abuses deal with reports of local or remote videos/comments/accounts alike.
- - name: Video
- description: |
- Operations dealing with listing, uploading, fetching or modifying videos.
- - name: Video Upload
- description: |
- Operations dealing with adding video or audio. PeerTube supports two upload modes, and three import modes.
- ### Upload
- - [_legacy_](#operation/uploadLegacy), where the video file is sent in a single request
- - [_resumable_](#operation/uploadResumableInit), where the video file is sent in chunks
- You can upload videos more reliably by using the resumable variant. Its protocol lets
- you resume an upload operation after a network interruption or other transmission failure,
- saving time and bandwidth in the event of network failures.
- Favor using resumable uploads in any of the following cases:
- - You are transferring large files
- - The likelihood of a network interruption is high
- - Uploads are originating from a device with a low-bandwidth or unstable Internet connection,
- such as a mobile device
- ### Import
- - _URL_-based: where the URL points to any service supported by [youtube-dl](https://ytdl-org.github.io/youtube-dl/)
- - _magnet_-based: where the URI resolves to a BitTorrent resource containing a single supported video file
- - _torrent_-based: where the metainfo file resolves to a BitTorrent resource containing a single supported video file
- The import function is practical when the desired video/audio is available online. It makes PeerTube
- download it for you, saving you as much bandwidth and avoiding any instability or limitation your network might have.
- - name: Video Imports
- description: Operations dealing with listing, adding and removing video imports.
- - name: Channels Sync
- description: Operations dealing with synchronizing PeerTube user's channel with channels of other platforms
- - name: Video Captions
- description: Operations dealing with listing, adding and removing closed captions of a video.
- - name: Video Channels
- description: Operations dealing with the creation, modification and listing of videos within a channel.
- - name: Video Comments
- description: >
- Operations dealing with comments to a video. Comments are organized in threads: adding a
- comment in response to the video starts a thread, adding a reply to a comment adds it to
- its root comment thread.
- - name: Video Blocks
- description: Operations dealing with blocking videos (removing them from view and preventing interactions).
- - name: Video Rates
- description: Like/dislike a video.
- - name: Video Playlists
- description: Operations dealing with playlists of videos. Playlists are bound to users and/or channels.
- - name: Video Files
- description: Operations on video files
- - name: Video Transcoding
- description: Video transcoding related operations
- - name: Video stats
- description: Video statistics
- - name: Feeds
- description: Server syndication feeds
- - name: Search
- description: |
- The search helps to find _videos_ or _channels_ from within the instance and beyond.
- Videos from other instances federated by the instance (that is, instances
- followed by the instance) can be found via keywords and other criteria of
- the advanced search.
- Administrators can also enable the use of a remote search system, indexing
- videos and channels not could be not federated by the instance.
- - name: Homepage
- description: Get and update the custom homepage
- - name: Video Mirroring
- description: |
- PeerTube instances can mirror videos from one another, and help distribute some videos.
- For importing videos as your own, refer to [video imports](#operation/importVideo).
- - name: Stats
- description: |
- Statistics
- x-tagGroups:
- - name: Auth
- tags:
- - Register
- - Session
- - name: Accounts
- tags:
- - Accounts
- - Users
- - My User
- - My Subscriptions
- - My Notifications
- - My History
- - name: Videos
- tags:
- - Video
- - Video Upload
- - Video Imports
- - Video Captions
- - Video Channels
- - Video Comments
- - Video Rates
- - Video Playlists
- - Video Stats
- - Video Ownership Change
- - Video Mirroring
- - Video Files
- - Video Transcoding
- - Live Videos
- - Feeds
- - Channels Sync
- - name: Search
- tags:
- - Search
- - name: Moderation
- tags:
- - Abuses
- - Video Blocks
- - Account Blocks
- - Server Blocks
- - name: Instance
- tags:
- - Config
- - Homepage
- - Instance Follows
- - Instance Redundancy
- - Plugins
- - Stats
- - Logs
- - Job
- paths:
- '/accounts/{name}':
- get:
- tags:
- - Accounts
- summary: Get an account
- operationId: getAccount
- parameters:
- - $ref: '#/components/parameters/name'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Account'
- '404':
- description: account not found
- '/accounts/{name}/videos':
- get:
- tags:
- - Accounts
- - Video
- summary: 'List videos of an account'
- operationId: getAccountVideos
- parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- x-codeSamples:
- - lang: JavaScript
- source: |
- fetch('https://peertube2.cpy.re/api/v1/accounts/{name}/videos')
- .then(function(response) {
- return response.json()
- }).then(function(data) {
- console.log(data)
- })
- - lang: Shell
- source: |
- ## DEPENDENCIES: jq
- curl -s https://peertube2.cpy.re/api/v1/accounts/{name}/videos | jq
- - lang: Ruby
- source: |
- require 'net/http'
- require 'json'
- uri = URI.parse("https://peertube2.cpy.re/api/v1/accounts/{name}/videos")
- http = Net::HTTP.new(uri.host, uri.port)
- http.use_ssl = true
- response = http.get(uri.request_uri)
- puts JSON.parse(response.read_body)
- - lang: Python
- source: |
- import requests
- r = requests.get("https://peertube2.cpy.re/api/v1//accounts/{name}/videos")
- json = r.json()
- print(json)
- '/accounts/{name}/followers':
- get:
- tags:
- - Accounts
- summary: 'List followers of an account'
- security:
- - OAuth2: []
- operationId: getAccountFollowers
- parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/followersSort'
- - $ref: '#/components/parameters/search'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
- /accounts:
- get:
- tags:
- - Accounts
- summary: List accounts
- operationId: getAccounts
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- 'application/json':
- schema:
- type: array
- items:
- $ref: '#/components/schemas/Account'
- /config:
- get:
- tags:
- - Config
- summary: Get instance public configuration
- operationId: getConfig
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ServerConfig'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/config
- /config/about:
- get:
- summary: Get instance "About" information
- operationId: getAbout
- tags:
- - Config
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ServerConfigAbout'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/config/about
- /config/custom:
- get:
- summary: Get instance runtime configuration
- operationId: getCustomConfig
- tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ServerConfigCustom'
- put:
- summary: Set instance runtime configuration
- operationId: putCustomConfig
- tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- '400':
- x-summary: field inconsistencies
- description: >
- Arises when:
- - the emailer is disabled and the instance is open to registrations
- - webtorrent and hls are disabled with transcoding enabled - you need at least one enabled
- delete:
- summary: Delete instance runtime configuration
- operationId: delCustomConfig
- tags:
- - Config
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- /custom-pages/homepage/instance:
- get:
- summary: Get instance custom homepage
- tags:
- - Homepage
- responses:
- '404':
- description: No homepage set
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/CustomHomepage'
- put:
- summary: Set instance custom homepage
- tags:
- - Homepage
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- content:
- type: string
- description: content of the homepage, that will be injected in the client
- responses:
- '204':
- description: successful operation
- /jobs/pause:
- post:
- summary: Pause job queue
- security:
- - OAuth2:
- - admin
- tags:
- - Job
- responses:
- '204':
- description: successful operation
- /jobs/resume:
- post:
- summary: Resume job queue
- security:
- - OAuth2:
- - admin
- tags:
- - Job
- responses:
- '204':
- description: successful operation
- /jobs/{state}:
- get:
- summary: List instance jobs
- operationId: getJobs
- security:
- - OAuth2:
- - admin
- tags:
- - Job
- parameters:
- - name: state
- in: path
- required: true
- description: The state of the job ('' for for no filter)
- schema:
- type: string
- enum:
- - ''
- - active
- - completed
- - failed
- - waiting
- - delayed
- - $ref: '#/components/parameters/jobType'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/Job'
- /server/followers:
- get:
- tags:
- - Instance Follows
- summary: List instances following the server
- parameters:
- - $ref: '#/components/parameters/followState'
- - $ref: '#/components/parameters/actorType'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
- '/server/followers/{nameWithHost}':
- delete:
- summary: Remove or reject a follower to your server
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
- responses:
- '204':
- description: successful operation
- '404':
- description: follower not found
- '/server/followers/{nameWithHost}/reject':
- post:
- summary: Reject a pending follower to your server
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
- responses:
- '204':
- description: successful operation
- '404':
- description: follower not found
- '/server/followers/{nameWithHost}/accept':
- post:
- summary: Accept a pending follower to your server
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: nameWithHost
- in: path
- required: true
- description: The remote actor handle to remove from your followers
- schema:
- type: string
- format: email
- responses:
- '204':
- description: successful operation
- '404':
- description: follower not found
- /server/following:
- get:
- tags:
- - Instance Follows
- summary: List instances followed by the server
- parameters:
- - $ref: '#/components/parameters/followState'
- - $ref: '#/components/parameters/actorType'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
- post:
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- summary: Follow a list of actors (PeerTube instance, channel or account)
- responses:
- '204':
- description: successful operation
- '500':
- description: cannot follow a non-HTTPS server
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- hosts:
- type: array
- items:
- type: string
- format: hostname
- uniqueItems: true
- handles:
- type: array
- items:
- type: string
- uniqueItems: true
- '/server/following/{hostOrHandle}':
- delete:
- summary: Unfollow an actor (PeerTube instance, channel or account)
- security:
- - OAuth2:
- - admin
- tags:
- - Instance Follows
- parameters:
- - name: hostOrHandle
- in: path
- required: true
- description: The hostOrHandle to unfollow
- schema:
- type: string
- responses:
- '204':
- description: successful operation
- '404':
- description: host or handle not found
- /users:
- post:
- summary: Create a user
- operationId: addUser
- security:
- - OAuth2:
- - admin
- tags:
- - Users
- responses:
- '200':
- description: user created
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AddUserResponse'
- links:
- # GET /users/{id}
- GetUser:
- operationId: getUser
- parameters:
- id: '$response.body#/user/id'
- # PUT /users/{id}
- PutUser:
- operationId: putUser
- parameters:
- id: '$response.body#/user/id'
- # DELETE /users/{id}
- DelUser:
- operationId: delUser
- parameters:
- id: '$response.body#/user/id'
- '403':
- description: insufficient authority to create an admin or moderator
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AddUser'
- description: |
- If the smtp server is configured, you can leave the password empty and an email will be sent
- asking the user to set it first.
- required: true
- get:
- summary: List users
- operationId: getUsers
- security:
- - OAuth2:
- - admin
- tags:
- - Users
- parameters:
- - $ref: '#/components/parameters/usersSearch'
- - $ref: '#/components/parameters/usersBlocked'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/usersSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/User'
- '/users/{id}':
- parameters:
- - $ref: '#/components/parameters/id'
- delete:
- summary: Delete a user
- security:
- - OAuth2:
- - admin
- tags:
- - Users
- operationId: delUser
- responses:
- '204':
- description: successful operation
- get:
- summary: Get a user
- security:
- - OAuth2: []
- tags:
- - Users
- operationId: getUser
- parameters:
- - name: withStats
- in: query
- description: include statistics about the user (only available as a moderator/admin)
- schema:
- type: boolean
- responses:
- '200':
- x-summary: successful operation
- description: |
- As an admin/moderator, you can request a response augmented with statistics about the user's
- moderation relations and videos usage, by using the `withStats` parameter.
- content:
- application/json:
- schema:
- oneOf:
- - $ref: '#/components/schemas/User'
- - $ref: '#/components/schemas/UserWithStats'
- put:
- summary: Update a user
- security:
- - OAuth2: []
- tags:
- - Users
- operationId: putUser
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UpdateUser'
- required: true
- /oauth-clients/local:
- get:
- summary: Login prerequisite
- description: You need to retrieve a client id and secret before [logging in](#operation/getOAuthToken).
- operationId: getOAuthClient
- tags:
- - Session
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/OAuthClient'
- links:
- UseOAuthClientToLogin:
- operationId: getOAuthToken
- parameters:
- client_id: '$response.body#/client_id'
- client_secret: '$response.body#/client_secret'
- x-codeSamples:
- - lang: Shell
- source: |
- API="https://peertube2.cpy.re/api/v1"
- ## AUTH
- curl -s "$API/oauth-clients/local"
- /users/token:
- post:
- summary: Login
- operationId: getOAuthToken
- description: With your [client id and secret](#operation/getOAuthClient), you can retrieve an access and refresh tokens.
- tags:
- - Session
- requestBody:
- content:
- application/x-www-form-urlencoded:
- schema:
- oneOf:
- - $ref: '#/components/schemas/OAuthToken-password'
- - $ref: '#/components/schemas/OAuthToken-refresh_token'
- discriminator:
- propertyName: grant_type
- mapping:
- password: '#/components/schemas/OAuthToken-password'
- refresh_token: '#/components/schemas/OAuthToken-refresh_token'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- token_type:
- type: string
- example: Bearer
- access_token:
- type: string
- example: 90286a0bdf0f7315d9d3fe8dabf9e1d2be9c97d0
- description: valid for 1 day
- refresh_token:
- type: string
- example: 2e0d675df9fc96d2e4ec8a3ebbbf45eca9137bb7
- description: valid for 2 weeks
- expires_in:
- type: integer
- minimum: 0
- example: 14399
- refresh_token_expires_in:
- type: integer
- minimum: 0
- example: 1209600
- '400':
- x-summary: client or credentials are invalid
- description: |
- Disambiguate via `type`:
- - `invalid_client` for an unmatched `client_id`
- - `invalid_grant` for unmatched credentials
- '401':
- x-summary: token expired
- description: |
- Disambiguate via `type`:
- - default value for a regular authentication failure
- - `invalid_token` for an expired token
- x-codeSamples:
- - lang: Shell
- source: |
- ## DEPENDENCIES: jq
- API="https://peertube2.cpy.re/api/v1"
- USERNAME="<your_username>"
- PASSWORD="<your_password>"
- ## AUTH
- client_id=$(curl -s "$API/oauth-clients/local" | jq -r ".client_id")
- client_secret=$(curl -s "$API/oauth-clients/local" | jq -r ".client_secret")
- curl -s "$API/users/token" \
- --data client_id="$client_id" \
- --data client_secret="$client_secret" \
- --data grant_type=password \
- --data username="$USERNAME" \
- --data password="$PASSWORD" \
- | jq -r ".access_token"
- /users/revoke-token:
- post:
- summary: Logout
- description: Revokes your access token and its associated refresh token, destroying your current session.
- operationId: revokeOAuthToken
- tags:
- - Session
- security:
- - OAuth2: []
- responses:
- '200':
- description: successful operation
- /users/register:
- post:
- summary: Register a user
- operationId: registerUser
- tags:
- - Users
- - Register
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/RegisterUser'
- required: true
- /users/{id}/verify-email:
- post:
- summary: Verify a user
- operationId: verifyUser
- description: |
- Following a user registration, the new user will receive an email asking to click a link
- containing a secret.
- tags:
- - Users
- - Register
- parameters:
- - $ref: '#/components/parameters/id'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- verificationString:
- type: string
- format: url
- isPendingEmail:
- type: boolean
- required:
- - verificationString
- responses:
- '204':
- description: successful operation
- '403':
- description: invalid verification string
- '404':
- description: user not found
- /users/{id}/two-factor/request:
- post:
- summary: Request two factor auth
- operationId: requestTwoFactor
- description: Request two factor authentication for a user
- tags:
- - Users
- parameters:
- - $ref: '#/components/parameters/id'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- currentPassword:
- type: string
- description: Password of the currently authenticated user
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/RequestTwoFactorResponse'
- '403':
- description: invalid password
- '404':
- description: user not found
- /users/{id}/two-factor/confirm-request:
- post:
- summary: Confirm two factor auth
- operationId: confirmTwoFactorRequest
- description: Confirm a two factor authentication request
- tags:
- - Users
- parameters:
- - $ref: '#/components/parameters/id'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- requestToken:
- type: string
- description: Token to identify the two factor request
- otpToken:
- type: string
- description: OTP token generated by the app
- required:
- - requestToken
- - otpToken
- responses:
- '204':
- description: successful operation
- '403':
- description: invalid request token or OTP token
- '404':
- description: user not found
- /users/{id}/two-factor/disable:
- post:
- summary: Disable two factor auth
- operationId: disableTwoFactor
- description: Disable two factor authentication of a user
- tags:
- - Users
- parameters:
- - $ref: '#/components/parameters/id'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- currentPassword:
- type: string
- description: Password of the currently authenticated user
- responses:
- '204':
- description: successful operation
- '403':
- description: invalid password
- '404':
- description: user not found
- /users/ask-send-verify-email:
- post:
- summary: Resend user verification link
- operationId: resendEmailToVerifyUser
- tags:
- - Users
- - Register
- responses:
- '204':
- description: successful operation
- /users/me:
- get:
- summary: Get my user information
- operationId: getUserInfo
- security:
- - OAuth2:
- - user
- tags:
- - My User
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/User'
- put:
- summary: Update my user information
- operationId: putUserInfo
- security:
- - OAuth2:
- - user
- tags:
- - My User
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UpdateMe'
- required: true
- /users/me/videos/imports:
- get:
- summary: Get video imports of my user
- security:
- - OAuth2:
- - user
- tags:
- - Videos
- - My User
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- -
- name: targetUrl
- in: query
- required: false
- description: Filter on import target URL
- schema:
- type: string
- -
- name: videoChannelSyncId
- in: query
- required: false
- description: Filter on imports created by a specific channel synchronization
- schema:
- type: number
- -
- name: search
- in: query
- required: false
- description: Search in video names
- schema:
- type: string
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoImportsList'
- /users/me/video-quota-used:
- get:
- summary: Get my user used quota
- security:
- - OAuth2:
- - user
- tags:
- - My User
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoQuotaUsed:
- type: number
- description: The user video quota used so far in bytes
- example: 16810141515
- videoQuotaUsedDaily:
- type: number
- description: The user video quota used today in bytes
- example: 1681014151
- '/users/me/videos/{videoId}/rating':
- get:
- summary: Get rate of my user for a video
- security:
- - OAuth2: []
- tags:
- - My User
- - Video Rates
- parameters:
- - name: videoId
- in: path
- required: true
- description: The video id
- schema:
- $ref: '#/components/schemas/Video/properties/id'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetMeVideoRating'
- /users/me/videos:
- get:
- summary: Get videos of my user
- security:
- - OAuth2:
- - user
- tags:
- - My User
- - Videos
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- /users/me/subscriptions:
- get:
- summary: Get my user subscriptions
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelList'
- post:
- tags:
- - My Subscriptions
- summary: Add subscription to my user
- security:
- - OAuth2:
- - user
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- uri:
- type: string
- format: uri
- description: uri of the video channels to subscribe to
- required:
- - uri
- examples:
- default:
- value:
- uri: 008a0e54-375d-49d0-8379-143202e24152@video.lqdn.fr
- responses:
- '200':
- description: successful operation
- /users/me/subscriptions/exist:
- get:
- summary: Get if subscriptions exist for my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionsUris'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- /users/me/subscriptions/videos:
- get:
- summary: List videos of subscriptions of my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- - Videos
- parameters:
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- '/users/me/subscriptions/{subscriptionHandle}':
- get:
- summary: Get subscription of my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionHandle'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannel'
- delete:
- summary: Delete subscription of my user
- security:
- - OAuth2:
- - user
- tags:
- - My Subscriptions
- parameters:
- - $ref: '#/components/parameters/subscriptionHandle'
- responses:
- '200':
- description: successful operation
- /users/me/notifications:
- get:
- summary: List my notifications
- security:
- - OAuth2: []
- tags:
- - My Notifications
- parameters:
- - name: unread
- in: query
- description: only list unread notifications
- schema:
- type: boolean
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/NotificationListResponse'
- /users/me/notifications/read:
- post:
- summary: Mark notifications as read by their id
- security:
- - OAuth2: []
- tags:
- - My Notifications
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- ids:
- type: array
- description: ids of the notifications to mark as read
- items:
- type: integer
- required:
- - ids
- responses:
- '204':
- description: successful operation
- /users/me/notifications/read-all:
- post:
- summary: Mark all my notification as read
- security:
- - OAuth2: []
- tags:
- - My Notifications
- responses:
- '204':
- description: successful operation
- /users/me/notification-settings:
- put:
- summary: Update my notification settings
- security:
- - OAuth2: []
- tags:
- - My Notifications
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- newVideoFromSubscription:
- $ref: '#/components/schemas/NotificationSettingValue'
- newCommentOnMyVideo:
- $ref: '#/components/schemas/NotificationSettingValue'
- abuseAsModerator:
- $ref: '#/components/schemas/NotificationSettingValue'
- videoAutoBlacklistAsModerator:
- $ref: '#/components/schemas/NotificationSettingValue'
- blacklistOnMyVideo:
- $ref: '#/components/schemas/NotificationSettingValue'
- myVideoPublished:
- $ref: '#/components/schemas/NotificationSettingValue'
- myVideoImportFinished:
- $ref: '#/components/schemas/NotificationSettingValue'
- newFollow:
- $ref: '#/components/schemas/NotificationSettingValue'
- newUserRegistration:
- $ref: '#/components/schemas/NotificationSettingValue'
- commentMention:
- $ref: '#/components/schemas/NotificationSettingValue'
- newInstanceFollower:
- $ref: '#/components/schemas/NotificationSettingValue'
- autoInstanceFollowing:
- $ref: '#/components/schemas/NotificationSettingValue'
- responses:
- '204':
- description: successful operation
- /users/me/history/videos:
- get:
- summary: List watched videos history
- security:
- - OAuth2: []
- tags:
- - My History
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/search'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- /users/me/history/videos/{videoId}:
- delete:
- summary: Delete history element
- security:
- - OAuth2: []
- tags:
- - My History
- parameters:
- - name: videoId
- in: path
- required: true
- schema:
- $ref: '#/components/schemas/Video/properties/id'
- responses:
- '204':
- description: successful operation
- /users/me/history/videos/remove:
- post:
- summary: Clear video history
- security:
- - OAuth2: []
- tags:
- - My History
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- beforeDate:
- description: history before this date will be deleted
- type: string
- format: date-time
- responses:
- '204':
- description: successful operation
- /users/me/avatar/pick:
- post:
- summary: Update my user avatar
- security:
- - OAuth2: []
- tags:
- - My User
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- '413':
- description: image file too large
- headers:
- X-File-Maximum-Size:
- schema:
- type: string
- format: Nginx size
- description: Maximum file size for the avatar
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- avatarfile:
- description: The file to upload
- type: string
- format: binary
- encoding:
- avatarfile:
- contentType: image/png, image/jpeg
- /users/me/avatar:
- delete:
- summary: Delete my avatar
- security:
- - OAuth2: []
- tags:
- - My User
- responses:
- '204':
- description: successful operation
- /videos/ownership:
- get:
- summary: List video ownership changes
- tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- responses:
- '200':
- description: successful operation
- '/videos/ownership/{id}/accept':
- post:
- summary: Accept ownership change request
- tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '403':
- description: cannot terminate an ownership change of another user
- '404':
- description: video ownership change not found
- '/videos/ownership/{id}/refuse':
- post:
- summary: Refuse ownership change request
- tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '403':
- description: cannot terminate an ownership change of another user
- '404':
- description: video ownership change not found
- '/videos/{id}/give-ownership':
- post:
- summary: Request ownership change
- tags:
- - Video Ownership Change
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- required: true
- content:
- application/x-www-form-urlencoded:
- schema:
- type: object
- properties:
- username:
- type: string
- required:
- - username
- responses:
- '204':
- description: successful operation
- '400':
- description: changing video ownership to a remote account is not supported yet
- '404':
- description: video not found
- /videos/{id}/studio/edit:
- post:
- summary: Create a studio task
- tags:
- - Video Transcoding
- - Video
- description: Create a task to edit a video (cut, add intro/outro etc)
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- required: true
- content:
- application/x-www-form-urlencoded:
- schema:
- $ref: '#/components/schemas/VideoStudioCreateTask'
- responses:
- '204':
- description: successful operation
- '400':
- description: incorrect parameters
- '404':
- description: video not found
- /videos:
- get:
- summary: List videos
- operationId: getVideos
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- /videos/categories:
- get:
- summary: List available video categories
- operationId: getCategories
- tags:
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/categories
- /videos/licences:
- get:
- summary: List available video licences
- operationId: getLicences
- tags:
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/licences
- /videos/languages:
- get:
- summary: List available video languages
- operationId: getLanguages
- tags:
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/languages
- /videos/privacies:
- get:
- summary: List available video privacy policies
- operationId: getPrivacyPolicies
- tags:
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/videos/privacies
- '/videos/{id}':
- put:
- summary: Update a video
- operationId: putVideo
- security:
- - OAuth2: []
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- thumbnailfile:
- description: Video thumbnail file
- type: string
- format: binary
- previewfile:
- description: Video preview file
- type: string
- format: binary
- category:
- $ref: '#/components/schemas/VideoCategorySet'
- licence:
- $ref: '#/components/schemas/VideoLicenceSet'
- language:
- $ref: '#/components/schemas/VideoLanguageSet'
- privacy:
- $ref: '#/components/schemas/VideoPrivacySet'
- description:
- description: Video description
- type: string
- waitTranscoding:
- description: Whether or not we wait transcoding before publish the video
- type: string
- support:
- description: A text tell the audience how to support the video creator
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- type: string
- nsfw:
- description: Whether or not this video contains sensitive content
- type: boolean
- name:
- description: Video name
- type: string
- minLength: 3
- maxLength: 120
- tags:
- description: Video tags (maximum 5 tags each between 2 and 30 characters)
- type: array
- minItems: 1
- maxItems: 5
- items:
- type: string
- minLength: 2
- maxLength: 30
- commentsEnabled:
- description: Enable or disable comments for this video
- type: boolean
- downloadEnabled:
- description: Enable or disable downloading for this video
- type: boolean
- originallyPublishedAt:
- description: Date when the content was originally published
- type: string
- format: date-time
- scheduleUpdate:
- $ref: '#/components/schemas/VideoScheduledUpdate'
- encoding:
- thumbnailfile:
- contentType: image/jpeg
- previewfile:
- contentType: image/jpeg
- get:
- summary: Get a video
- operationId: getVideo
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoDetails'
- delete:
- summary: Delete a video
- operationId: delVideo
- security:
- - OAuth2: []
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '/videos/{id}/description':
- get:
- summary: Get complete video description
- operationId: getVideoDesc
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- nullable: true
- type: string
- minLength: 3
- maxLength: 10000
- example: |
- **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n**Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)**
- '/videos/{id}/source':
- post:
- summary: Get video source file metadata
- operationId: getVideoSource
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoSource'
- '/videos/{id}/views':
- post:
- summary: Notify user is watching a video
- description: Call this endpoint regularly (every 5-10 seconds for example) to notify the server the user is watching the video. After a while, PeerTube will increase video's viewers counter. If the user is authenticated, PeerTube will also store the current player time.
- operationId: addView
- tags:
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserViewingVideo'
- required: true
- responses:
- '204':
- description: successful operation
- '/videos/{id}/watching':
- put:
- summary: Set watching progress of a video
- deprecated: true
- description: This endpoint has been deprecated. Use `/videos/{id}/views` instead
- tags:
- - Video
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/UserViewingVideo'
- required: true
- responses:
- '204':
- description: successful operation
- '/videos/{id}/stats/overall':
- get:
- summary: Get overall stats of a video
- tags:
- - Video Stats
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - name: startDate
- in: query
- description: Filter stats by start date
- schema:
- type: string
- format: date-time
- - name: endDate
- in: query
- description: Filter stats by end date
- schema:
- type: string
- format: date-time
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoStatsOverall'
- '/videos/{id}/stats/retention':
- get:
- summary: Get retention stats of a video
- tags:
- - Video Stats
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoStatsRetention'
- '/videos/{id}/stats/timeseries/{metric}':
- get:
- summary: Get timeserie stats of a video
- tags:
- - Video Stats
- security:
- - OAuth2: []
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- -
- name: metric
- in: path
- required: true
- description: The metric to get
- schema:
- type: string
- enum:
- - 'viewers'
- - 'aggregateWatchTime'
- - name: startDate
- in: query
- description: Filter stats by start date
- schema:
- type: string
- format: date-time
- - name: endDate
- in: query
- description: Filter stats by end date
- schema:
- type: string
- format: date-time
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoStatsTimeserie'
- /videos/upload:
- post:
- summary: Upload a video
- description: Uses a single request to upload a video.
- operationId: uploadLegacy
- security:
- - OAuth2: []
- tags:
- - Video
- - Video Upload
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoUploadResponse'
- '403':
- description: video didn't pass upload filter
- '408':
- description: upload has timed out
- '413':
- x-summary: video file too large, due to quota or max body size limit set by the reverse-proxy
- description: |
- If the response has no body, it means the reverse-proxy didn't let it through. Otherwise disambiguate via `type`:
- - `quota_reached` for quota limits whether daily or global
- headers:
- X-File-Maximum-Size:
- schema:
- type: string
- format: Nginx size
- description: Maximum file size for the video
- '415':
- description: video type unsupported
- '422':
- description: video unreadable
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/VideoUploadRequestLegacy'
- encoding:
- videofile:
- contentType: video/mp4, video/webm, video/ogg, video/avi, video/quicktime, video/x-msvideo, video/x-flv, video/x-matroska, application/octet-stream
- thumbnailfile:
- contentType: image/jpeg
- previewfile:
- contentType: image/jpeg
- x-codeSamples:
- - lang: Shell
- source: |
- ## DEPENDENCIES: jq
- USERNAME="<your_username>"
- PASSWORD="<your_password>"
- FILE_PATH="<your_file_path>"
- CHANNEL_ID="<your_channel_id>"
- NAME="<video_name>"
- API="https://peertube2.cpy.re/api/v1"
- ## AUTH
- client_id=$(curl -s "$API/oauth-clients/local" | jq -r ".client_id")
- client_secret=$(curl -s "$API/oauth-clients/local" | jq -r ".client_secret")
- token=$(curl -s "$API/users/token" \
- --data client_id="$client_id" \
- --data client_secret="$client_secret" \
- --data grant_type=password \
- --data username="$USERNAME" \
- --data password="$PASSWORD" \
- | jq -r ".access_token")
- ## VIDEO UPLOAD
- curl -s "$API/videos/upload" \
- -H "Authorization: Bearer $token" \
- --max-time 600 \
- --form videofile=@"$FILE_PATH" \
- --form channelId=$CHANNEL_ID \
- --form name="$NAME"
- /videos/upload-resumable:
- post:
- summary: Initialize the resumable upload of a video
- description: Uses [a resumable protocol](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) to initialize the upload of a video
- operationId: uploadResumableInit
- security:
- - OAuth2: []
- tags:
- - Video
- - Video Upload
- parameters:
- - name: X-Upload-Content-Length
- in: header
- schema:
- type: number
- example: 2469036
- required: true
- description: Number of bytes that will be uploaded in subsequent requests. Set this value to the size of the file you are uploading.
- - name: X-Upload-Content-Type
- in: header
- schema:
- type: string
- format: mimetype
- example: video/mp4
- required: true
- description: MIME type of the file that you are uploading. Depending on your instance settings, acceptable values might vary.
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoUploadRequestResumable'
- responses:
- '200':
- description: file already exists, send a [`resume`](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) request instead
- '201':
- description: created
- headers:
- Location:
- schema:
- type: string
- format: url
- example: /api/v1/videos/upload-resumable?upload_id=471e97554f21dec3b8bb5d4602939c51
- Content-Length:
- schema:
- type: number
- example: 0
- '413':
- x-summary: video file too large, due to quota, absolute max file size or concurrent partial upload limit
- description: |
- Disambiguate via `type`:
- - `max_file_size_reached` for the absolute file size limit
- - `quota_reached` for quota limits whether daily or global
- '415':
- description: video type unsupported
- put:
- summary: Send chunk for the resumable upload of a video
- description: Uses [a resumable protocol](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) to continue, pause or resume the upload of a video
- operationId: uploadResumable
- security:
- - OAuth2: []
- tags:
- - Video
- - Video Upload
- parameters:
- - name: upload_id
- in: query
- required: true
- description: |
- Created session id to proceed with. If you didn't send chunks in the last hour, it is
- not valid anymore and you need to initialize a new upload.
- schema:
- type: string
- - name: Content-Range
- in: header
- schema:
- type: string
- example: bytes 0-262143/2469036
- required: true
- description: |
- Specifies the bytes in the file that the request is uploading.
- For example, a value of `bytes 0-262143/1000000` shows that the request is sending the first
- 262144 bytes (256 x 1024) in a 2,469,036 byte file.
- - name: Content-Length
- in: header
- schema:
- type: number
- example: 262144
- required: true
- description: |
- Size of the chunk that the request is sending.
- Remember that larger chunks are more efficient. PeerTube's web client uses chunks varying from
- 1048576 bytes (~1MB) and increases or reduces size depending on connection health.
- requestBody:
- content:
- application/octet-stream:
- schema:
- type: string
- format: binary
- responses:
- '200':
- description: last chunk received
- headers:
- Content-Length:
- schema:
- type: number
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoUploadResponse'
- '308':
- description: resume incomplete
- headers:
- Range:
- schema:
- type: string
- example: bytes=0-262143
- Content-Length:
- schema:
- type: number
- example: 0
- '403':
- description: video didn't pass upload filter
- '404':
- description: upload not found
- '409':
- description: chunk doesn't match range
- '422':
- description: video unreadable
- '429':
- description: too many concurrent requests
- '503':
- description: upload is already being processed
- headers:
- 'Retry-After':
- schema:
- type: number
- example: 300
- delete:
- summary: Cancel the resumable upload of a video, deleting any data uploaded so far
- description: Uses [a resumable protocol](https://github.com/kukhariev/node-uploadx/blob/master/proto.md) to cancel the upload of a video
- operationId: uploadResumableCancel
- security:
- - OAuth2: []
- tags:
- - Video
- - Video Upload
- parameters:
- - name: upload_id
- in: query
- required: true
- description: |
- Created session id to proceed with. If you didn't send chunks in the last 12 hours, it is
- not valid anymore and the upload session has already been deleted with its data ;-)
- schema:
- type: string
- - name: Content-Length
- in: header
- required: true
- schema:
- type: number
- example: 0
- responses:
- '204':
- description: upload cancelled
- headers:
- Content-Length:
- schema:
- type: number
- example: 0
- '404':
- description: upload not found
- /videos/imports:
- post:
- summary: Import a video
- description: Import a torrent or magnetURI or HTTP resource (if enabled by the instance administrator)
- operationId: importVideo
- security:
- - OAuth2: []
- tags:
- - Video Imports
- - Video Upload
- requestBody:
- content:
- multipart/form-data:
- schema:
- $ref: '#/components/schemas/VideoCreateImport'
- encoding:
- torrentfile:
- contentType: application/x-bittorrent
- thumbnailfile:
- contentType: image/jpeg
- previewfile:
- contentType: image/jpeg
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoUploadResponse'
- '400':
- description: '`magnetUri` or `targetUrl` or a torrent file missing'
- '403':
- description: video didn't pass pre-import filter
- '409':
- description: HTTP or Torrent/magnetURI import not enabled
- /videos/imports/{id}/cancel:
- post:
- summary: Cancel video import
- description: Cancel a pending video import
- security:
- - OAuth2: []
- tags:
- - Video Imports
- parameters:
- - $ref: '#/components/parameters/id'
- responses:
- '204':
- description: successful operation
- /videos/imports/{id}:
- delete:
- summary: Delete video import
- description: Delete ended video import
- security:
- - OAuth2: []
- tags:
- - Video Imports
- parameters:
- - $ref: '#/components/parameters/id'
- responses:
- '204':
- description: successful operation
- /videos/live:
- post:
- summary: Create a live
- operationId: addLive
- security:
- - OAuth2: []
- tags:
- - Live Videos
- - Video
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoUploadResponse'
- '400':
- x-summary: validation error, or conflicting `saveReplay` and `permanentLive` parameter set
- description: |
- Disambiguate via `type`:
- - default type for a validation error
- - `live_conflicting_permanent_and_save_replay` for conflicting parameters set
- '403':
- x-summary: live is not enabled, allow replay is not enabled, or max instance/user live videos limit is exceeded
- description: |
- Disambiguate via `type`:
- - `live_not_enabled` for a disabled live feature
- - `live_not_allowing_replay` for a disabled replay feature
- - `max_instance_lives_limit_reached` for the absolute concurrent live limit
- - `max_user_lives_limit_reached` for the user concurrent live limit
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- channelId:
- description: Channel id that will contain this live video
- type: integer
- saveReplay:
- type: boolean
- permanentLive:
- description: User can stream multiple times in a permanent live
- type: boolean
- latencyMode:
- description: User can select live latency mode if enabled by the instance
- $ref: '#/components/schemas/LiveVideoLatencyMode'
- thumbnailfile:
- description: Live video/replay thumbnail file
- type: string
- format: binary
- previewfile:
- description: Live video/replay preview file
- type: string
- format: binary
- privacy:
- $ref: '#/components/schemas/VideoPrivacySet'
- category:
- $ref: '#/components/schemas/VideoCategorySet'
- licence:
- $ref: '#/components/schemas/VideoLicenceSet'
- language:
- $ref: '#/components/schemas/VideoLanguageSet'
- description:
- description: Live video/replay description
- type: string
- support:
- description: A text tell the audience how to support the creator
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- type: string
- nsfw:
- description: Whether or not this live video/replay contains sensitive content
- type: boolean
- name:
- description: Live video/replay name
- type: string
- minLength: 3
- maxLength: 120
- tags:
- description: Live video/replay tags (maximum 5 tags each between 2 and 30 characters)
- type: array
- minItems: 1
- maxItems: 5
- items:
- type: string
- minLength: 2
- maxLength: 30
- commentsEnabled:
- description: Enable or disable comments for this live video/replay
- type: boolean
- downloadEnabled:
- description: Enable or disable downloading for the replay of this live video
- type: boolean
- required:
- - channelId
- - name
- encoding:
- thumbnailfile:
- contentType: image/jpeg
- previewfile:
- contentType: image/jpeg
- /videos/live/{id}:
- get:
- summary: Get information about a live
- operationId: getLiveId
- security:
- - OAuth2: []
- tags:
- - Live Videos
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LiveVideoResponse'
- put:
- summary: Update information about a live
- operationId: updateLiveId
- security:
- - OAuth2: []
- tags:
- - Live Videos
- - Video
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LiveVideoUpdate'
- responses:
- '204':
- description: successful operation
- '400':
- description: bad parameters or trying to update a live that has already started
- '403':
- description: trying to save replay of the live but saving replay is not enabled on the instance
- /videos/live/{id}/sessions:
- get:
- summary: List live sessions
- description: List all sessions created in a particular live
- security:
- - OAuth2: []
- tags:
- - Live Videos
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/LiveVideoSessionResponse'
- /videos/{id}/live-session:
- get:
- summary: Get live session of a replay
- description: If the video is a replay of a live, you can find the associated live session using this endpoint
- security:
- - OAuth2: []
- tags:
- - Live Videos
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/LiveVideoSessionResponse'
- /users/me/abuses:
- get:
- summary: List my abuses
- operationId: getMyAbuses
- security:
- - OAuth2: []
- tags:
- - Abuses
- - My User
- parameters:
- - name: id
- in: query
- description: only list the report with this id
- schema:
- type: integer
- - name: state
- in: query
- schema:
- $ref: '#/components/schemas/AbuseStateSet'
- - $ref: '#/components/parameters/abusesSort'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Abuse'
- /abuses:
- get:
- summary: List abuses
- operationId: getAbuses
- security:
- - OAuth2:
- - admin
- - moderator
- tags:
- - Abuses
- parameters:
- - name: id
- in: query
- description: only list the report with this id
- schema:
- type: integer
- - name: predefinedReason
- in: query
- description: predefined reason the listed reports should contain
- schema:
- $ref: '#/components/schemas/PredefinedAbuseReasons'
- - name: search
- in: query
- description: plain search that will match with video titles, reporter names and more
- schema:
- type: string
- - name: state
- in: query
- schema:
- $ref: '#/components/schemas/AbuseStateSet'
- - name: searchReporter
- in: query
- description: only list reports of a specific reporter
- schema:
- type: string
- - name: searchReportee
- description: only list reports of a specific reportee
- in: query
- schema:
- type: string
- - name: searchVideo
- in: query
- description: only list reports of a specific video
- schema:
- type: string
- - name: searchVideoChannel
- in: query
- description: only list reports of a specific video channel
- schema:
- type: string
- - name: videoIs
- in: query
- description: only list deleted or blocklisted videos
- schema:
- type: string
- enum:
- - 'deleted'
- - 'blacklisted'
- - name: filter
- in: query
- description: only list account, comment or video reports
- schema:
- type: string
- enum:
- - 'video'
- - 'comment'
- - 'account'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/abusesSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Abuse'
- post:
- summary: Report an abuse
- security:
- - OAuth2: []
- tags:
- - Abuses
- requestBody:
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- reason:
- description: Reason why the user reports this video
- type: string
- minLength: 2
- maxLength: 3000
- predefinedReasons:
- $ref: '#/components/schemas/PredefinedAbuseReasons'
- video:
- type: object
- properties:
- id:
- description: Video id to report
- allOf:
- - $ref: '#/components/schemas/Video/properties/id'
- startAt:
- type: integer
- format: seconds
- description: Timestamp in the video that marks the beginning of the report
- minimum: 0
- endAt:
- type: integer
- format: seconds
- description: Timestamp in the video that marks the ending of the report
- minimum: 0
- comment:
- type: object
- properties:
- id:
- description: Comment id to report
- allOf:
- - $ref: '#/components/schemas/VideoComment/properties/id'
- account:
- type: object
- properties:
- id:
- description: Account id to report
- type: integer
- required:
- - reason
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- abuse:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- '400':
- description: incorrect request parameters
- '/abuses/{abuseId}':
- put:
- summary: Update an abuse
- security:
- - OAuth2:
- - admin
- - moderator
- tags:
- - Abuses
- parameters:
- - $ref: '#/components/parameters/abuseId'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- state:
- $ref: '#/components/schemas/AbuseStateSet'
- moderationComment:
- type: string
- description: Update the report comment visible only to the moderation team
- minLength: 2
- maxLength: 3000
- responses:
- '204':
- description: successful operation
- '404':
- description: abuse not found
- delete:
- tags:
- - Abuses
- summary: Delete an abuse
- security:
- - OAuth2:
- - admin
- - moderator
- parameters:
- - $ref: '#/components/parameters/abuseId'
- responses:
- '204':
- description: successful operation
- '404':
- description: block not found
- '/abuses/{abuseId}/messages':
- get:
- summary: List messages of an abuse
- security:
- - OAuth2: []
- tags:
- - Abuses
- parameters:
- - $ref: '#/components/parameters/abuseId'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/AbuseMessage'
- post:
- summary: Add message to an abuse
- security:
- - OAuth2: []
- tags:
- - Abuses
- parameters:
- - $ref: '#/components/parameters/abuseId'
- requestBody:
- required: true
- content:
- application/json:
- schema:
- type: object
- properties:
- message:
- description: Message to send
- type: string
- minLength: 2
- maxLength: 3000
- required:
- - message
- responses:
- '200':
- description: successful operation
- '400':
- description: incorrect request parameters
- '/abuses/{abuseId}/messages/{abuseMessageId}':
- delete:
- summary: Delete an abuse message
- security:
- - OAuth2: []
- tags:
- - Abuses
- parameters:
- - $ref: '#/components/parameters/abuseId'
- - $ref: '#/components/parameters/abuseMessageId'
- responses:
- '204':
- description: successful operation
- '/videos/{id}/blacklist':
- post:
- summary: Block a video
- operationId: addVideoBlock
- security:
- - OAuth2:
- - admin
- - moderator
- tags:
- - Video Blocks
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- delete:
- summary: Unblock a video by its id
- operationId: delVideoBlock
- security:
- - OAuth2:
- - admin
- - moderator
- tags:
- - Video Blocks
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '404':
- description: block not found
- /videos/blacklist:
- get:
- tags:
- - Video Blocks
- summary: List video blocks
- operationId: getVideoBlocks
- security:
- - OAuth2:
- - admin
- - moderator
- parameters:
- - name: type
- in: query
- description: >
- list only blocks that match this type:
- - `1`: manual block
- - `2`: automatic block that needs review
- schema:
- type: integer
- enum:
- - 1
- - 2
- - name: search
- in: query
- description: plain search that will match with video titles, and more
- schema:
- type: string
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/blacklistsSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/VideoBlacklist'
- /videos/{id}/captions:
- get:
- summary: List captions of a video
- operationId: getVideoCaptions
- tags:
- - Video Captions
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/VideoCaption'
- /videos/{id}/captions/{captionLanguage}:
- put:
- summary: Add or replace a video caption
- operationId: addVideoCaption
- security:
- - OAuth2:
- - user
- tags:
- - Video Captions
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/captionLanguage'
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- captionfile:
- description: The file to upload.
- type: string
- format: binary
- encoding:
- captionfile:
- contentType: text/vtt, application/x-subrip, text/plain
- responses:
- '204':
- description: successful operation
- '404':
- description: video or language not found
- delete:
- summary: Delete a video caption
- operationId: delVideoCaption
- security:
- - OAuth2:
- - user
- tags:
- - Video Captions
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/captionLanguage'
- responses:
- '204':
- description: successful operation
- '404':
- description: video or language or caption for that language not found
- /video-channels:
- get:
- summary: List video channels
- operationId: getVideoChannels
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelList'
- post:
- summary: Create a video channel
- operationId: addVideoChannel
- security:
- - OAuth2: []
- tags:
- - Video Channels
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoChannel:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelCreate'
- '/video-channels/{channelHandle}':
- get:
- summary: Get a video channel
- operationId: getVideoChannel
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannel'
- put:
- summary: Update a video channel
- operationId: putVideoChannel
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelUpdate'
- delete:
- summary: Delete a video channel
- operationId: delVideoChannel
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '204':
- description: successful operation
- '/video-channels/{channelHandle}/videos':
- get:
- summary: List videos of a video channel
- operationId: getVideoChannelVideos
- tags:
- - Video
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videosSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- '/video-channels/{channelHandle}/followers':
- get:
- tags:
- - Video Channels
- summary: 'List followers of a video channel'
- security:
- - OAuth2: []
- operationId: getVideoChannelFollowers
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/followersSort'
- - $ref: '#/components/parameters/search'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/Follow'
- '/video-channels/{channelHandle}/avatar/pick':
- post:
- summary: Update channel avatar
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- '413':
- description: image file too large
- headers:
- X-File-Maximum-Size:
- schema:
- type: string
- format: Nginx size
- description: Maximum file size for the avatar
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- avatarfile:
- description: The file to upload.
- type: string
- format: binary
- encoding:
- avatarfile:
- contentType: image/png, image/jpeg
- '/video-channels/{channelHandle}/avatar':
- delete:
- summary: Delete channel avatar
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '204':
- description: successful operation
- '/video-channels/{channelHandle}/banner/pick':
- post:
- summary: Update channel banner
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- banners:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- '413':
- description: image file too large
- headers:
- X-File-Maximum-Size:
- schema:
- type: string
- format: Nginx size
- description: Maximum file size for the banner
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- bannerfile:
- description: The file to upload.
- type: string
- format: binary
- encoding:
- bannerfile:
- contentType: image/png, image/jpeg
- '/video-channels/{channelHandle}/banner':
- delete:
- summary: Delete channel banner
- security:
- - OAuth2: []
- tags:
- - Video Channels
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- responses:
- '204':
- description: successful operation
- '/video-channels/{channelHandle}/import-videos':
- post:
- summary: Import videos in channel
- description: Import a remote channel/playlist videos into a channel
- security:
- - OAuth2: []
- tags:
- - Video Channels
- - Channels Sync
- parameters:
- - $ref: '#/components/parameters/channelHandle'
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ImportVideosInChannelCreate'
- responses:
- '204':
- description: successful operation
- '/video-channel-syncs':
- post:
- summary: Create a synchronization for a video channel
- operationId: addVideoChannelSync
- security:
- - OAuth2: []
- tags:
- - Channels Sync
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelSyncCreate'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoChannelSync:
- $ref: "#/components/schemas/VideoChannelSync"
- '/video-channel-syncs/{channelSyncId}':
- delete:
- summary: Delete a video channel synchronization
- operationId: delVideoChannelSync
- security:
- - OAuth2: []
- tags:
- - Channels Sync
- parameters:
- - $ref: '#/components/parameters/channelSyncId'
- responses:
- '204':
- description: successful operation
- '/video-channel-syncs/{channelSyncId}/sync':
- post:
- summary: Triggers the channel synchronization job, fetching all the videos from the remote channel
- operationId: triggerVideoChannelSync
- security:
- - OAuth2: []
- tags:
- - Channels Sync
- parameters:
- - $ref: '#/components/parameters/channelSyncId'
- responses:
- '204':
- description: successful operation
- /video-playlists/privacies:
- get:
- summary: List available playlist privacy policies
- operationId: getPlaylistPrivacyPolicies
- tags:
- - Video Playlists
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/api/v1/video-playlists/privacies
- /video-playlists:
- get:
- summary: List video playlists
- operationId: getPlaylists
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/VideoPlaylist'
- post:
- summary: Create a video playlist
- description: If the video playlist is set as public, `videoChannelId` is mandatory.
- operationId: addPlaylist
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoPlaylist:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/VideoPlaylist/properties/id'
- uuid:
- $ref: '#/components/schemas/VideoPlaylist/properties/uuid'
- shortUUID:
- $ref: '#/components/schemas/VideoPlaylist/properties/shortUUID'
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- displayName:
- description: Video playlist display name
- type: string
- minLength: 1
- maxLength: 120
- thumbnailfile:
- description: Video playlist thumbnail file
- type: string
- format: binary
- privacy:
- $ref: '#/components/schemas/VideoPlaylistPrivacySet'
- description:
- description: Video playlist description
- type: string
- minLength: 3
- maxLength: 1000
- videoChannelId:
- allOf:
- - $ref: '#/components/schemas/id'
- description: Video channel in which the playlist will be published
- required:
- - displayName
- encoding:
- thumbnailfile:
- contentType: image/jpeg
- /video-playlists/{playlistId}:
- get:
- summary: Get a video playlist
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoPlaylist'
- put:
- summary: Update a video playlist
- description: 'If the video playlist is set as public, the playlist must have a assigned channel.'
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- responses:
- '204':
- description: successful operation
- parameters:
- - $ref: '#/components/parameters/playlistId'
- requestBody:
- content:
- multipart/form-data:
- schema:
- type: object
- properties:
- displayName:
- description: Video playlist display name
- type: string
- minLength: 1
- maxLength: 120
- thumbnailfile:
- description: Video playlist thumbnail file
- type: string
- format: binary
- privacy:
- $ref: '#/components/schemas/VideoPlaylistPrivacySet'
- description:
- description: Video playlist description
- type: string
- videoChannelId:
- allOf:
- - $ref: '#/components/schemas/id'
- description: Video channel in which the playlist will be published
- encoding:
- thumbnailfile:
- contentType: image/jpeg
- delete:
- summary: Delete a video playlist
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- responses:
- '204':
- description: successful operation
- /video-playlists/{playlistId}/videos:
- get:
- summary: 'List videos of a playlist'
- operationId: getVideoPlaylistVideos
- tags:
- - Videos
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- post:
- summary: Add a video in a playlist
- operationId: addVideoPlaylistVideo
- security:
- - OAuth2: []
- tags:
- - Videos
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoPlaylistElement:
- type: object
- properties:
- id:
- type: integer
- example: 2
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- videoId:
- oneOf:
- - $ref: '#/components/schemas/Video/properties/uuid'
- - $ref: '#/components/schemas/Video/properties/id'
- description: Video to add in the playlist
- startTimestamp:
- type: integer
- format: seconds
- description: Start the video at this specific timestamp
- stopTimestamp:
- type: integer
- format: seconds
- description: Stop the video at this specific timestamp
- required:
- - videoId
- /video-playlists/{playlistId}/videos/reorder:
- post:
- summary: 'Reorder a playlist'
- operationId: reorderVideoPlaylist
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- startPosition:
- type: integer
- description: 'Start position of the element to reorder'
- minimum: 1
- insertAfterPosition:
- type: integer
- description: 'New position for the block to reorder, to add the block before the first element'
- minimum: 0
- reorderLength:
- type: integer
- description: 'How many element from `startPosition` to reorder'
- minimum: 1
- required:
- - startPosition
- - insertAfterPosition
- /video-playlists/{playlistId}/videos/{playlistElementId}:
- put:
- summary: Update a playlist element
- operationId: putVideoPlaylistVideo
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- - $ref: '#/components/parameters/playlistElementId'
- responses:
- '204':
- description: successful operation
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- startTimestamp:
- type: integer
- format: seconds
- description: Start the video at this specific timestamp
- stopTimestamp:
- type: integer
- format: seconds
- description: Stop the video at this specific timestamp
- delete:
- summary: Delete an element from a playlist
- operationId: delVideoPlaylistVideo
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- parameters:
- - $ref: '#/components/parameters/playlistId'
- - $ref: '#/components/parameters/playlistElementId'
- responses:
- '204':
- description: successful operation
- '/users/me/video-playlists/videos-exist':
- get:
- summary: Check video exists in my playlists
- security:
- - OAuth2: []
- tags:
- - Video Playlists
- parameters:
- - name: videoIds
- in: query
- required: true
- description: The video ids to check
- schema:
- type: array
- items:
- $ref: '#/components/schemas/Video/properties/id'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- videoId:
- type: array
- items:
- type: object
- properties:
- playlistElementId:
- type: integer
- playlistId:
- type: integer
- startTimestamp:
- type: integer
- format: seconds
- stopTimestamp:
- type: integer
- format: seconds
- '/accounts/{name}/video-channels':
- get:
- summary: List video channels of an account
- tags:
- - Video Channels
- - Accounts
- parameters:
- - $ref: '#/components/parameters/name'
- - name: withStats
- in: query
- description: include daily view statistics for the last 30 days and total views (only if authentified as the account user)
- schema:
- type: boolean
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelList'
- '/accounts/{name}/video-channel-syncs':
- get:
- summary: List the synchronizations of video channels of an account
- tags:
- - Video Channels
- - Channels Sync
- - Accounts
- parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelSyncList'
- '/accounts/{name}/ratings':
- get:
- summary: List ratings of an account
- security:
- - OAuth2: []
- tags:
- - Accounts
- parameters:
- - $ref: '#/components/parameters/name'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- - name: rating
- in: query
- required: false
- description: Optionally filter which ratings to retrieve
- schema:
- type: string
- enum:
- - like
- - dislike
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/VideoRating'
- '/videos/{id}/comment-threads':
- get:
- summary: List threads of a video
- tags:
- - Video Comments
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/commentsSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/CommentThreadResponse'
- post:
- summary: Create a thread
- security:
- - OAuth2: []
- tags:
- - Video Comments
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/CommentThreadPostResponse'
- '404':
- description: video does not exist
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- text:
- allOf:
- - $ref: '#/components/schemas/VideoComment/properties/text'
- format: markdown
- maxLength: 10000
- required:
- - text
- '/videos/{id}/comment-threads/{threadId}':
- get:
- summary: Get a thread
- tags:
- - Video Comments
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/threadId'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoCommentThreadTree'
- '/videos/{id}/comments/{commentId}':
- post:
- summary: Reply to a thread of a video
- security:
- - OAuth2: []
- tags:
- - Video Comments
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/commentId'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/CommentThreadPostResponse'
- '404':
- description: thread or video does not exist
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- text:
- allOf:
- - $ref: '#/components/schemas/VideoComment/properties/text'
- format: markdown
- maxLength: 10000
- required:
- - text
- delete:
- summary: Delete a comment or a reply
- security:
- - OAuth2: []
- tags:
- - Video Comments
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- - $ref: '#/components/parameters/commentId'
- responses:
- '204':
- description: successful operation
- '403':
- description: cannot remove comment of another user
- '404':
- description: comment or video does not exist
- '409':
- description: comment is already deleted
- '/videos/{id}/rate':
- put:
- summary: Like/dislike a video
- security:
- - OAuth2: []
- tags:
- - Video Rates
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- rating:
- type: string
- enum:
- - like
- - dislike
- required:
- - rating
- responses:
- '204':
- description: successful operation
- '404':
- description: video does not exist
- '/videos/{id}/hls':
- delete:
- summary: Delete video HLS files
- security:
- - OAuth2:
- - admin
- tags:
- - Video Files
- operationId: delVideoHLS
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '404':
- description: video does not exist
- '/videos/{id}/webtorrent':
- delete:
- summary: Delete video WebTorrent files
- security:
- - OAuth2:
- - admin
- tags:
- - Video Files
- operationId: delVideoWebTorrent
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- responses:
- '204':
- description: successful operation
- '404':
- description: video does not exist
- '/videos/{id}/transcoding':
- post:
- summary: Create a transcoding job
- security:
- - OAuth2:
- - admin
- tags:
- - Video Transcoding
- operationId: createVideoTranscoding
- parameters:
- - $ref: '#/components/parameters/idOrUUID'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- transcodingType:
- type: string
- enum:
- - hls
- - webtorrent
- required:
- - transcodingType
- responses:
- '204':
- description: successful operation
- '404':
- description: video does not exist
- /search/videos:
- get:
- tags:
- - Search
- summary: Search videos
- operationId: searchVideos
- parameters:
- - name: search
- in: query
- required: true
- allowEmptyValue: false
- description: >
- String to search. If the user can make a remote URI search, and the string is an URI then the
- PeerTube instance will fetch the remote object and add it to its database. Then,
- you can use the REST API to fetch the complete video information and interact with it.
- schema:
- type: string
- - $ref: '#/components/parameters/categoryOneOf'
- - $ref: '#/components/parameters/isLive'
- - $ref: '#/components/parameters/tagsOneOf'
- - $ref: '#/components/parameters/tagsAllOf'
- - $ref: '#/components/parameters/licenceOneOf'
- - $ref: '#/components/parameters/languageOneOf'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- - $ref: '#/components/parameters/skipCount'
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/searchTarget'
- - $ref: '#/components/parameters/videosSearchSort'
- - name: startDate
- in: query
- description: Get videos that are published after this date
- schema:
- type: string
- format: date-time
- - name: endDate
- in: query
- description: Get videos that are published before this date
- schema:
- type: string
- format: date-time
- - name: originallyPublishedStartDate
- in: query
- description: Get videos that are originally published after this date
- schema:
- type: string
- format: date-time
- - name: originallyPublishedEndDate
- in: query
- description: Get videos that are originally published before this date
- schema:
- type: string
- format: date-time
- - name: durationMin
- in: query
- description: Get videos that have this minimum duration
- schema:
- type: integer
- - name: durationMax
- in: query
- description: Get videos that have this maximum duration
- schema:
- type: integer
- callbacks:
- 'searchTarget === search-index':
- $ref: '#/components/callbacks/searchIndex'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
- '500':
- description: search index unavailable
- /search/video-channels:
- get:
- tags:
- - Search
- summary: Search channels
- operationId: searchChannels
- parameters:
- - name: search
- in: query
- required: true
- description: >
- String to search. If the user can make a remote URI search, and the string is an URI then the
- PeerTube instance will fetch the remote object and add it to its database. Then,
- you can use the REST API to fetch the complete channel information and interact with it.
- schema:
- type: string
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/searchTarget'
- - $ref: '#/components/parameters/sort'
- callbacks:
- 'searchTarget === search-index':
- $ref: '#/components/callbacks/searchIndex'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoChannelList'
- '500':
- description: search index unavailable
- /search/video-playlists:
- get:
- tags:
- - Search
- summary: Search playlists
- operationId: searchPlaylists
- parameters:
- - name: search
- in: query
- required: true
- description: >
- String to search. If the user can make a remote URI search, and the string is an URI then the
- PeerTube instance will fetch the remote object and add it to its database. Then,
- you can use the REST API to fetch the complete playlist information and interact with it.
- schema:
- type: string
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/searchTarget'
- - $ref: '#/components/parameters/sort'
- callbacks:
- 'searchTarget === search-index':
- $ref: '#/components/callbacks/searchIndex'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- $ref: '#/components/schemas/VideoPlaylist'
- '500':
- description: search index unavailable
- /blocklist/status:
- get:
- tags:
- - Account Blocks
- - Server Blocks
- summary: Get block status of accounts/hosts
- parameters:
- -
- name: 'accounts'
- in: query
- description: 'Check if these accounts are blocked'
- example: [ 'goofy@example.com', 'donald@example.com' ]
- schema:
- type: array
- items:
- type: string
- -
- name: 'hosts'
- in: query
- description: 'Check if these hosts are blocked'
- example: [ 'example.com' ]
- schema:
- type: array
- items:
- type: string
- responses:
- '200':
- description: successful operation
- content:
- 'application/json':
- schema:
- $ref: '#/components/schemas/BlockStatus'
- /server/blocklist/accounts:
- get:
- tags:
- - Account Blocks
- summary: List account blocks
- security:
- - OAuth2:
- - admin
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- post:
- tags:
- - Account Blocks
- summary: Block an account
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- accountName:
- type: string
- example: chocobozzz@example.org
- description: account to block, in the form `username@domain`
- required:
- - accountName
- responses:
- '200':
- description: successful operation
- '409':
- description: self-blocking forbidden
- '/server/blocklist/accounts/{accountName}':
- delete:
- tags:
- - Account Blocks
- summary: Unblock an account by its handle
- security:
- - OAuth2:
- - admin
- parameters:
- - name: accountName
- in: path
- required: true
- description: account to unblock, in the form `username@domain`
- schema:
- type: string
- responses:
- '201':
- description: successful operation
- '404':
- description: account or account block does not exist
- /server/blocklist/servers:
- get:
- tags:
- - Server Blocks
- summary: List server blocks
- security:
- - OAuth2:
- - admin
- parameters:
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- post:
- tags:
- - Server Blocks
- summary: Block a server
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- host:
- type: string
- format: hostname
- description: server domain to block
- required:
- - host
- responses:
- '204':
- description: successful operation
- '409':
- description: self-blocking forbidden
- '/server/blocklist/servers/{host}':
- delete:
- tags:
- - Server Blocks
- summary: Unblock a server by its domain
- security:
- - OAuth2:
- - admin
- parameters:
- - name: host
- in: path
- required: true
- description: server domain to unblock
- schema:
- type: string
- format: hostname
- responses:
- '204':
- description: successful operation
- '404':
- description: account block does not exist
- /server/redundancy/{host}:
- put:
- tags:
- - Instance Redundancy
- summary: Update a server redundancy policy
- security:
- - OAuth2:
- - admin
- parameters:
- - name: host
- in: path
- required: true
- description: server domain to mirror
- schema:
- type: string
- format: hostname
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- redundancyAllowed:
- type: boolean
- description: allow mirroring of the host's local videos
- required:
- - redundancyAllowed
- responses:
- '204':
- description: successful operation
- '404':
- description: server is not already known
- /server/redundancy/videos:
- get:
- tags:
- - Video Mirroring
- summary: List videos being mirrored
- operationId: getMirroredVideos
- security:
- - OAuth2:
- - admin
- parameters:
- - name: target
- in: query
- required: true
- description: direction of the mirror
- schema:
- type: string
- enum:
- - my-videos
- - remote-videos
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/videoRedundanciesSort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- $ref: '#/components/schemas/VideoRedundancy'
- post:
- tags:
- - Video Mirroring
- summary: Mirror a video
- operationId: putMirroredVideo
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- videoId:
- $ref: '#/components/schemas/Video/properties/id'
- required:
- - videoId
- responses:
- '204':
- description: successful operation
- '400':
- description: cannot mirror a local video
- '404':
- description: video does not exist
- '409':
- description: video is already mirrored
- /server/redundancy/videos/{redundancyId}:
- delete:
- tags:
- - Video Mirroring
- summary: Delete a mirror done on a video
- operationId: delMirroredVideo
- security:
- - OAuth2:
- - admin
- parameters:
- - name: redundancyId
- in: path
- required: true
- description: id of an existing redundancy on a video
- schema:
- type: string
- responses:
- '204':
- description: successful operation
- '404':
- description: video redundancy not found
- /server/stats:
- get:
- tags:
- - Stats
- summary: Get instance stats
- description: Get instance public statistics. This endpoint is cached.
- operationId: getInstanceStats
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/ServerStats'
- /server/logs/client:
- post:
- tags:
- - Logs
- summary: Send client log
- operationId: sendClientLog
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/SendClientLog'
- responses:
- '204':
- description: successful operation
- /server/logs:
- get:
- tags:
- - Logs
- summary: Get instance logs
- operationId: getInstanceLogs
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- /server/audit-logs:
- get:
- tags:
- - Logs
- summary: Get instance audit logs
- operationId: getInstanceAuditLogs
- security:
- - OAuth2:
- - admin
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: array
- items:
- type: string
- '/feeds/video-comments.{format}':
- get:
- tags:
- - Feeds
- summary: List comments on videos
- operationId: getSyndicatedComments
- parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))'
- schema:
- type: string
- enum:
- - xml
- - rss
- - rss2
- - atom
- - atom1
- - json
- - json1
- - name: videoId
- in: query
- description: 'limit listing to a specific video'
- schema:
- type: string
- - name: accountId
- in: query
- description: 'limit listing to a specific account'
- schema:
- type: string
- - name: accountName
- in: query
- description: 'limit listing to a specific account'
- schema:
- type: string
- - name: videoChannelId
- in: query
- description: 'limit listing to a specific video channel'
- schema:
- type: string
- - name: videoChannelName
- in: query
- description: 'limit listing to a specific video channel'
- schema:
- type: string
- responses:
- '204':
- description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
- content:
- application/xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.rss?filter=local
- text/xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.xml?filter=local
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideoCommentsForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.atom?filter=local
- application/json:
- schema:
- type: object
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/video-comments.json?filter=local
- '400':
- x-summary: field inconsistencies
- description: >
- Arises when:
- - videoId filter is mixed with a channel filter
- '404':
- description: video, video channel or account not found
- '406':
- description: accept header unsupported
- '/feeds/videos.{format}':
- get:
- tags:
- - Feeds
- summary: List videos
- operationId: getSyndicatedVideos
- parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))'
- schema:
- type: string
- enum:
- - xml
- - rss
- - rss2
- - atom
- - atom1
- - json
- - json1
- - name: accountId
- in: query
- description: 'limit listing to a specific account'
- schema:
- type: string
- - name: accountName
- in: query
- description: 'limit listing to a specific account'
- schema:
- type: string
- - name: videoChannelId
- in: query
- description: 'limit listing to a specific video channel'
- schema:
- type: string
- - name: videoChannelName
- in: query
- description: 'limit listing to a specific video channel'
- schema:
- type: string
- - $ref: '#/components/parameters/sort'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- responses:
- '204':
- description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
- content:
- application/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.rss?filter=local
- text/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.xml?filter=local
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.atom?filter=local
- application/json:
- schema:
- type: object
- examples:
- nightly:
- externalValue: https://peertube2.cpy.re/feeds/videos.json?filter=local
- '404':
- description: video channel or account not found
- '406':
- description: accept header unsupported
- '/feeds/subscriptions.{format}':
- get:
- tags:
- - Feeds
- - Account
- summary: List videos of subscriptions tied to a token
- operationId: getSyndicatedSubscriptionVideos
- parameters:
- - name: format
- in: path
- required: true
- description: 'format expected (we focus on making `rss` the most featureful ; it serves [Media RSS](https://www.rssboard.org/media-rss))'
- schema:
- type: string
- enum:
- - xml
- - rss
- - rss2
- - atom
- - atom1
- - json
- - json1
- - name: accountId
- in: query
- description: limit listing to a specific account
- schema:
- type: string
- required: true
- - name: token
- in: query
- description: private token allowing access
- schema:
- type: string
- required: true
- - $ref: '#/components/parameters/sort'
- - $ref: '#/components/parameters/nsfw'
- - $ref: '#/components/parameters/isLocal'
- - $ref: '#/components/parameters/include'
- - $ref: '#/components/parameters/privacyOneOf'
- - $ref: '#/components/parameters/hasHLSFiles'
- - $ref: '#/components/parameters/hasWebtorrentFiles'
- responses:
- '204':
- description: successful operation
- headers:
- Cache-Control:
- schema:
- type: string
- default: 'max-age=900' # 15 min cache
- content:
- application/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- application/rss+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- text/xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- application/atom+xml:
- schema:
- $ref: '#/components/schemas/VideosForXML'
- application/json:
- schema:
- type: object
- '406':
- description: accept header unsupported
- /plugins:
- get:
- tags:
- - Plugins
- summary: List plugins
- operationId: getPlugins
- security:
- - OAuth2:
- - admin
- parameters:
- - name: pluginType
- in: query
- schema:
- type: integer
- - name: uninstalled
- in: query
- schema:
- type: boolean
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PluginResponse'
- /plugins/available:
- get:
- tags:
- - Plugins
- summary: List available plugins
- operationId: getAvailablePlugins
- security:
- - OAuth2:
- - admin
- parameters:
- - name: search
- in: query
- schema:
- type: string
- - name: pluginType
- in: query
- schema:
- type: integer
- - name: currentPeerTubeEngine
- in: query
- schema:
- type: string
- - $ref: '#/components/parameters/start'
- - $ref: '#/components/parameters/count'
- - $ref: '#/components/parameters/sort'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PluginResponse'
- '503':
- description: plugin index unavailable
- /plugins/install:
- post:
- tags:
- - Plugins
- summary: Install a plugin
- operationId: addPlugin
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- oneOf:
- - type: object
- properties:
- npmName:
- type: string
- example: peertube-plugin-auth-ldap
- required:
- - npmName
- additionalProperties: false
- - type: object
- properties:
- path:
- type: string
- required:
- - path
- additionalProperties: false
- responses:
- '204':
- description: successful operation
- '400':
- description: should have either `npmName` or `path` set
- /plugins/update:
- post:
- tags:
- - Plugins
- summary: Update a plugin
- operationId: updatePlugin
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- oneOf:
- - type: object
- properties:
- npmName:
- type: string
- example: peertube-plugin-auth-ldap
- required:
- - npmName
- additionalProperties: false
- - type: object
- properties:
- path:
- type: string
- required:
- - path
- additionalProperties: false
- responses:
- '204':
- description: successful operation
- '400':
- description: should have either `npmName` or `path` set
- '404':
- description: existing plugin not found
- /plugins/uninstall:
- post:
- tags:
- - Plugins
- summary: Uninstall a plugin
- operationId: uninstallPlugin
- security:
- - OAuth2:
- - admin
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- npmName:
- type: string
- description: name of the plugin/theme in its package.json
- example: peertube-plugin-auth-ldap
- required:
- - npmName
- responses:
- '204':
- description: successful operation
- '404':
- description: existing plugin not found
- /plugins/{npmName}:
- get:
- tags:
- - Plugins
- summary: Get a plugin
- operationId: getPlugin
- security:
- - OAuth2:
- - admin
- parameters:
- - $ref: '#/components/parameters/npmName'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Plugin'
- '404':
- description: plugin not found
- /plugins/{npmName}/settings:
- put:
- tags:
- - Plugins
- summary: Set a plugin's settings
- security:
- - OAuth2:
- - admin
- parameters:
- - $ref: '#/components/parameters/npmName'
- requestBody:
- content:
- application/json:
- schema:
- type: object
- properties:
- settings:
- type: object
- additionalProperties: true
- responses:
- '204':
- description: successful operation
- '404':
- description: plugin not found
- /plugins/{npmName}/public-settings:
- get:
- tags:
- - Plugins
- summary: Get a plugin's public settings
- parameters:
- - $ref: '#/components/parameters/npmName'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- additionalProperties: true
- '404':
- description: plugin not found
- /plugins/{npmName}/registered-settings:
- get:
- tags:
- - Plugins
- summary: Get a plugin's registered settings
- security:
- - OAuth2:
- - admin
- parameters:
- - $ref: '#/components/parameters/npmName'
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- type: object
- additionalProperties: true
- '404':
- description: plugin not found
- /metrics/playback:
- post:
- summary: Create playback metrics
- description: These metrics are exposed by OpenTelemetry metrics exporter if enabled.
- tags:
- - Stats
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PlaybackMetricCreate'
- responses:
- '204':
- description: successful operation
- servers:
- - url: 'https://peertube2.cpy.re/api/v1'
- description: Live Test Server (live data - latest nightly version)
- - url: 'https://peertube3.cpy.re/api/v1'
- description: Live Test Server (live data - latest RC version)
- - url: 'https://peertube.cpy.re/api/v1'
- description: Live Test Server (live data - stable version)
- components:
- parameters:
- start:
- name: start
- in: query
- required: false
- description: Offset used to paginate results
- schema:
- type: integer
- minimum: 0
- count:
- name: count
- in: query
- required: false
- description: "Number of items to return"
- schema:
- type: integer
- default: 15
- maximum: 100
- minimum: 1
- sort:
- name: sort
- in: query
- required: false
- description: Sort column
- schema:
- type: string
- example: -createdAt
- search:
- name: search
- in: query
- required: false
- description: Plain text search, applied to various parts of the model depending on endpoint
- schema:
- type: string
- searchTarget:
- name: searchTarget
- in: query
- required: false
- description: >
- If the administrator enabled search index support, you can override the default search target.
- **Warning**: If you choose to make an index search, PeerTube will get results from a third party service.
- It means the instance may not yet know the objects you fetched. If you want to load video/channel information:
- * If the current user has the ability to make a remote URI search (this information is available in the config endpoint),
- then reuse the search API to make a search using the object URI so PeerTube instance fetches the remote object and fill its database.
- After that, you can use the classic REST API endpoints to fetch the complete object or interact with it
- * If the current user doesn't have the ability to make a remote URI search, then redirect the user on the origin instance or fetch
- the data from the origin instance API
- schema:
- type: string
- enum:
- - 'local'
- - 'search-index'
- videosSort:
- name: sort
- in: query
- required: false
- schema:
- type: string
- enum:
- - name
- - -duration
- - -createdAt
- - -publishedAt
- - -views
- - -likes
- - -trending
- - -hot
- - -best
- description: >
- Sort videos by criteria (prefixing with `-` means `DESC` order):
- * `hot` - Adaptation of Reddit "hot" algorithm taking into account video views, likes, dislikes and comments and publication date
- * `best` - Same than `hot`, but also takes into account user video history
- * `trending` - Sort videos by recent views ("recent" is defined by the admin)
- * `views` - Sort videos using their `views` counter
- * `publishedAt` - Sort by video publication date (when it became publicly available)
- videosSearchSort:
- name: sort
- in: query
- required: false
- description: >
- Sort videos by criteria (prefixing with `-` means `DESC` order):
- schema:
- type: string
- enum:
- - name
- - -duration
- - -createdAt
- - -publishedAt
- - -views
- - -likes
- - -match
- commentsSort:
- name: sort
- in: query
- required: false
- description: Sort comments by criteria
- schema:
- type: string
- enum:
- - -createdAt
- - -totalReplies
- blacklistsSort:
- name: sort
- in: query
- required: false
- description: Sort blocklists by criteria
- schema:
- type: string
- enum:
- - -id
- - name
- - -duration
- - -views
- - -likes
- - -dislikes
- - -uuid
- - -createdAt
- usersSearch:
- name: search
- in: query
- required: false
- description: Plain text search that will match with user usernames or emails
- schema:
- type: string
- usersBlocked:
- name: blocked
- in: query
- required: false
- description: Filter results down to (un)banned users
- schema:
- type: boolean
- usersSort:
- name: sort
- in: query
- required: false
- description: Sort users by criteria
- schema:
- type: string
- enum:
- - -id
- - -username
- - -createdAt
- abusesSort:
- name: sort
- in: query
- required: false
- description: Sort abuses by criteria
- schema:
- type: string
- enum:
- - -id
- - -createdAt
- - -state
- videoRedundanciesSort:
- name: sort
- in: query
- required: false
- description: Sort abuses by criteria
- schema:
- type: string
- enum:
- - name
- followersSort:
- name: sort
- in: query
- required: false
- description: Sort followers by criteria
- schema:
- type: string
- enum:
- - createdAt
- name:
- name: name
- in: path
- required: true
- description: The username or handle of the account
- schema:
- type: string
- example: chocobozzz | chocobozzz@example.org
- id:
- name: id
- in: path
- required: true
- description: Entity id
- schema:
- $ref: '#/components/schemas/id'
- idOrUUID:
- name: id
- in: path
- required: true
- description: The object id, uuid or short uuid
- schema:
- oneOf:
- - $ref: '#/components/schemas/id'
- - $ref: '#/components/schemas/UUIDv4'
- - $ref: '#/components/schemas/shortUUID'
- playlistId:
- name: playlistId
- in: path
- required: true
- description: Playlist id
- schema:
- $ref: '#/components/schemas/VideoPlaylist/properties/id'
- playlistElementId:
- name: playlistElementId
- in: path
- required: true
- description: Playlist element id
- schema:
- $ref: '#/components/schemas/id'
- abuseId:
- name: abuseId
- in: path
- required: true
- description: Abuse id
- schema:
- $ref: '#/components/schemas/Abuse/properties/id'
- abuseMessageId:
- name: abuseMessageId
- in: path
- required: true
- description: Abuse message id
- schema:
- $ref: '#/components/schemas/AbuseMessage/properties/id'
- captionLanguage:
- name: captionLanguage
- in: path
- required: true
- description: The caption language
- schema:
- $ref: '#/components/schemas/VideoLanguageSet'
- channelHandle:
- name: channelHandle
- in: path
- required: true
- description: The video channel handle
- schema:
- type: string
- example: my_username | my_username@example.com
- channelSyncId:
- name: channelSyncId
- in: path
- required: true
- description: Channel Sync id
- schema:
- $ref: '#/components/schemas/Abuse/properties/id'
- subscriptionHandle:
- name: subscriptionHandle
- in: path
- required: true
- description: The subscription handle
- schema:
- type: string
- example: my_username | my_username@example.com
- threadId:
- name: threadId
- in: path
- required: true
- description: The thread id (root comment id)
- schema:
- type: integer
- commentId:
- name: commentId
- in: path
- required: true
- description: The comment id
- schema:
- $ref: '#/components/schemas/VideoComment/properties/id'
- isLive:
- name: isLive
- in: query
- required: false
- description: whether or not the video is a live
- schema:
- type: boolean
- categoryOneOf:
- name: categoryOneOf
- in: query
- required: false
- description: category id of the video (see [/videos/categories](#operation/getCategories))
- schema:
- oneOf:
- - $ref: '#/components/schemas/VideoCategorySet'
- - type: array
- items:
- $ref: '#/components/schemas/VideoCategorySet'
- style: form
- explode: false
- tagsOneOf:
- name: tagsOneOf
- in: query
- required: false
- description: tag(s) of the video
- schema:
- oneOf:
- - type: string
- - type: array
- maxItems: 5
- items:
- type: string
- style: form
- explode: false
- tagsAllOf:
- name: tagsAllOf
- in: query
- required: false
- description: tag(s) of the video, where all should be present in the video
- schema:
- oneOf:
- - type: string
- - type: array
- items:
- type: string
- style: form
- explode: false
- languageOneOf:
- name: languageOneOf
- in: query
- required: false
- description: language id of the video (see [/videos/languages](#operation/getLanguages)). Use `_unknown` to filter on videos that don't have a video language
- schema:
- oneOf:
- - $ref: '#/components/schemas/VideoLanguageSet'
- - type: array
- items:
- $ref: '#/components/schemas/VideoLanguageSet'
- style: form
- explode: false
- licenceOneOf:
- name: licenceOneOf
- in: query
- required: false
- description: licence id of the video (see [/videos/licences](#operation/getLicences))
- schema:
- oneOf:
- - $ref: '#/components/schemas/VideoLicenceSet'
- - type: array
- items:
- $ref: '#/components/schemas/VideoLicenceSet'
- style: form
- explode: false
- skipCount:
- name: skipCount
- in: query
- required: false
- description: if you don't need the `total` in the response
- schema:
- type: string
- enum:
- - 'true'
- - 'false'
- default: 'false'
- nsfw:
- name: nsfw
- in: query
- required: false
- description: whether to include nsfw videos, if any
- schema:
- type: string
- enum:
- - 'true'
- - 'false'
- isLocal:
- name: isLocal
- in: query
- required: false
- schema:
- type: boolean
- description: '**PeerTube >= 4.0** Display only local or remote videos'
- hasHLSFiles:
- name: hasHLSFiles
- in: query
- required: false
- schema:
- type: boolean
- description: '**PeerTube >= 4.0** Display only videos that have HLS files'
- hasWebtorrentFiles:
- name: hasWebtorrentFiles
- in: query
- required: false
- schema:
- type: boolean
- description: '**PeerTube >= 4.0** Display only videos that have WebTorrent files'
- privacyOneOf:
- name: privacyOneOf
- in: query
- required: false
- schema:
- $ref: '#/components/schemas/VideoPrivacySet'
- description: '**PeerTube >= 4.0** Display only videos in this specific privacy/privacies'
- include:
- name: include
- in: query
- required: false
- schema:
- type: integer
- enum:
- - 0
- - 1
- - 2
- - 4
- - 8
- description: >
- **PeerTube >= 4.0** Include additional videos in results (can be combined using bitwise or operator)
- - `0` NONE
- - `1` NOT_PUBLISHED_STATE
- - `2` BLACKLISTED
- - `4` BLOCKED_OWNER
- - `8` FILES
- subscriptionsUris:
- name: uris
- in: query
- required: true
- description: list of uris to check if each is part of the user subscriptions
- schema:
- type: array
- items:
- type: string
- format: uri
- npmName:
- name: npmName
- in: path
- required: true
- description: name of the plugin/theme on npmjs.com or in its package.json
- schema:
- type: string
- example: peertube-plugin-auth-ldap
- jobType:
- name: jobType
- in: query
- required: false
- description: job type
- schema:
- type: string
- enum:
- - activitypub-follow
- - activitypub-http-broadcast
- - activitypub-http-fetcher
- - activitypub-http-unicast
- - email
- - video-transcoding
- - video-file-import
- - video-import
- - videos-views-stats
- - activitypub-refresher
- - video-redundancy
- - video-live-ending
- - video-channel-import
- followState:
- name: state
- in: query
- schema:
- type: string
- enum:
- - pending
- - accepted
- actorType:
- name: actorType
- in: query
- schema:
- type: string
- enum:
- - Person
- - Application
- - Group
- - Service
- - Organization
- securitySchemes:
- OAuth2:
- description: |
- Authenticating via OAuth requires the following steps:
- - Have an activated account
- - [Generate] an access token for that account at `/api/v1/users/token`.
- - Make requests with the *Authorization: Bearer <token\>* header
- - Profit, depending on the role assigned to the account
- Note that the __access token is valid for 1 day__ and is given
- along with a __refresh token valid for 2 weeks__.
- [Generate]: https://docs.joinpeertube.org/api-rest-getting-started
- type: oauth2
- flows:
- password:
- tokenUrl: /api/v1/users/token
- scopes:
- admin: Admin scope
- moderator: Moderator scope
- user: User scope
- schemas:
- # Reusable core properties
- id:
- type: integer
- minimum: 1
- example: 42
- UUIDv4:
- type: string
- format: uuid
- example: 9c9de5e8-0a1e-484a-b099-e80766180a6d
- pattern: '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$'
- minLength: 36
- maxLength: 36
- shortUUID:
- type: string
- description: translation of a uuid v4 with a bigger alphabet to have a shorter uuid
- example: 2y84q2MQUMWPbiEcxNXMgC
- username:
- type: string
- description: immutable name of the user, used to find or mention its actor
- example: chocobozzz
- pattern: '/^[a-z0-9._]+$/'
- minLength: 1
- maxLength: 50
- usernameChannel:
- type: string
- description: immutable name of the channel, used to interact with its actor
- example: framasoft_videos
- pattern: '/^[a-zA-Z0-9\\-_.:]+$/'
- minLength: 1
- maxLength: 50
- password:
- type: string
- format: password
- minLength: 6
- maxLength: 255
- VideoCategorySet:
- type: integer
- description: category id of the video (see [/videos/categories](#operation/getCategories))
- example: 15
- VideoConstantNumber-Category:
- properties:
- id:
- $ref: '#/components/schemas/VideoCategorySet'
- label:
- type: string
- example: Science & Technology
- VideoLicenceSet:
- type: integer
- description: licence id of the video (see [/videos/licences](#operation/getLicences))
- example: 2
- VideoConstantNumber-Licence:
- properties:
- id:
- $ref: '#/components/schemas/VideoLicenceSet'
- label:
- type: string
- example: Attribution - Share Alike
- VideoLanguageSet:
- type: string
- description: language id of the video (see [/videos/languages](#operation/getLanguages))
- example: en
- VideoConstantString-Language:
- properties:
- id:
- $ref: '#/components/schemas/VideoLanguageSet'
- label:
- type: string
- example: English
- VideoPlaylistPrivacySet:
- type: integer
- enum:
- - 1
- - 2
- - 3
- description: Video playlist privacy policy (see [/video-playlists/privacies])
- VideoPlaylistPrivacyConstant:
- properties:
- id:
- $ref: '#/components/schemas/VideoPlaylistPrivacySet'
- label:
- type: string
- VideoPlaylistTypeSet:
- type: integer
- enum:
- - 1
- - 2
- description: The video playlist type (Regular = `1`, Watch Later = `2`)
- VideoPlaylistTypeConstant:
- properties:
- id:
- $ref: '#/components/schemas/VideoPlaylistTypeSet'
- label:
- type: string
- VideoPrivacySet:
- type: integer
- enum:
- - 1
- - 2
- - 3
- - 4
- description: privacy id of the video (see [/videos/privacies](#operation/getPrivacyPolicies))
- VideoPrivacyConstant:
- properties:
- id:
- $ref: '#/components/schemas/VideoPrivacySet'
- label:
- type: string
- BlockStatus:
- properties:
- accounts:
- type: object
- additionalProperties:
- x-additionalPropertiesName: account
- type: object
- properties:
- blockedByServer:
- type: boolean
- blockedByUser:
- type: boolean
- hosts:
- type: object
- additionalProperties:
- x-additionalPropertiesName: host
- type: object
- properties:
- blockedByServer:
- type: boolean
- blockedByUser:
- type: boolean
- NSFWPolicy:
- type: string
- enum:
- - display
- - blur
- - do_not_list
- UserRole:
- type: integer
- enum:
- - 0
- - 1
- - 2
- description: 'The user role (Admin = `0`, Moderator = `1`, User = `2`)'
- example: 2
- UserAdminFlags:
- type: integer
- enum:
- - 0
- - 1
- description: 'Admin flags for the user (None = `0`, Bypass video blocklist = `1`)'
- example: 1
- LiveVideoLatencyMode:
- type: integer
- enum:
- - 1
- - 2
- - 3
- description: 'The live latency mode (Default = `1`, High latency = `2`, Small Latency = `3`)'
- VideoStateConstant:
- properties:
- id:
- type: integer
- enum:
- - 1
- - 2
- - 3
- - 4
- - 5
- - 6
- - 7
- - 8
- - 9
- description: |
- The video state:
- - `1`: Published
- - `2`: To transcode
- - `3`: To import
- - `4`: Waiting for live stream
- - `5`: Live ended
- - `6`: To move to an external storage (object storage...)
- - `7`: Transcoding failed
- - `8`: Moving to an external storage failed
- - `9`: To edit using studio edition feature
- label:
- type: string
- AbuseStateSet:
- type: integer
- enum:
- - 1
- - 2
- - 3
- description: 'The abuse state (Pending = `1`, Rejected = `2`, Accepted = `3`)'
- AbuseStateConstant:
- properties:
- id:
- $ref: '#/components/schemas/AbuseStateSet'
- label:
- type: string
- AbusePredefinedReasons:
- type: array
- items:
- type: string
- enum:
- - violentOrAbusive
- - hatefulOrAbusive
- - spamOrMisleading
- - privacy
- - rights
- - serverRules
- - thumbnails
- - captions
- example: [spamOrMisleading]
- VideoResolutionSet:
- type: integer
- description: |
- Video resolution (`0`, `240`, `360`, `720`, `1080`, `1440` or `2160`)
- `0` is used as a special value for stillimage videos dedicated to audio, a.k.a. audio-only videos.
- example: 240
- VideoResolutionConstant:
- description: resolutions and their labels for the video
- properties:
- id:
- $ref: '#/components/schemas/VideoResolutionSet'
- label:
- type: string
- example: 240p
- VideoScheduledUpdate:
- properties:
- privacy:
- $ref: '#/components/schemas/VideoPrivacySet'
- updateAt:
- type: string
- format: date
- description: When to update the video
- required:
- - updateAt
- AccountSummary:
- properties:
- id:
- type: integer
- name:
- type: string
- displayName:
- type: string
- url:
- type: string
- format: url
- host:
- type: string
- format: hostname
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- VideoChannelSummary:
- properties:
- id:
- $ref: '#/components/schemas/id'
- name:
- type: string
- displayName:
- type: string
- url:
- type: string
- format: url
- host:
- type: string
- format: hostname
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- PlaylistElement:
- properties:
- position:
- type: integer
- startTimestamp:
- type: integer
- format: seconds
- stopTimestamp:
- type: integer
- format: seconds
- video:
- nullable: true
- allOf:
- - $ref: '#/components/schemas/Video'
- VideoFile:
- readOnly: true
- properties:
- id:
- $ref: '#/components/schemas/id'
- magnetUri:
- type: string
- format: uri
- description: magnet URI allowing to resolve the video via BitTorrent without a metainfo file
- pattern: /magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32}/i
- resolution:
- $ref: '#/components/schemas/VideoResolutionConstant'
- size:
- type: integer
- description: Video file size in bytes
- torrentUrl:
- type: string
- description: Direct URL of the torrent file
- format: url
- torrentDownloadUrl:
- type: string
- description: URL endpoint that transfers the torrent file as an attachment (so that the browser opens a download dialog)
- format: url
- fileUrl:
- type: string
- description: Direct URL of the video
- format: url
- fileDownloadUrl:
- type: string
- description: URL endpoint that transfers the video file as an attachment (so that the browser opens a download dialog)
- format: url
- fps:
- type: number
- description: Frames per second of the video file
- metadataUrl:
- type: string
- format: url
- description: URL dereferencing the output of ffprobe on the file
- VideoStreamingPlaylists:
- allOf:
- - type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- type:
- type: integer
- enum:
- - 1
- description: |
- Playlist type:
- - `1`: HLS
- - $ref: '#/components/schemas/VideoStreamingPlaylists-HLS'
- VideoStreamingPlaylists-HLS:
- properties:
- playlistUrl:
- type: string
- format: url
- segmentsSha256Url:
- type: string
- format: url
- files:
- type: array
- description: |
- Video files associated to this playlist.
- The difference with the root `files` property is that these files are fragmented, so they can be used in this streaming playlist (HLS, etc.)
- items:
- $ref: '#/components/schemas/VideoFile'
- redundancies:
- type: array
- items:
- type: object
- properties:
- baseUrl:
- type: string
- format: url
- VideoInfo:
- properties:
- id:
- $ref: '#/components/schemas/Video/properties/id'
- uuid:
- $ref: '#/components/schemas/Video/properties/uuid'
- name:
- $ref: '#/components/schemas/Video/properties/name'
- Video:
- properties:
- id:
- description: object id for the video
- allOf:
- - $ref: '#/components/schemas/id'
- uuid:
- description: universal identifier for the video, that can be used across instances
- allOf:
- - $ref: '#/components/schemas/UUIDv4'
- shortUUID:
- allOf:
- - $ref: '#/components/schemas/shortUUID'
- isLive:
- type: boolean
- createdAt:
- type: string
- format: date-time
- example: 2017-10-01T10:52:46.396Z
- description: time at which the video object was first drafted
- publishedAt:
- type: string
- format: date-time
- example: 2018-10-01T10:52:46.396Z
- description: time at which the video was marked as ready for playback (with restrictions depending on `privacy`). Usually set after a `state` evolution.
- updatedAt:
- type: string
- format: date-time
- example: 2021-05-04T08:01:01.502Z
- description: last time the video's metadata was modified
- originallyPublishedAt:
- type: string
- format: date-time
- example: 2010-10-01T10:52:46.396Z
- description: used to represent a date of first publication, prior to the practical publication date of `publishedAt`
- category:
- allOf:
- - $ref: '#/components/schemas/VideoConstantNumber-Category'
- description: category in which the video is classified
- licence:
- allOf:
- - $ref: '#/components/schemas/VideoConstantNumber-Licence'
- description: licence under which the video is distributed
- language:
- allOf:
- - $ref: '#/components/schemas/VideoConstantString-Language'
- description: main language used in the video
- privacy:
- allOf:
- - $ref: '#/components/schemas/VideoPrivacyConstant'
- description: privacy policy used to distribute the video
- description:
- type: string
- example: |
- **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n
- **Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)**\r\n*A decentralized video hosting network, based on fr...
- minLength: 3
- maxLength: 250
- description: |
- truncated description of the video, written in Markdown.
- Resolve `descriptionPath` to get the full description of maximum `10000` characters.
- duration:
- type: integer
- example: 1419
- format: seconds
- description: duration of the video in seconds
- isLocal:
- type: boolean
- name:
- type: string
- description: title of the video
- example: What is PeerTube?
- minLength: 3
- maxLength: 120
- thumbnailPath:
- type: string
- example: /static/thumbnails/a65bc12f-9383-462e-81ae-8207e8b434ee.jpg
- previewPath:
- type: string
- example: /lazy-static/previews/a65bc12f-9383-462e-81ae-8207e8b434ee.jpg
- embedPath:
- type: string
- example: /videos/embed/a65bc12f-9383-462e-81ae-8207e8b434ee
- views:
- type: integer
- example: 1337
- likes:
- type: integer
- example: 42
- dislikes:
- type: integer
- example: 7
- nsfw:
- type: boolean
- waitTranscoding:
- type: boolean
- nullable: true
- state:
- allOf:
- - $ref: '#/components/schemas/VideoStateConstant'
- description: represents the internal state of the video processing within the PeerTube instance
- scheduledUpdate:
- nullable: true
- allOf:
- - $ref: '#/components/schemas/VideoScheduledUpdate'
- blacklisted:
- nullable: true
- type: boolean
- blacklistedReason:
- nullable: true
- type: string
- account:
- $ref: '#/components/schemas/AccountSummary'
- channel:
- $ref: '#/components/schemas/VideoChannelSummary'
- userHistory:
- nullable: true
- type: object
- properties:
- currentTime:
- type: integer
- VideoDetails:
- allOf:
- - $ref: '#/components/schemas/Video'
- - type: object
- properties:
- viewers:
- type: integer
- description: If the video is a live, you have the amount of current viewers
- descriptionPath:
- type: string
- example: /api/v1/videos/9c9de5e8-0a1e-484a-b099-e80766180a6d/description
- description: path at which to get the full description of maximum `10000` characters
- support:
- type: string
- description: A text tell the audience how to support the video creator
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- minLength: 3
- maxLength: 1000
- channel:
- $ref: '#/components/schemas/VideoChannel'
- account:
- $ref: '#/components/schemas/Account'
- tags:
- example: [flowers, gardening]
- type: array
- minItems: 1
- maxItems: 5
- items:
- type: string
- minLength: 2
- maxLength: 30
- commentsEnabled:
- type: boolean
- downloadEnabled:
- type: boolean
- trackerUrls:
- type: array
- items:
- type: string
- format: url
- example:
- - https://peertube2.cpy.re/tracker/announce
- - wss://peertube2.cpy.re/tracker/socket
- files:
- type: array
- items:
- $ref: '#/components/schemas/VideoFile'
- description: |
- WebTorrent/raw video files. If WebTorrent is disabled on the server:
- - field will be empty
- - video files will be found in `streamingPlaylists[].files` field
- streamingPlaylists:
- type: array
- items:
- $ref: '#/components/schemas/VideoStreamingPlaylists'
- description: |
- HLS playlists/manifest files. If HLS is disabled on the server:
- - field will be empty
- - video files will be found in `files` field
- FileRedundancyInformation:
- properties:
- id:
- $ref: '#/components/schemas/id'
- fileUrl:
- type: string
- format: url
- strategy:
- type: string
- enum:
- - manual
- - most-views
- - trending
- - recently-added
- size:
- type: integer
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- expiresOn:
- type: string
- format: date-time
- VideoRedundancy:
- properties:
- id:
- $ref: '#/components/schemas/id'
- name:
- type: string
- url:
- type: string
- format: url
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- redundancies:
- type: object
- properties:
- files:
- type: array
- items:
- $ref: '#/components/schemas/FileRedundancyInformation'
- streamingPlaylists:
- type: array
- items:
- $ref: '#/components/schemas/FileRedundancyInformation'
- VideoImportStateConstant:
- properties:
- id:
- type: integer
- enum:
- - 1
- - 2
- - 3
- description: 'The video import state (Pending = `1`, Success = `2`, Failed = `3`)'
- label:
- type: string
- example: Pending
- VideoCreateImport:
- allOf:
- - type: object
- additionalProperties: false
- oneOf:
- - properties:
- targetUrl:
- $ref: '#/components/schemas/VideoImport/properties/targetUrl'
- required: [targetUrl]
- - properties:
- magnetUri:
- $ref: '#/components/schemas/VideoImport/properties/magnetUri'
- required: [magnetUri]
- - properties:
- torrentfile:
- $ref: '#/components/schemas/VideoImport/properties/torrentfile'
- required: [torrentfile]
- - $ref: '#/components/schemas/VideoUploadRequestCommon'
- required:
- - channelId
- - name
- VideoImport:
- properties:
- id:
- readOnly: true
- allOf:
- - $ref: '#/components/schemas/id'
- targetUrl:
- type: string
- format: url
- description: remote URL where to find the import's source video
- example: https://framatube.org/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d
- magnetUri:
- type: string
- format: uri
- description: magnet URI allowing to resolve the import's source video
- pattern: /magnet:\?xt=urn:[a-z0-9]+:[a-z0-9]{32}/i
- torrentfile:
- writeOnly: true
- type: string
- format: binary
- description: Torrent file containing only the video file
- torrentName:
- readOnly: true
- type: string
- state:
- readOnly: true
- allOf:
- - $ref: '#/components/schemas/VideoImportStateConstant'
- error:
- readOnly: true
- type: string
- createdAt:
- readOnly: true
- type: string
- format: date-time
- updatedAt:
- readOnly: true
- type: string
- format: date-time
- video:
- readOnly: true
- nullable: true
- allOf:
- - $ref: '#/components/schemas/Video'
- VideoImportsList:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/VideoImport'
- Abuse:
- properties:
- id:
- $ref: '#/components/schemas/id'
- reason:
- type: string
- example: The video is a spam
- minLength: 2
- maxLength: 3000
- predefinedReasons:
- $ref: '#/components/schemas/AbusePredefinedReasons'
- reporterAccount:
- $ref: '#/components/schemas/Account'
- state:
- $ref: '#/components/schemas/AbuseStateConstant'
- moderationComment:
- type: string
- example: Decided to ban the server since it spams us regularly
- minLength: 2
- maxLength: 3000
- video:
- $ref: '#/components/schemas/VideoInfo'
- createdAt:
- type: string
- format: date-time
- AbuseMessage:
- properties:
- id:
- $ref: '#/components/schemas/id'
- message:
- type: string
- minLength: 2
- maxLength: 3000
- byModerator:
- type: boolean
- createdAt:
- type: string
- format: date-time
- account:
- $ref: '#/components/schemas/AccountSummary'
- VideoBlacklist:
- properties:
- id:
- $ref: '#/components/schemas/id'
- videoId:
- $ref: '#/components/schemas/Video/properties/id'
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- name:
- type: string
- minLength: 3
- maxLength: 120
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- description:
- type: string
- minLength: 3
- maxLength: 10000
- duration:
- type: integer
- views:
- type: integer
- likes:
- type: integer
- dislikes:
- type: integer
- nsfw:
- type: boolean
- VideoPlaylist:
- properties:
- id:
- $ref: '#/components/schemas/id'
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- shortUUID:
- allOf:
- - $ref: '#/components/schemas/shortUUID'
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- description:
- type: string
- minLength: 3
- maxLength: 1000
- displayName:
- type: string
- minLength: 1
- maxLength: 120
- isLocal:
- type: boolean
- videoLength:
- type: integer
- minimum: 0
- thumbnailPath:
- type: string
- privacy:
- $ref: '#/components/schemas/VideoPlaylistPrivacyConstant'
- type:
- $ref: '#/components/schemas/VideoPlaylistTypeConstant'
- ownerAccount:
- $ref: '#/components/schemas/AccountSummary'
- videoChannel:
- $ref: '#/components/schemas/VideoChannelSummary'
- VideoComment:
- properties:
- id:
- $ref: '#/components/schemas/id'
- url:
- type: string
- format: url
- text:
- type: string
- format: html
- description: Text of the comment
- minLength: 1
- example: This video is wonderful!
- threadId:
- $ref: '#/components/schemas/id'
- inReplyToCommentId:
- nullable: true
- allOf:
- - $ref: '#/components/schemas/id'
- videoId:
- $ref: '#/components/schemas/Video/properties/id'
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- deletedAt:
- nullable: true
- type: string
- format: date-time
- default: null
- isDeleted:
- type: boolean
- default: false
- totalRepliesFromVideoAuthor:
- type: integer
- minimum: 0
- totalReplies:
- type: integer
- minimum: 0
- account:
- $ref: '#/components/schemas/Account'
- VideoCommentThreadTree:
- properties:
- comment:
- $ref: '#/components/schemas/VideoComment'
- children:
- type: array
- items:
- $ref: '#/components/schemas/VideoCommentThreadTree'
- VideoCaption:
- properties:
- language:
- $ref: '#/components/schemas/VideoConstantString-Language'
- captionPath:
- type: string
- VideoSource:
- properties:
- filename:
- type: string
- ActorImage:
- properties:
- path:
- type: string
- width:
- type: integer
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- ActorInfo:
- properties:
- id:
- $ref: '#/components/schemas/id'
- name:
- type: string
- displayName:
- type: string
- host:
- type: string
- format: hostname
- avatars:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- Actor:
- properties:
- id:
- $ref: '#/components/schemas/id'
- url:
- type: string
- format: url
- name:
- description: immutable name of the actor, used to find or mention it
- allOf:
- - $ref: '#/components/schemas/username'
- host:
- type: string
- format: hostname
- description: server on which the actor is resident
- hostRedundancyAllowed:
- type: boolean
- description: whether this actor's host allows redundancy of its videos
- followingCount:
- type: integer
- minimum: 0
- description: number of actors subscribed to by this actor, as seen by this instance
- followersCount:
- type: integer
- minimum: 0
- description: number of followers of this actor, as seen by this instance
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- Account:
- allOf:
- - $ref: '#/components/schemas/Actor'
- - properties:
- userId:
- description: object id for the user tied to this account
- allOf:
- - $ref: '#/components/schemas/User/properties/id'
- displayName:
- type: string
- description: editable name of the account, displayed in its representations
- minLength: 3
- maxLength: 120
- description:
- type: string
- description: text or bio displayed on the account's profile
- UserViewingVideo:
- required:
- - currentTime
- properties:
- currentTime:
- type: integer
- format: seconds
- description: timestamp within the video, in seconds
- example: 5
- viewEvent:
- type: string
- enum:
- - seek
- description: >
- Event since last viewing call:
- * `seek` - If the user seeked the video
- VideoStatsOverall:
- properties:
- averageWatchTime:
- type: number
- totalWatchTime:
- type: number
- viewersPeak:
- type: number
- viewersPeakDate:
- type: string
- format: date-time
- countries:
- type: array
- items:
- type: object
- properties:
- isoCode:
- type: string
- viewers:
- type: number
- VideoStatsRetention:
- properties:
- data:
- type: array
- items:
- type: object
- properties:
- second:
- type: number
- retentionPercent:
- type: number
- VideoStatsTimeserie:
- properties:
- data:
- type: array
- items:
- type: object
- properties:
- date:
- type: string
- value:
- type: number
- ServerConfig:
- properties:
- instance:
- type: object
- properties:
- name:
- type: string
- shortDescription:
- type: string
- defaultClientRoute:
- type: string
- isNSFW:
- type: boolean
- defaultNSFWPolicy:
- type: string
- customizations:
- type: object
- properties:
- javascript:
- type: string
- css:
- type: string
- search:
- type: object
- properties:
- remoteUri:
- type: object
- properties:
- users:
- type: boolean
- anonymous:
- type: boolean
- plugin:
- type: object
- properties:
- registered:
- type: array
- items:
- type: string
- theme:
- type: object
- properties:
- registered:
- type: array
- items:
- type: string
- email:
- type: object
- properties:
- enabled:
- type: boolean
- contactForm:
- type: object
- properties:
- enabled:
- type: boolean
- serverVersion:
- type: string
- serverCommit:
- type: string
- signup:
- type: object
- properties:
- allowed:
- type: boolean
- allowedForCurrentIP:
- type: boolean
- requiresEmailVerification:
- type: boolean
- transcoding:
- type: object
- properties:
- hls:
- type: object
- properties:
- enabled:
- type: boolean
- webtorrent:
- type: object
- properties:
- enabled:
- type: boolean
- enabledResolutions:
- type: array
- items:
- $ref: '#/components/schemas/VideoResolutionSet'
- import:
- type: object
- properties:
- videos:
- type: object
- properties:
- http:
- type: object
- properties:
- enabled:
- type: boolean
- torrent:
- type: object
- properties:
- enabled:
- type: boolean
- videoChannelSynchronization:
- type: object
- properties:
- enabled:
- type: boolean
- autoBlacklist:
- type: object
- properties:
- videos:
- type: object
- properties:
- ofUsers:
- type: object
- properties:
- enabled:
- type: boolean
- avatar:
- type: object
- properties:
- file:
- type: object
- properties:
- size:
- type: object
- properties:
- max:
- type: integer
- extensions:
- type: array
- items:
- type: string
- video:
- type: object
- properties:
- image:
- type: object
- properties:
- extensions:
- type: array
- items:
- type: string
- size:
- type: object
- properties:
- max:
- type: integer
- file:
- type: object
- properties:
- extensions:
- type: array
- items:
- type: string
- videoCaption:
- type: object
- properties:
- file:
- type: object
- properties:
- size:
- type: object
- properties:
- max:
- type: integer
- extensions:
- type: array
- items:
- type: string
- user:
- type: object
- properties:
- videoQuota:
- type: integer
- example: 16810141515
- videoQuotaDaily:
- type: integer
- example: 1681014151
- trending:
- type: object
- properties:
- videos:
- type: object
- properties:
- intervalDays:
- type: integer
- tracker:
- type: object
- properties:
- enabled:
- type: boolean
- followings:
- type: object
- properties:
- instance:
- type: object
- properties:
- autoFollowIndex:
- type: object
- properties:
- indexUrl:
- type: string
- format: url
- homepage:
- type: object
- properties:
- enabled:
- type: boolean
- SendClientLog:
- properties:
- message:
- type: string
- url:
- type: string
- description: URL of the current user page
- level:
- enum:
- - error
- - warn
- stackTrace:
- type: string
- description: Stack trace of the error if there is one
- userAgent:
- type: string
- description: User agent of the web browser that sends the message
- meta:
- type: string
- description: Additional information regarding this log
- required:
- - message
- - url
- - level
- ServerStats:
- properties:
- totalUsers:
- type: number
- totalDailyActiveUsers:
- type: number
- totalWeeklyActiveUsers:
- type: number
- totalMonthlyActiveUsers:
- type: number
- totalLocalVideos:
- type: number
- totalLocalVideoViews:
- type: number
- description: Total video views made on the instance
- totalLocalVideoComments:
- type: number
- description: Total comments made by local users
- totalLocalVideoFilesSize:
- type: number
- totalVideos:
- type: number
- totalVideoComments:
- type: number
- totalLocalVideoChannels:
- type: number
- totalLocalDailyActiveVideoChannels:
- type: number
- totalLocalWeeklyActiveVideoChannels:
- type: number
- totalLocalMonthlyActiveVideoChannels:
- type: number
- totalLocalPlaylists:
- type: number
- totalInstanceFollowers:
- type: number
- totalInstanceFollowing:
- type: number
- videosRedundancy:
- type: array
- items:
- type: object
- properties:
- strategy:
- type: string
- totalSize:
- type: number
- totalUsed:
- type: number
- totalVideoFiles:
- type: number
- totalVideos:
- type: number
- totalActivityPubMessagesProcessed:
- type: number
- totalActivityPubMessagesSuccesses:
- type: number
- totalActivityPubMessagesErrors:
- type: number
- activityPubMessagesProcessedPerSecond:
- type: number
- totalActivityPubMessagesWaiting:
- type: number
- ServerConfigAbout:
- properties:
- instance:
- type: object
- properties:
- name:
- type: string
- shortDescription:
- type: string
- description:
- type: string
- terms:
- type: string
- ServerConfigCustom:
- properties:
- instance:
- type: object
- properties:
- name:
- type: string
- shortDescription:
- type: string
- description:
- type: string
- terms:
- type: string
- defaultClientRoute:
- type: string
- isNSFW:
- type: boolean
- defaultNSFWPolicy:
- type: string
- customizations:
- type: object
- properties:
- javascript:
- type: string
- css:
- type: string
- theme:
- type: object
- properties:
- default:
- type: string
- services:
- type: object
- properties:
- twitter:
- type: object
- properties:
- username:
- type: string
- whitelisted:
- type: boolean
- cache:
- type: object
- properties:
- previews:
- type: object
- properties:
- size:
- type: integer
- captions:
- type: object
- properties:
- size:
- type: integer
- signup:
- type: object
- properties:
- enabled:
- type: boolean
- limit:
- type: integer
- requiresEmailVerification:
- type: boolean
- admin:
- type: object
- properties:
- email:
- type: string
- format: email
- contactForm:
- type: object
- properties:
- enabled:
- type: boolean
- user:
- type: object
- description: Settings that apply to new users, if registration is enabled
- properties:
- videoQuota:
- type: integer
- example: 16810141515
- videoQuotaDaily:
- type: integer
- example: 1681014151
- transcoding:
- type: object
- description: Settings pertaining to transcoding jobs
- properties:
- enabled:
- type: boolean
- allowAdditionalExtensions:
- type: boolean
- description: Allow your users to upload .mkv, .mov, .avi, .wmv, .flv, .f4v, .3g2, .3gp, .mts, m2ts, .mxf, .nut videos
- allowAudioFiles:
- type: boolean
- description: If a user uploads an audio file, PeerTube will create a video by merging the preview file and the audio file
- threads:
- type: integer
- description: Amount of threads used by ffmpeg for 1 transcoding job
- concurrency:
- type: number
- description: Amount of transcoding jobs to execute in parallel
- profile:
- type: string
- enum:
- - default
- description: |
- New profiles can be added by plugins ; available in core PeerTube: 'default'.
- resolutions:
- type: object
- description: Resolutions to transcode _new videos_ to
- properties:
- 0p:
- type: boolean
- 144p:
- type: boolean
- 240p:
- type: boolean
- 360p:
- type: boolean
- 480p:
- type: boolean
- 720p:
- type: boolean
- 1080p:
- type: boolean
- 1440p:
- type: boolean
- 2160p:
- type: boolean
- webtorrent:
- type: object
- description: WebTorrent-specific settings
- properties:
- enabled:
- type: boolean
- hls:
- type: object
- description: HLS-specific settings
- properties:
- enabled:
- type: boolean
- import:
- type: object
- properties:
- videos:
- type: object
- properties:
- http:
- type: object
- properties:
- enabled:
- type: boolean
- torrent:
- type: object
- properties:
- enabled:
- type: boolean
- video_channel_synchronization:
- type: object
- properties:
- enabled:
- type: boolean
- autoBlacklist:
- type: object
- properties:
- videos:
- type: object
- properties:
- ofUsers:
- type: object
- properties:
- enabled:
- type: boolean
- followers:
- type: object
- properties:
- instance:
- type: object
- properties:
- enabled:
- type: boolean
- manualApproval:
- type: boolean
- CustomHomepage:
- properties:
- content:
- type: string
- Follow:
- properties:
- id:
- $ref: '#/components/schemas/id'
- follower:
- $ref: '#/components/schemas/Actor'
- following:
- $ref: '#/components/schemas/Actor'
- score:
- type: number
- description: score reflecting the reachability of the actor, with steps of `10` and a base score of `1000`.
- state:
- type: string
- enum:
- - pending
- - accepted
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- PredefinedAbuseReasons:
- description: Reason categories that help triage reports
- type: array
- maxItems: 8
- items:
- type: string
- enum:
- - violentOrAbusive
- - hatefulOrAbusive
- - spamOrMisleading
- - privacy
- - rights
- - serverRules
- - thumbnails
- - captions
- Job:
- properties:
- id:
- $ref: '#/components/schemas/id'
- state:
- type: string
- enum:
- - active
- - completed
- - failed
- - waiting
- - delayed
- type:
- type: string
- enum:
- - activitypub-http-unicast
- - activitypub-http-broadcast
- - activitypub-http-fetcher
- - activitypub-follow
- - video-file-import
- - video-transcoding
- - email
- - video-import
- - videos-views-stats
- - activitypub-refresher
- - video-redundancy
- - video-channel-import
- data:
- type: object
- additionalProperties: true
- error:
- type: object
- additionalProperties: true
- createdAt:
- type: string
- format: date-time
- finishedOn:
- type: string
- format: date-time
- processedOn:
- type: string
- format: date-time
- AddUserResponse:
- properties:
- user:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- account:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- VideoUploadRequestCommon:
- properties:
- name:
- description: Video name
- type: string
- example: What is PeerTube?
- minLength: 3
- maxLength: 120
- channelId:
- description: Channel id that will contain this video
- type: integer
- example: 3
- minimum: 1
- privacy:
- $ref: '#/components/schemas/VideoPrivacySet'
- category:
- $ref: '#/components/schemas/VideoCategorySet'
- licence:
- $ref: '#/components/schemas/VideoLicenceSet'
- language:
- $ref: '#/components/schemas/VideoLanguageSet'
- description:
- description: Video description
- type: string
- example: |
- **[Want to help to translate this video?](https://weblate.framasoft.org/projects/what-is-peertube-video/)**\r\n\r\n**Take back the control of your videos! [#JoinPeertube](https://joinpeertube.org)**
- waitTranscoding:
- description: Whether or not we wait transcoding before publish the video
- type: boolean
- support:
- description: A text tell the audience how to support the video creator
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- type: string
- nsfw:
- description: Whether or not this video contains sensitive content
- type: boolean
- tags:
- description: Video tags (maximum 5 tags each between 2 and 30 characters)
- type: array
- minItems: 1
- maxItems: 5
- uniqueItems: true
- example:
- - framasoft
- - peertube
- items:
- type: string
- minLength: 2
- maxLength: 30
- commentsEnabled:
- description: Enable or disable comments for this video
- type: boolean
- downloadEnabled:
- description: Enable or disable downloading for this video
- type: boolean
- originallyPublishedAt:
- description: Date when the content was originally published
- type: string
- format: date-time
- scheduleUpdate:
- $ref: '#/components/schemas/VideoScheduledUpdate'
- thumbnailfile:
- description: Video thumbnail file
- type: string
- format: binary
- previewfile:
- description: Video preview file
- type: string
- format: binary
- required:
- - channelId
- - name
- VideoUploadRequestLegacy:
- allOf:
- - $ref: '#/components/schemas/VideoUploadRequestCommon'
- - type: object
- required:
- - videofile
- properties:
- videofile:
- description: Video file
- type: string
- format: binary
- VideoUploadRequestResumable:
- allOf:
- - $ref: '#/components/schemas/VideoUploadRequestCommon'
- - type: object
- required:
- - filename
- properties:
- filename:
- description: Video filename including extension
- type: string
- format: filename
- example: what_is_peertube.mp4
- thumbnailfile:
- description: Video thumbnail file
- type: string
- format: binary
- previewfile:
- description: Video preview file
- type: string
- format: binary
- VideoUploadResponse:
- properties:
- video:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/Video/properties/id'
- uuid:
- $ref: '#/components/schemas/Video/properties/uuid'
- shortUUID:
- $ref: '#/components/schemas/Video/properties/shortUUID'
- CommentThreadResponse:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/VideoComment'
- CommentThreadPostResponse:
- properties:
- comment:
- $ref: '#/components/schemas/VideoComment'
- VideoListResponse:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/Video'
- User:
- properties:
- account:
- $ref: '#/components/schemas/Account'
- autoPlayNextVideo:
- type: boolean
- description: Automatically start playing the upcoming video after the currently playing video
- autoPlayNextVideoPlaylist:
- type: boolean
- description: Automatically start playing the video on the playlist after the currently playing video
- autoPlayVideo:
- type: boolean
- description: Automatically start playing the video on the watch page
- blocked:
- type: boolean
- blockedReason:
- type: string
- createdAt:
- type: string
- email:
- type: string
- format: email
- description: The user email
- emailVerified:
- type: boolean
- description: Has the user confirmed their email address?
- id:
- allOf:
- - $ref: '#/components/schemas/id'
- readOnly: true
- pluginAuth:
- type: string
- description: Auth plugin to use to authenticate the user
- lastLoginDate:
- type: string
- format: date-time
- noInstanceConfigWarningModal:
- type: boolean
- noAccountSetupWarningModal:
- type: boolean
- noWelcomeModal:
- type: boolean
- nsfwPolicy:
- $ref: '#/components/schemas/NSFWPolicy'
- role:
- $ref: '#/components/schemas/UserRole'
- roleLabel:
- type: string
- enum:
- - User
- - Moderator
- - Administrator
- theme:
- type: string
- description: Theme enabled by this user
- username:
- $ref: '#/components/schemas/username'
- videoChannels:
- type: array
- items:
- $ref: '#/components/schemas/VideoChannel'
- videoQuota:
- type: integer
- description: The user video quota in bytes
- example: -1
- videoQuotaDaily:
- type: integer
- description: The user daily video quota in bytes
- example: -1
- p2pEnabled:
- type: boolean
- description: Enable P2P in the player
- UserWithStats:
- allOf:
- - $ref: '#/components/schemas/User'
- - properties:
- # optionally present fields: they require WITH_STATS scope
- videosCount:
- type: integer
- description: Count of videos published
- abusesCount:
- type: integer
- description: Count of reports/abuses of which the user is a target
- abusesAcceptedCount:
- type: integer
- description: Count of reports/abuses created by the user and accepted/acted upon by the moderation team
- abusesCreatedCount:
- type: integer
- description: Count of reports/abuses created by the user
- videoCommentsCount:
- type: integer
- description: Count of comments published
- AddUser:
- properties:
- username:
- $ref: '#/components/schemas/username'
- password:
- $ref: '#/components/schemas/password'
- email:
- type: string
- format: email
- description: The user email
- videoQuota:
- type: integer
- description: The user video quota in bytes
- example: -1
- videoQuotaDaily:
- type: integer
- description: The user daily video quota in bytes
- example: -1
- channelName:
- $ref: '#/components/schemas/usernameChannel'
- role:
- $ref: '#/components/schemas/UserRole'
- adminFlags:
- $ref: '#/components/schemas/UserAdminFlags'
- required:
- - username
- - password
- - email
- - videoQuota
- - videoQuotaDaily
- - role
- UpdateUser:
- properties:
- email:
- description: The updated email of the user
- allOf:
- - $ref: '#/components/schemas/User/properties/email'
- emailVerified:
- type: boolean
- description: Set the email as verified
- videoQuota:
- type: integer
- description: The updated video quota of the user in bytes
- videoQuotaDaily:
- type: integer
- description: The updated daily video quota of the user in bytes
- pluginAuth:
- type: string
- nullable: true
- description: The auth plugin to use to authenticate the user
- example: 'peertube-plugin-auth-saml2'
- role:
- $ref: '#/components/schemas/UserRole'
- adminFlags:
- $ref: '#/components/schemas/UserAdminFlags'
- password:
- $ref: '#/components/schemas/password'
- UpdateMe:
- # see shared/models/users/user-update-me.model.ts:
- properties:
- password:
- $ref: '#/components/schemas/password'
- currentPassword:
- $ref: '#/components/schemas/password'
- email:
- description: new email used for login and service communications
- allOf:
- - $ref: '#/components/schemas/User/properties/email'
- displayName:
- type: string
- description: new name of the user in its representations
- minLength: 3
- maxLength: 120
- displayNSFW:
- type: string
- description: new NSFW display policy
- enum:
- - 'true'
- - 'false'
- - both
- p2pEnabled:
- type: boolean
- description: whether to enable P2P in the player or not
- autoPlayVideo:
- type: boolean
- description: new preference regarding playing videos automatically
- autoPlayNextVideo:
- type: boolean
- description: new preference regarding playing following videos automatically
- autoPlayNextVideoPlaylist:
- type: boolean
- description: new preference regarding playing following playlist videos automatically
- videosHistoryEnabled:
- type: boolean
- description: whether to keep track of watched history or not
- videoLanguages:
- type: array
- items:
- type: string
- description: list of languages to filter videos down to
- theme:
- type: string
- noInstanceConfigWarningModal:
- type: boolean
- noAccountSetupWarningModal:
- type: boolean
- noWelcomeModal:
- type: boolean
- GetMeVideoRating:
- properties:
- id:
- $ref: '#/components/schemas/id'
- rating:
- type: string
- enum:
- - like
- - dislike
- - none
- description: Rating of the video
- required:
- - id
- - rating
- VideoRating:
- properties:
- video:
- $ref: '#/components/schemas/Video'
- rating:
- type: string
- enum:
- - like
- - dislike
- - none
- description: Rating of the video
- required:
- - video
- - rating
- RegisterUser:
- properties:
- username:
- description: immutable name of the user, used to find or mention its actor
- allOf:
- - $ref: '#/components/schemas/username'
- password:
- $ref: '#/components/schemas/password'
- email:
- type: string
- format: email
- description: email of the user, used for login or service communications
- displayName:
- type: string
- description: editable name of the user, displayed in its representations
- minLength: 1
- maxLength: 120
- channel:
- type: object
- description: channel base information used to create the first channel of the user
- properties:
- name:
- $ref: '#/components/schemas/usernameChannel'
- displayName:
- type: string
- required:
- - username
- - password
- - email
- OAuthClient:
- properties:
- client_id:
- type: string
- pattern: /^[a-z0-9]$/
- maxLength: 32
- minLength: 32
- example: v1ikx5hnfop4mdpnci8nsqh93c45rldf
- client_secret:
- type: string
- pattern: /^[a-zA-Z0-9]$/
- maxLength: 32
- minLength: 32
- example: AjWiOapPltI6EnsWQwlFarRtLh4u8tDt
- OAuthToken-password:
- allOf:
- - $ref: '#/components/schemas/OAuthClient'
- - type: object
- properties:
- grant_type:
- type: string
- enum:
- - password
- - refresh_token
- default: password
- username:
- $ref: '#/components/schemas/User/properties/username'
- password:
- $ref: '#/components/schemas/password'
- required:
- - client_id
- - client_secret
- - grant_type
- - username
- - password
- OAuthToken-refresh_token:
- allOf:
- - $ref: '#/components/schemas/OAuthClient'
- - type: object
- properties:
- grant_type:
- type: string
- enum:
- - password
- - refresh_token
- default: password
- refresh_token:
- type: string
- example: 2e0d675df9fc96d2e4ec8a3ebbbf45eca9137bb7
- required:
- - client_id
- - client_secret
- - grant_type
- - refresh_token
- VideoChannel:
- allOf:
- - $ref: '#/components/schemas/Actor'
- - type: object
- properties:
- displayName:
- type: string
- description: editable name of the channel, displayed in its representations
- example: Videos of Framasoft
- minLength: 1
- maxLength: 120
- description:
- type: string
- example: Videos made with <3 by Framasoft
- minLength: 3
- maxLength: 1000
- support:
- type: string
- description: text shown by default on all videos of this channel, to tell the audience how to support it
- example: Please support our work on https://soutenir.framasoft.org/en/ <3
- minLength: 3
- maxLength: 1000
- isLocal:
- readOnly: true
- type: boolean
- updatedAt:
- readOnly: true
- type: string
- format: date-time
- banners:
- type: array
- items:
- $ref: '#/components/schemas/ActorImage'
- ownerAccount:
- readOnly: true
- nullable: true
- type: object
- properties:
- id:
- type: integer
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- VideoChannelCreate:
- allOf:
- - $ref: '#/components/schemas/VideoChannel'
- - properties:
- name:
- description: username of the channel to create
- allOf:
- - $ref: '#/components/schemas/usernameChannel'
- required:
- - name
- - displayName
- VideoChannelUpdate:
- allOf:
- - $ref: '#/components/schemas/VideoChannel'
- - properties:
- bulkVideosSupportUpdate:
- type: boolean
- description: Update the support field for all videos of this channel
- VideoChannelList:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- allOf:
- - $ref: '#/components/schemas/VideoChannel'
- - $ref: '#/components/schemas/Actor'
- ImportVideosInChannelCreate:
- type: object
- properties:
- externalChannelUrl:
- type: string
- example: https://youtube.com/c/UC_myfancychannel
- videoChannelSyncId:
- type: integer
- description: If part of a channel sync process, specify its id to assign video imports to this channel synchronization
- required:
- - 'externalChannelUrl'
- VideoChannelSync:
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- state:
- type: object
- properties:
- id:
- type: integer
- example: 2
- label:
- type: string
- example: PROCESSING
- externalChannelUrl:
- type: string
- example: 'https://youtube.com/c/UC_myfancychannel'
- createdAt:
- type: string
- format: date-time
- lastSyncAt:
- type: string
- format: date-time
- nullable: true
- channel:
- $ref: '#/components/schemas/VideoChannel'
- VideoChannelSyncList:
- type: object
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- items:
- allOf:
- - $ref: '#/components/schemas/VideoChannelSync'
- VideoChannelSyncCreate:
- type: object
- properties:
- externalChannelUrl:
- type: string
- example: https://youtube.com/c/UC_myfancychannel
- videoChannelId:
- $ref: '#/components/schemas/id'
- MRSSPeerLink:
- type: object
- xml:
- name: 'media:peerLink'
- properties:
- href:
- type: string
- xml:
- attribute: true
- type:
- type: string
- enum:
- - application/x-bittorrent
- xml:
- attribute: true
- MRSSGroupContent:
- type: object
- xml:
- name: 'media:content'
- properties:
- url:
- type: string
- format: url
- xml:
- attribute: true
- fileSize:
- type: integer
- xml:
- attribute: true
- type:
- type: string
- xml:
- attribute: true
- framerate:
- type: integer
- xml:
- attribute: true
- duration:
- type: integer
- xml:
- attribute: true
- height:
- type: integer
- xml:
- attribute: true
- lang:
- type: string
- xml:
- attribute: true
- VideoCommentsForXML:
- type: array
- xml:
- wrapped: true
- name: 'channel'
- items:
- type: object
- xml:
- name: 'item'
- properties:
- link:
- type: string
- format: url
- guid:
- type: string
- pubDate:
- type: string
- format: date-time
- 'content:encoded':
- type: string
- 'dc:creator':
- type: string
- VideosForXML:
- type: array
- xml:
- wrapped: true
- name: 'channel'
- items:
- type: object
- xml:
- name: 'item'
- properties:
- link:
- type: string
- format: url
- description: video watch page URL
- guid:
- type: string
- description: video canonical URL
- pubDate:
- type: string
- format: date-time
- description: video publication date
- description:
- type: string
- description: video description
- 'content:encoded':
- type: string
- description: video description
- 'dc:creator':
- type: string
- description: publisher user name
- 'media:category':
- type: integer
- description: video category (MRSS)
- 'media:community':
- type: object
- description: see [media:community](https://www.rssboard.org/media-rss#media-community) (MRSS)
- properties:
- 'media:statistics':
- type: object
- properties:
- views:
- type: integer
- xml:
- attribute: true
- 'media:embed':
- type: object
- properties:
- url:
- type: string
- format: url
- description: video embed path, relative to the canonical URL domain (MRSS)
- xml:
- attribute: true
- 'media:player':
- type: object
- properties:
- url:
- type: string
- format: url
- description: video watch path, relative to the canonical URL domain (MRSS)
- xml:
- attribute: true
- 'media:thumbnail':
- type: object
- properties:
- url:
- type: string
- format: url
- xml:
- attribute: true
- height:
- type: integer
- xml:
- attribute: true
- width:
- type: integer
- xml:
- attribute: true
- 'media:title':
- type: string
- description: see [media:title](https://www.rssboard.org/media-rss#media-title) (MRSS). We only use `plain` titles.
- 'media:description':
- type: string
- 'media:rating':
- type: string
- enum:
- - nonadult
- - adult
- description: see [media:rating](https://www.rssboard.org/media-rss#media-rating) (MRSS)
- 'enclosure':
- type: object
- description: main streamable file for the video
- properties:
- url:
- type: string
- format: url
- xml:
- attribute: true
- type:
- type: string
- enum:
- - application/x-bittorrent
- xml:
- attribute: true
- length:
- type: integer
- xml:
- attribute: true
- 'media:group':
- type: array
- description: list of streamable files for the video. see [media:peerLink](https://www.rssboard.org/media-rss#media-peerlink) and [media:content](https://www.rssboard.org/media-rss#media-content) or (MRSS)
- items:
- anyOf:
- - $ref: '#/components/schemas/MRSSPeerLink'
- - $ref: '#/components/schemas/MRSSGroupContent'
- NotificationSettingValue:
- type: integer
- description: >
- Notification type
- - `0` NONE
- - `1` WEB
- - `2` EMAIL
- enum:
- - 0
- - 1
- - 2
- Notification:
- properties:
- id:
- $ref: '#/components/schemas/id'
- type:
- type: integer
- description: >
- Notification type, following the `UserNotificationType` enum:
- - `1` NEW_VIDEO_FROM_SUBSCRIPTION
- - `2` NEW_COMMENT_ON_MY_VIDEO
- - `3` NEW_ABUSE_FOR_MODERATORS
- - `4` BLACKLIST_ON_MY_VIDEO
- - `5` UNBLACKLIST_ON_MY_VIDEO
- - `6` MY_VIDEO_PUBLISHED
- - `7` MY_VIDEO_IMPORT_SUCCESS
- - `8` MY_VIDEO_IMPORT_ERROR
- - `9` NEW_USER_REGISTRATION
- - `10` NEW_FOLLOW
- - `11` COMMENT_MENTION
- - `12` VIDEO_AUTO_BLACKLIST_FOR_MODERATORS
- - `13` NEW_INSTANCE_FOLLOWER
- - `14` AUTO_INSTANCE_FOLLOWING
- - `15` ABUSE_STATE_CHANGE
- - `16` ABUSE_NEW_MESSAGE
- - `17` NEW_PLUGIN_VERSION
- - `18` NEW_PEERTUBE_VERSION
- read:
- type: boolean
- video:
- nullable: true
- allOf:
- - $ref: '#/components/schemas/VideoInfo'
- - type: object
- properties:
- channel:
- $ref: '#/components/schemas/ActorInfo'
- videoImport:
- nullable: true
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- video:
- nullable: true
- $ref: '#/components/schemas/VideoInfo'
- torrentName:
- type: string
- nullable: true
- magnetUri:
- $ref: '#/components/schemas/VideoImport/properties/magnetUri'
- targetUri:
- type: string
- format: uri
- nullable: true
- comment:
- nullable: true
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- threadId:
- type: integer
- video:
- $ref: '#/components/schemas/VideoInfo'
- account:
- $ref: '#/components/schemas/ActorInfo'
- videoAbuse:
- nullable: true
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- video:
- allOf:
- - $ref: '#/components/schemas/VideoInfo'
- videoBlacklist:
- nullable: true
- type: object
- properties:
- id:
- $ref: '#/components/schemas/id'
- video:
- allOf:
- - $ref: '#/components/schemas/VideoInfo'
- account:
- nullable: true
- allOf:
- - $ref: '#/components/schemas/ActorInfo'
- actorFollow:
- type: object
- nullable: true
- properties:
- id:
- $ref: '#/components/schemas/id'
- follower:
- $ref: '#/components/schemas/ActorInfo'
- state:
- type: string
- enum:
- - pending
- - accepted
- following:
- type: object
- properties:
- type:
- type: string
- enum:
- - account
- - channel
- - instance
- name:
- type: string
- displayName:
- type: string
- host:
- type: string
- format: hostname
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- NotificationListResponse:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/Notification'
- Plugin:
- properties:
- name:
- type: string
- example: peertube-plugin-auth-ldap
- type:
- type: integer
- description: >
- - `1`: PLUGIN
- - `2`: THEME
- enum:
- - 1
- - 2
- latestVersion:
- type: string
- example: 0.0.3
- version:
- type: string
- example: 0.0.1
- enabled:
- type: boolean
- uninstalled:
- type: boolean
- peertubeEngine:
- type: string
- example: 2.2.0
- description:
- type: string
- homepage:
- type: string
- format: url
- example: https://framagit.org/framasoft/peertube/official-plugins/tree/master/peertube-plugin-auth-ldap
- settings:
- type: object
- additionalProperties: true
- createdAt:
- type: string
- format: date-time
- updatedAt:
- type: string
- format: date-time
- PluginResponse:
- properties:
- total:
- type: integer
- example: 1
- data:
- type: array
- maxItems: 100
- items:
- $ref: '#/components/schemas/Plugin'
- LiveVideoUpdate:
- properties:
- saveReplay:
- type: boolean
- permanentLive:
- description: User can stream multiple times in a permanent live
- type: boolean
- latencyMode:
- description: User can select live latency mode if enabled by the instance
- $ref: '#/components/schemas/LiveVideoLatencyMode'
- LiveVideoResponse:
- properties:
- rtmpUrl:
- type: string
- description: Included in the response if an appropriate token is provided
- rtmpsUrl:
- type: string
- description: Included in the response if an appropriate token is provided
- streamKey:
- type: string
- description: RTMP stream key to use to stream into this live video. Included in the response if an appropriate token is provided
- saveReplay:
- type: boolean
- permanentLive:
- description: User can stream multiple times in a permanent live
- type: boolean
- latencyMode:
- description: User can select live latency mode if enabled by the instance
- $ref: '#/components/schemas/LiveVideoLatencyMode'
- RequestTwoFactorResponse:
- properties:
- otpRequest:
- type: object
- properties:
- requestToken:
- type: string
- description: The token to send to confirm this request
- secret:
- type: string
- description: The OTP secret
- uri:
- type: string
- description: The OTP URI
- VideoStudioCreateTask:
- type: array
- items:
- anyOf:
- -
- title: cut
- type: object
- properties:
- name:
- type: string
- enum:
- - 'cut'
- options:
- type: object
- properties:
- start:
- type: integer
- end:
- type: integer
- -
- title: add-intro
- type: object
- properties:
- name:
- type: string
- enum:
- - 'add-intro'
- options:
- type: object
- properties:
- file:
- type: string
- format: binary
- -
- title: add-outro
- type: object
- properties:
- name:
- type: string
- enum:
- - 'add-outro'
- options:
- type: object
- properties:
- file:
- type: string
- format: binary
- -
- title: add-watermark
- type: object
- properties:
- name:
- type: string
- enum:
- - 'add-watermark'
- options:
- type: object
- properties:
- file:
- type: string
- format: binary
- LiveVideoSessionResponse:
- properties:
- id:
- type: integer
- startDate:
- type: string
- format: date-time
- description: Start date of the live session
- endDate:
- type: string
- format: date-time
- nullable: true
- description: End date of the live session
- error:
- type: integer
- enum:
- - 1
- - 2
- - 3
- - 4
- - 5
- nullable: true
- description: >
- Error type if an error occurred during the live session:
- - `1`: Bad socket health (transcoding is too slow)
- - `2`: Max duration exceeded
- - `3`: Quota exceeded
- - `4`: Quota FFmpeg error
- - `5`: Video has been blacklisted during the live
- replayVideo:
- type: object
- description: Video replay information
- properties:
- id:
- type: number
- uuid:
- $ref: '#/components/schemas/UUIDv4'
- shortUUID:
- $ref: '#/components/schemas/shortUUID'
- PlaybackMetricCreate:
- properties:
- playerMode:
- type: string
- enum:
- - 'p2p-media-loader'
- - 'webtorrent'
- resolution:
- type: number
- description: Current player video resolution
- fps:
- type: number
- description: Current player video fps
- resolutionChanges:
- type: number
- description: How many resolution changes occured since the last metric creation
- errors:
- type: number
- description: How many errors occured since the last metric creation
- downloadedBytesP2P:
- type: number
- description: How many bytes were downloaded with P2P since the last metric creation
- downloadedBytesHTTP:
- type: number
- description: How many bytes were downloaded with HTTP since the last metric creation
- uploadedBytesP2P:
- type: number
- description: How many bytes were uploaded with P2P since the last metric creation
- videoId:
- oneOf:
- - $ref: '#/components/schemas/id'
- - $ref: '#/components/schemas/UUIDv4'
- - $ref: '#/components/schemas/shortUUID'
- required:
- - playerMode
- - resolutionChanges
- - errors
- - downloadedBytesP2P
- - downloadedBytesHTTP
- - uploadedBytesP2P
- - videoId
- callbacks:
- searchIndex:
- 'https://search.example.org/api/v1/search/videos':
- post:
- summary: third-party search index MAY be used instead of the local index, if enabled by the instance admin. see `searchTarget`
- responses:
- '200':
- description: successful operation
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/VideoListResponse'
|