---
title: "Create video"
method: POST
path: "/streaming/videos"
tags: ["Videos"]
---

# Create video

`POST /streaming/videos`

Use this method to create a new video entity.

  


**Methods of creating**

To upload the original video file to the server, there are several possible scenarios:

- **Copy from another server** – If your video is accessable via "http://", "https://", or "sftp://" public link, then you can use this method to copy a file from an external server. Set ```origin_url``` parameter with the link to the original video file (i.e. "https://domain.com/video.mp4"). After method execution file will be uploaded and will be sent to transcoding automatically, you don't have to do anything else. Use extra field ```origin_http_headers``` if authorization is required on the external server. 
- **Direct upload from a local device** – If you need to upload video directly from your local device or from a mobile app, then use this method. Keep ```origin_url``` empty and use TUS protocol ([tus.io](https://tus.io)) to upload file. More details are here ["Get TUS' upload"](/docs/api-reference/streaming/videos/get-tus-parameters-for-direct-upload)


After getting the video, it is processed through the queue. There are 2 priority criteria: global and local. Global is determined automatically by the system as converters are ready to get next video, so your videos rarely queue longer than usual (when you don't have a dedicated region). Local priority works at the level of your account and you have full control over it, look at "priority" attribute.

  


**AI processing**

When uploading a video, it is possible to automatically create subtitles based on AI.

Read more:
- What is ["AI Speech Recognition"](/docs/api-reference/streaming/ai/create-ai-asr-task).
- If the option is enabled via ```auto_transcribe_audio_language: auto|<language_code>```, then immediately after successful transcoding, an AI task will be automatically created for transcription.
- If you need to translate subtitles from original language to any other, then AI-task of subtitles translation can be applied. Use ```auto_translate_subtitles_language: default|<language_codes,>``` parameter for that. Also you can point several languages to translate to, then a separate subtitle will be generated for each specified language.
- How to ["add AI-generated subtitles to an exist video"](/docs/api-reference/streaming/subtitles/add-subtitle). 

The created AI-task(s) will be automatically executed, and result will also be automatically attached to this video as subtitle(s).


Please note that transcription is done automatically for all videos uploaded to our video hosting. If necessary, you can disable automatic creation of subtitles. If AI is disabled in your account, no AI functionality is called.

  


**Advanced Features**
For details on the requirements for incoming original files, and output video parameters after transcoding, refer to the Knowledge Base documentation. By default, video will be transcoded into H.264 (AVC) according to the original resolution (up to 4K), and a suitable quality ladder will be applied. More advanced codecs such as HEVC, AV1, and VP9 are available as part of our premium encoding features. There is no automatic upscaling; the maximum quality is taken from the original video.
If you want to upload specific files not explicitly listed in requirements or wish to modify the standard quality ladder (i.e. decrease quality or add new non-standard qualities), then such customization is possible. Please reach out to us for assistance.

  


Additionally, check the Knowledge Base for any supplementary information you may need.

## Request body

- object
  - `video` CreateVideo
    - `name` string, required — Video name
    - `description` string — Video details; not visible to the end-users
    - `origin_url` string — URL to an original file which you want to copy from external storage. If specified, system will download the file and will use it as video source for transcoding.
    - `origin_http_headers` string — Authorization HTTP request header. Will be used as credentials to authenticate a request to download a file (specified in "origin_url" parameter) on an external server. Syntax: ```Authorization: <auth-scheme> <authorization-parameters>``` Examples: - "origin_http_headers": "Authorization: Basic ..." - "origin_http_headers": "Authorization: Bearer ..." - "origin_http_headers": "Authorization: APIKey ..." Example of usage when downloading a file from Google Drive: ``` POST https://api.gcore.com/streaming/videos "video": { "name": "IBC 2024 intro.mp4", "origin_url": "https://www.googleapis.com/drive/v3/files/...?alt=media", "origin_http_headers": "Authorization: Bearer ABC" } ```
    - `priority` integer — Priority allows you to adjust the urgency of processing some videos before others in your account, if your algorithm requires it. For example, when there are very urgent video and some regular ones that can wait in the queue. Value range, integer [-10..10]. -10 is the lowest down-priority, 10 is the highest up-priority. Default priority is 0.
    - `quality_set_id` integer — Custom quality set ID for transcoding, if transcoding is required according to your conditions. Look at GET /`quality_sets` method
    - `clip_start_seconds` integer — If you want to transcode only a trimmed segment of a video instead of entire length if the video, then you can provide timecodes of starting point and duration of a segment to process. Start encoding from is a number in seconds.
    - `clip_duration_seconds` integer — The length of the trimmed segment to transcode, instead of the entire length of the video. Is only used in conjunction with specifying the start of a segment. Transcoding duration is a number in seconds.
    - `source_bitrate_limit` boolean — The option allows you to set the video transcoding rule so that the output bitrate in ABR ladder is not exceeding the bitrate of the original video. This option is for advanced users only. By default ```source_bitrate_limit: true``` this option allows you to have the output bitrate not more than in the original video, thus to transcode video faster and to deliver it to end-viewers faster as well. At the same time, the quality will be similar to the original. If for some reason you need more byte-space in the output quality when encoding, you can set this option to ```source_bitrate_limit: false```. Then, when transcoding, the quality ceiling will be raised from the bitrate of the original video to the maximum possible limit specified in our the Product Documentation. For example, this may be needed when: - to improve the visual quality parameters using PSNR, SSIM, VMAF metrics, - to improve the picture quality on dynamic scenes, - etc. The option is applied only at the video creation stage and cannot be changed later. If you want to re-transcode the video using new value, then you need to create and upload a new video only.
    - `directory_id` integer — ID of the directory where the video should be uploaded. (beta)
    - `poster` string — Poster is your own static image which can be displayed before the video starts. After uploading the video, the system will automatically create several screenshots (they will be stored in "screenshots" attribute) from which you can select an default screenshot. This "poster" field is for uploading your own image. Also use attribute "screenshot_id" to select poster as a default screnshot. Attribute accepts single image as base64-encoded string [(RFC 2397 – The "data" URL scheme)](https://www.rfc-editor.org/rfc/rfc2397). In format: ```data:[<mediatype>];base64,<data>``` MIME-types are image/jpeg, image/webp, and image/png and file sizes up to 1Mb. Examples: - ```data:image/jpeg;base64,/9j/4AA...qf/2Q==``` - ```data:image/png;base64,iVBORw0KGg...ggg==``` - ```data:image/webp;base64,UklGRt.../DgAAAAA```
    - `remote_poster_url` string — Poster URL to download from external resource, instead of uploading via "poster" attribute. It has the same restrictions as "poster" attribute.
    - `remove_poster` boolean — Set it to true to remove poster
    - `screenshot_id` integer — Default screenshot index. Specify an ID from the "screenshots" array, so that the URL of the required screenshot appears in the "screenshot" attribute as the default screenshot. By default 5 static screenshots will be taken from different places in the video after transcoding. If the video is short, there may be fewer screenshots. Counting from 0. A value of -1 sets the default screenshot to the URL of your own image from the "poster" attribute. Look at "screenshot" attribute in GET /videos/{`video_id`} for details.
    - `client_user_id` integer — Custom field where you can specify user ID in your system
    - `auto_transcribe_audio_language` 'disable' | 'auto' | '<language_code>' — Automatic creation of subtitles by transcribing the audio track. Values: - disable – Do not transcribe. - auto – Automatically detects the activation of the option based on the settings in your account. If generation is activated, then automatic language detection while transcribing. - \ – Transcribe from specific language. Can be used to specify the exact language spoken in the audio track, or when auto language detection fails. Language is set by 3-letter language code according to ISO-639-2 (bibliographic code). List of languages is available in ```audio_language``` attribute of API POST /streaming/ai/transcribe . Example: ``` auto_transcribe_audio_language: "auto" auto_transcribe_audio_language: "ger" ``` More details: - List of AI tasks – API [GET /streaming/ai/tasks](/docs/api-reference/streaming/ai/get-list-of-ai-tasks) - Add subtitles to an exist video – API [POST /streaming/videos/{`video_id`}/subtitles](/docs/api-reference/streaming/subtitles/add-subtitle).
    - `auto_translate_subtitles_language` 'disable' | 'default' | '<language_codes,>' — Automatic translation of auto-transcribed subtitles to the specified language(s). Can be used both together with ```auto_transcribe_audio_language``` option only. Use it when you want to make automatic subtitles in languages other than the original language in audio. Values: - disable – Do not translate. - default – There are 3 default languages: eng,fre,ger - \ – Explicit language to translate to, or list of languages separated by a comma. Look at list of available languages in description of AI ASR task creation. If several languages are specified for translation, a separate subtitle will be generated for each language. Example: ``` auto_translate_subtitles_language: default auto_translate_subtitles_language: eng,fre,ger ``` Please note that subtitle translation is done separately and after transcription. Thus separate AI-tasks are created for translation.
    - `projection` string — Deprecated. Regulates the video format: - **regular** — plays the video as usual - **vr360** — plays the video in 360 degree mode - **vr180** — plays the video in 180 degree mode - **vr360tb** — plays the video in 3D 360 degree mode Top-Bottom. Default is regular
    - `share_url` string — Deprecated. Custom URL or iframe displayed in the link field when a user clicks on a sharing button in player. If empty, the link field and social network sharing is disabled
    - `custom_iframe_url` string — Deprecated. Custom URL of IFrame for video player to be used in share panel in player. Auto generated IFrame URL provided by default

## Response `200`

Successful

- SearchVideo[]
  - `id` integer — Video ID
  - `name` string — Title of the video. Often used as a human-readable name of the video, but can contain any text you wish. The values are not unique and may be repeated. Examples: - Educational training 2024-03-29 - Series X S3E14, The empire strikes back - 480fd499-2de2-4988-bc1a-a4eebe9818ee
  - `description` string — Additional text field for video description
  - `client_id` integer — Client ID
  - `origin_size` integer — Size of original file
  - `origin_video_duration` integer — Original video duration in milliseconds
  - `origin_url` string — URL to an original file from which the information for transcoding was taken. May contain a link for scenarios: - If the video was downloaded from another origin - If the video is a recording of a live stream - Otherwise it is "null" **Copy from another server** URL to an original file that was downloaded. Look at method "Copy from another server" in POST /videos. **Recording of an original live stream** URL to the original non-transcoded stream recording with original quality, saved in MP4 format. File is created immediately after the completion of the stream recording. The stream from which the recording was made is reflected in "stream_id" field. Can be used for internal operations when a recording needs to be received faster than the transcoded versions are ready. But this version is not intended for public distribution. Views and downloads occur in the usual way, like viewing an MP4 rendition. The MP4 file becomes available for downloading when the video entity "status" changes from "new" to "pending". Format of URL is ```/videos/<cid>_<slug>/origin_<bitrate>_<height>.mp4``` Where: - ```<bitrate>``` – Encoding bitrate in Kbps. - ```<height>``` – Video height. The original file is stored for up to 7 days, after which it is deleted automatically. By default, the retention policy for original recorded files cannot be changed. For enterprise customers, it can be adjusted individually upon request. This is a premium feature, available only upon request through your manager or support team.
  - `duration` integer — Video duration in milliseconds. May differ from "origin_video_duration" value if the video was uploaded with clipping through the parameters "clip_start_seconds" and "clip_duration_seconds"
  - `slug` string — A unique alphanumeric identifier used in public URLs to retrieve and view the video. It is unique for each video, generated randomly and set automatically by the system. Format of usage in URL is *.../videos/{`client_id`}_{slug}/...* Example: - Player: /videos/`12345_neAq1bYZ2` - Manifest: /videos/`12345_neAq1bYZ2`/master.m3u8 - Rendition: /videos/`12345_neAq1bYZ2`/`qid90v1_720`.mp4
  - `stream_id` integer — If the video was saved from a stream, then ID of that stream is saved here
  - `recording_started_at` string — If the video was saved from a stream, then start time of the stream recording is saved here. Format is date time in ISO 8601
  - `share_url` string — Custom URL or iframe displayed in the link field when a user clicks on a sharing button in player. If empty, the link field and social network sharing is disabled
  - `poster` string — Poster is your own static image which can be displayed before the video begins playing. This is often a frame of the video or a custom title screen. Field contains a link to your own uploaded image. Also look at "screenshot" attribute.
  - `poster_thumb` string — Field contains a link to minimized poster image. Original "poster" image is proportionally scaled to a size of 200 pixels in height.
  - `screenshot` string — A URL to the default screenshot is here. The image is selected from an array of all screenshots based on the “`screenshot_id`” attribute. If you use your own "poster", the link to it will be here too. Our video player uses this field to display the static image before the video starts playing. As soon as the user hits "play" the image will go away. If you use your own external video player, then you can use the value of this field to set the poster/thumbnail in your player. Example: - `video_js`.poster: ```api.screenshot``` - clappr.poster: ```api.screenshot```
  - `screenshots` string[] — Array of auto generated screenshots from the video. By default 5 static screenshots are taken from different places in the video. If the video is short, there may be fewer screenshots. Screenshots are created automatically, so they may contain not very good frames from the video. To use your own image look at "poster" attribute.
  - `screenshot_id` integer — ID of auto generated screenshots to be used for default screenshot. Counting from 0. A value of -1 sets the "screenshot" attribute to the URL of your own image from the "poster" attribute.
  - `sprite` string — Link to picture with video storyboard. Image in JPG format. The picture is a set of rectangles with frames from the video. Typically storyboard is used to show preview images when hovering the video's timeline.
  - `sprite_vtt` string — Storyboard in VTT format. This format implies an explicit indication of the timing and frame area from a large sprite image.
  - `ad_id` integer — ID of ad that should be shown. If empty the default ad is show. If there is no default ad, no ad is shownю
  - `hls_url` string — A URL to a master playlist HLS (master.m3u8). Chunk type will be selected automatically: - TS if your video was encoded to H264 only. - CMAF if your video was encoded additionally to H265 and/or AV1 codecs (as Apple does not support these codecs over MPEG TS, and they are not standardized in TS-container). You can also manually specify suffix-options that will allow you to change the manifest to your request: ``` /videos/{client_id}_{video_slug}/master[-cmaf][-min-N][-max-N][-img][-(h264|hevc|av1)].m3u8 ``` List of suffix-options: - [-cmaf] – getting HLS CMAF version of the manifest. Look at the ```hls_cmaf_url``` field. - [-min-N] – ABR soft limitation of qualities from below. - [-max-N] – ABR soft limitation of qualities from above. - [-img] – Roku trick play: to add tiles directly into .m3u8 manifest. Read the Product Documentation for details. - [-(h264|hevc|av1) – Video codec soft limitation. Applicable if the video was transcoded into multiple codecs H264, H265 and AV1 at once, but you want to return just 1 video codec in a manifest. Read the Product Documentation for details. ABR soft-limiting: Soft limitation of the list of qualities allows you to return not the entire list of transcoded qualities for a video, but only those you need. For example, the video is available in 7 qualities from 360p to 4K, but you want to return not more than 480p only due to the conditions of distribution of content to a specific end-user (i.e. free account): ABR soft-limiting examples: - To a generic ```.../master.m3u8``` manifest - Add a suffix-option to limit quality ```.../master-max-480.m3u8``` - Add a suffix-option to limit quality and codec ```.../master-min-320-max-320-h264.m3u8``` For more details look at the Product Documentation. Caution. Solely master.m3u8 (and master[-options].m3u8) is officially documented and intended for your use. Any additional internal manifests, sub-manifests, parameters, chunk names, file extensions, and related components are internal infrastructure entities. These may undergo modifications without prior notice, in any manner or form. It is strongly advised not to store them in your database or cache them on your end.
  - `hls_cmaf_url` string — A URL to a master playlist HLS (master-cmaf.m3u8) with CMAF-based chunks. Chunks are in fMP4 container. It's a code-agnostic container, which allows to use any like H264, H265, AV1, etc. It is possible to use the same suffix-options as described in the "hls_url" attribute. Caution. Solely master.m3u8 (and master[-options].m3u8) is officially documented and intended for your use. Any additional internal manifests, sub-manifests, parameters, chunk names, file extensions, and related components are internal infrastructure entities. These may undergo modifications without prior notice, in any manner or form. It is strongly advised not to store them in your database or cache them on your end.
  - `dash_url` string — A URL to a master playlist MPEG-DASH (master.mpd) with CMAF or WebM based chunks. Chunk type will be selected automatically for each quality: - CMAF for H264 and H265 codecs. - WebM for AV1 codec. This URL is a link to the main manifest. But you can also manually specify suffix-options that will allow you to change the manifest to your request: ``` /videos/{client_id}_{slug}/master[-min-N][-max-N][-(h264|hevc|av1)].mpd ``` List of suffix-options: - [-min-N] – ABR soft limitation of qualities from below. - [-max-N] – ABR soft limitation of qualities from above. - [-(h264|hevc|av1) – Video codec soft limitation. Applicable if the video was transcoded into multiple codecs H264, H265 and AV1 at once, but you want to return just 1 video codec in a manifest. Read the Product Documentation for details. Read more what is ABR soft-limiting in the "hls_url" field above. Caution. Solely master.mpd is officially documented and intended for your use. Any additional internal manifests, sub-manifests, parameters, chunk names, file extensions, and related components are internal infrastructure entities. These may undergo modifications without prior notice, in any manner or form. It is strongly advised not to store them in your database or cache them on your end.
  - `iframe_url` string — A URL to a built-in HTML video player with the video inside. It can be inserted into an iframe on your website and the video will automatically play in all browsers. The player can be opened or shared via this direct link. Also the video player can be integrated into your web pages using the Iframe tag. Example of usage on a web page: <iframe width="100%" height="100%" src="https://player.gvideo.co/videos/2675_FnlHXwA16ZMxmUr" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> There are some link modificators you can specify and add manually: - ?`no_low_latency` – player is forced to use non-low-latency streams HLS MPEG-TS, instead of MPEG-DASH CMAF or HLS/LL-HLS CMAF. - ?t=(integer) – time to start playback from specified point in the video. Applicable for VOD only. - ?`sub_lang`=(language) – force subtitles to specific language (2 letters ISO 639 code of a language). - Read more in the Product Documentation.
  - `custom_iframe_url` string — Custom URL of Iframe for video player to be used in share panel in player. Auto generated Iframe URL provided by default.
  - `views` integer — Number of video views through the built-in HTML video player of the Streaming Platform only. This attribute does not count views from other external players and native OS players, so here may be less number of views than in "cdn_views".
  - `cdn_views` integer — Total number of video views. It is calculated based on the analysis of all views, no matter in which player.
  - `client_user_id` integer — Custom meta field for storing the Identifier in your system. We do not use this field in any way when processing the stream. Example: ```client_user_id = 1001```
  - `status` 'empty' | 'pending' | 'viewable' | 'ready' | 'error' — Video processing status: - empty – initial status, when video-entity is created, but video-file has not yet been fully uploaded (TUS uploading, or downloading from an origin is not finished yet) - pending – video is in queue to be processed - viewable – video has at least 1 quality and can already be viewed via a link, but not all qualities are ready yet - ready – video is completely ready, available for viewing with all qualities - error – error while processing a video, look at "error" field
  - `error` string — Video processing error text will be saved here if "status: error"
  - `projection` string — Regulates the video format: - **regular** — plays the video as usual - **vr360** — plays the video in 360 degree mode - **vr180** — plays the video in 180 degree mode - **vr360tb** — plays the video in 3D 360 degree mode Top-Bottom. Default is regular
  - `converted_videos` object[] — Array of data about each transcoded quality
    - `id` integer — ID of the converted file of the specific quality
    - `name` string — Specific quality name
    - `width` integer — Width in pixels of the converted video file of the specified quality. Can be ```null``` for audio files.
    - `height` integer — Height in pixels of the converted video file of the specific quality. Can be ```null``` for audio-only files.
    - `size` integer — Size in bytes of the converted file of the specific quality. Can be ```null``` until transcoding is fully completed.
    - `progress` integer — Status of transcoding into the specific quality, from 0 to 100
    - `status` 'processing' | 'complete' | 'error' — Status of transcoding: - processing – video is being transcoded to this quality, - complete – quality is fully processed, - error – quality processing error, see parameter "error".
    - `error` string — Video processing error text in this quality
    - `mp4_url` string — A URL to a rendition file of the specified quality in MP4 format for downloading. **Download methods** For each converted video, additional download endpoints are available under `converted_videos`/`mp4_urls`. An MP4 download enpoints: 1. `/videos/{client_id}_{slug}/{filename}.mp4` 2. `/videos/{client_id}_{slug}/{filename}.mp4/download` 3. `/videos/{client_id}_{slug}/{filename}.mp4/download={custom_filename}` The first option returns the file as is. Response will be: ``` GET .mp4 ... content-type: video/mp4 ``` The second option with `/download` will respond with HTTP response header that directly tells browsers to download the file instead of playing it in the browser: ``` GET .mp4/download ... content-type: video/mp4 content-disposition: attachment access-control-expose-headers: Content-Disposition ``` The third option allows you to set a custom name for the file being downloaded. You can optionally specify a custom filename (just name excluding the .mp4 extension) using the download= query. Filename constraints: - Length: 1-255 characters - Must NOT include the .mp4 extension (it is added automatically) - Allowed characters: a-z, A-Z, 0-9, _(underscore), -(dash), .(dot) - First character cannot be .(dot) - Example valid filenames: ```holiday2025```, ```_backup.final```, ```clip-v1.2``` ``` GET .mp4/download={custom_filename} ... content-type: video/mp4 content-disposition: attachment; filename="{custom_filename}.mp4" access-control-expose-headers: Content-Disposition ``` Examples: - MP4: ```https://demo-public.gvideo.io/videos/2675_1OFgHZ1FWZNNvx1A/qid3567v1_h264_4050_1080.mp4/download``` - MP4 with custom download filename: ```https://demo-public.gvideo.io/videos/2675_1OFgHZ1FWZNNvx1A/qid3567v1_h264_4050_1080.mp4/download=highlights_v1.1_2025-05-30``` **Default MP4 file name structure** Link to the file {filename} contains information about the encoding method using format: ```<quality_version>_<codec>_<bitrate>_<height>.mp4``` - ```<quality_version>``` – Internal quality identifier and file version. Please do not use it, can be changed at any time without any notice. - ```<codec>``` – Codec name that was used to encode the video, or audio codec if it is an audio-only file. - ```<bitrate>``` – Encoding bitrate in Kbps. - ```<height>``` – Video height, or word "audio" if it is an audio-only file. Note that this link format has been applied since 14.08.2024. If the video entity was uploaded earlier, links may have old simplified format. Example: ``` /videos/{client_id}_{slug}/qid3567v1_h264_4050_1080.mp4 ``` **Dynamic speed limiting** This mode sets different limits for different users or for different types of content. The speed is adjusted based on requests with the “speed” and “buffer” arguments. Example: ``` ?speed=50k&buffer=500k ``` Read more in Product Documentation in CDN section "Network limits". **Secure token authentication for MP4 (updated)** Access to MP4 download links only can be protected using advanced secure tokens passed as query parameters. Token generation uses the entire MP4 path, which ensures the token only grants access to a specific quality/version of the video. This prevents unintended access to other bitrate versions of an ABR stream. Token Query Parameters: - token: The generated hash - expires: Expiration timestamp - speed: (optional) Speed limit in bytes/sec, or empty string - buffer: (optional) Buffer size in bytes, or empty string Optional (for IP-bound tokens): - ip: The user’s IP address Example: ``` ?md5=QX39c77lbQKvYgMMAvpyMQ&expires=1743167062 ``` Read more in Product Documentation in Streaming section "Protected temporarily link".

## Other responses

- `422` — Possible error messages: **{ "errors": { "name": [ "can't be blank" ] } }** *Name* is a required parameter, so it must be specified

---

[API](https://skmtc.net/g-core/apis/gcore-openapi.md) · [All operations](https://skmtc.net/g-core/apis/gcore-openapi/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/g-core/gcore-openapi/revisions/09e652815095/schema)
