Grab a frame from the video as a JPEG/PNG/WebP image
Grabs one frame as an image at the chosen time.
Request
POSThttps://video-tools.p.apihiver.com/v1/thumbnail
Upload the video in the file field (max 50 MB). Instead of a file you can send JSON: {"url": "https://…"} for a public video URL, or {"base64": "…"} — the options below then go in the same JSON object.
*
No file chosen
File. The video file (MP4, MOV, WebM, MKV, AVI…).
Number. Seconds into the video (default: 10% of the duration).
Integer. Output width in px.
String.
jpeg, png or webp. Parameters and body structure are inherited from this endpoint's definition. Changes here only apply to this test run.
Language
Client
1curl --request POST \
2 --url https://video-tools.p.apihiver.com/v1/thumbnail \
3 --header 'Accept: application/json' \
4 --header 'X-API-Key: YOUR_API_KEY' \
5 --header 'content-type: multipart/form-data' \
6 --form file=@file.bin \
7 --form at=1.5 \
8 --form width=640 \
9 --form format=jpegGrab a frame from the video as a JPEG/PNG/WebP image: Video Tools API reference
Grabs one frame as an image at the chosen time. This endpoint is part of the Video Tools API: Get video info, grab thumbnails, make storyboard contact sheets, extract audio (MP3/WAV/M4A) and convert clips to GIF.
Grab a frame from the video as a JPEG/PNG/WebP image: example requests in every language
POST /v1/thumbnail in Shell (cURL)
curl --request POST \
--url https://video-tools.p.apihiver.com/v1/thumbnail \
--header 'Accept: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'content-type: multipart/form-data' \
--form [email protected] \
--form at=1.5 \
--form width=640 \
--form format=jpegPOST /v1/thumbnail in Shell (HTTPie)
echo '-----011000010111000001101001
Content-Disposition: form-data; name="file"; filename="file.bin"
Content-Type: multipart/form-data
-----011000010111000001101001
Content-Disposition: form-data; name="at"
1.5
-----011000010111000001101001
Content-Disposition: form-data; name="width"
640
-----011000010111000001101001
Content-Disposition: form-data; name="format"
jpeg
-----011000010111000001101001--
' | \
http POST https://video-tools.p.apihiver.com/v1/thumbnail \
Accept:application/json \
X-API-Key:YOUR_API_KEY \
content-type:'multipart/form-data; boundary=---011000010111000001101001'POST /v1/thumbnail in Shell (Wget)
wget --quiet \
--method POST \
--header 'Accept: application/json' \
--header 'X-API-Key: YOUR_API_KEY' \
--header 'content-type: multipart/form-data; boundary=---011000010111000001101001' \
--body-data '-----011000010111000001101001\r\nContent-Disposition: form-data; name="file"; filename="file.bin"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="at"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="width"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="format"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n' \
--output-document \
- https://video-tools.p.apihiver.com/v1/thumbnailPOST /v1/thumbnail in Node.js (http)
const http = require('https');
const options = {
method: 'POST',
hostname: 'video-tools.p.apihiver.com',
port: null,
path: '/v1/thumbnail',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY',
'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
}
};
const req = http.request(options, function (res) {
const chunks = [];
res.on('data', function (chunk) {
chunks.push(chunk);
});
res.on('end', function () {
const body = Buffer.concat(chunks);
console.log(body.toString());
});
});
req.write('-----011000010111000001101001\r\nContent-Disposition: form-data; name="file"; filename="file.bin"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="at"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="width"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="format"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n');
req.end();POST /v1/thumbnail in Node.js (Request)
const fs = require('fs');
const request = require('request');
const options = {
method: 'POST',
url: 'https://video-tools.p.apihiver.com/v1/thumbnail',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY',
'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
},
formData: {
file: {
value: fs.createReadStream('file.bin'),
options: {filename: 'file.bin', contentType: 'multipart/form-data'}
},
at: '1.5',
width: '640',
format: 'jpeg'
}
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
console.log(body);
});POST /v1/thumbnail in Node.js (Unirest)
const fs = require('fs');
const unirest = require('unirest');
const req = unirest('POST', 'https://video-tools.p.apihiver.com/v1/thumbnail');
req.headers({
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY',
'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
});
req.multipart([
{
body: fs.createReadStream('file.bin'),
'content-type': 'multipart/form-data'
},
{
body: '1.5'
},
{
body: '640'
},
{
body: 'jpeg'
}
]);
req.end(function (res) {
if (res.error) throw new Error(res.error);
console.log(res.body);
});POST /v1/thumbnail in Node.js (Axios)
const axios = require('axios').default;
const options = {
method: 'POST',
url: 'https://video-tools.p.apihiver.com/v1/thumbnail',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY',
'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
},
data: '-----011000010111000001101001\r\nContent-Disposition: form-data; name="file"; filename="file.bin"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="at"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="width"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name="format"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n'
};
try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}POST /v1/thumbnail in Node.js (Fetch)
const fs = require('fs');
const FormData = require('form-data');
const fetch = require('node-fetch');
const formData = new FormData();
formData.append('file', fs.createReadStream('file.bin'));
formData.append('at', '1.5');
formData.append('width', '640');
formData.append('format', 'jpeg');
const url = 'https://video-tools.p.apihiver.com/v1/thumbnail';
const options = {
method: 'POST',
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
options.body = formData;
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}POST /v1/thumbnail in JavaScript (XMLHttpRequest)
const data = new FormData();
data.append('file', 'file.bin');
data.append('at', '1.5');
data.append('width', '640');
data.append('format', 'jpeg');
const xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener('readystatechange', function () {
if (this.readyState === this.DONE) {
console.log(this.responseText);
}
});
xhr.open('POST', 'https://video-tools.p.apihiver.com/v1/thumbnail');
xhr.setRequestHeader('Accept', 'application/json');
xhr.setRequestHeader('X-API-Key', 'YOUR_API_KEY');
xhr.send(data);POST /v1/thumbnail in JavaScript (Axios)
import axios from 'axios';
const form = new FormData();
form.append('file', 'file.bin');
form.append('at', '1.5');
form.append('width', '640');
form.append('format', 'jpeg');
const options = {
method: 'POST',
url: 'https://video-tools.p.apihiver.com/v1/thumbnail',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY',
'content-type': 'multipart/form-data; boundary=---011000010111000001101001'
},
data: '[form]'
};
try {
const { data } = await axios.request(options);
console.log(data);
} catch (error) {
console.error(error);
}POST /v1/thumbnail in JavaScript (Fetch)
const url = 'https://video-tools.p.apihiver.com/v1/thumbnail';
const form = new FormData();
form.append('file', 'file.bin');
form.append('at', '1.5');
form.append('width', '640');
form.append('format', 'jpeg');
const options = {
method: 'POST',
headers: {Accept: 'application/json', 'X-API-Key': 'YOUR_API_KEY'}
};
options.body = form;
try {
const response = await fetch(url, options);
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}POST /v1/thumbnail in JavaScript (jQuery)
const form = new FormData();
form.append('file', 'file.bin');
form.append('at', '1.5');
form.append('width', '640');
form.append('format', 'jpeg');
const settings = {
async: true,
crossDomain: true,
url: 'https://video-tools.p.apihiver.com/v1/thumbnail',
method: 'POST',
headers: {
Accept: 'application/json',
'X-API-Key': 'YOUR_API_KEY'
},
processData: false,
contentType: false,
mimeType: 'multipart/form-data',
data: form
};
$.ajax(settings).done(function (response) {
console.log(response);
});POST /v1/thumbnail in Python (http.client)
import http.client
conn = http.client.HTTPSConnection("video-tools.p.apihiver.com")
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n"
headers = {
'Accept': "application/json",
'X-API-Key': "YOUR_API_KEY",
'content-type': "multipart/form-data; boundary=---011000010111000001101001"
}
conn.request("POST", "/v1/thumbnail", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))POST /v1/thumbnail in Python (Requests)
import requests
url = "https://video-tools.p.apihiver.com/v1/thumbnail"
files = { "file": "open('file.bin', 'rb')" }
payload = {
"at": "1.5",
"width": "640",
"format": "jpeg"
}
headers = {
"Accept": "application/json",
"X-API-Key": "YOUR_API_KEY"
}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.json())POST /v1/thumbnail in PHP (cURL)
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://video-tools.p.apihiver.com/v1/thumbnail",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n",
CURLOPT_HTTPHEADER => [
"Accept: application/json",
"X-API-Key: YOUR_API_KEY",
"content-type: multipart/form-data; boundary=---011000010111000001101001"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}POST /v1/thumbnail in PHP (Guzzle)
<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('POST', 'https://video-tools.p.apihiver.com/v1/thumbnail', [
'multipart' => [
[
'name' => 'file',
'filename' => 'file.bin',
'contents' => null,
'headers' => [
'Content-Type' => 'multipart/form-data'
]
],
[
'name' => 'at',
'contents' => '1.5'
],
[
'name' => 'width',
'contents' => '640'
],
[
'name' => 'format',
'contents' => 'jpeg'
]
]
'headers' => [
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY',
],
]);
echo $response->getBody();POST /v1/thumbnail in PHP (PECL HTTP v1)
<?php
$request = new HttpRequest();
$request->setUrl('https://video-tools.p.apihiver.com/v1/thumbnail');
$request->setMethod(HTTP_METH_POST);
$request->setHeaders([
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY',
'content-type' => 'multipart/form-data; boundary=---011000010111000001101001'
]);
$request->setBody('-----011000010111000001101001
Content-Disposition: form-data; name="file"; filename="file.bin"
Content-Type: multipart/form-data
-----011000010111000001101001
Content-Disposition: form-data; name="at"
1.5
-----011000010111000001101001
Content-Disposition: form-data; name="width"
640
-----011000010111000001101001
Content-Disposition: form-data; name="format"
jpeg
-----011000010111000001101001--
');
try {
$response = $request->send();
echo $response->getBody();
} catch (HttpException $ex) {
echo $ex;
}POST /v1/thumbnail in PHP (PECL HTTP v2)
<?php
$client = new http\Client;
$request = new http\Client\Request;
$body = new http\Message\Body;
$body->addForm([
'at' => '1.5',
'width' => '640',
'format' => 'jpeg'
], [
[
'name' => 'file',
'type' => 'multipart/form-data',
'file' => 'file.bin',
'data' => null
]
]);
$request->setRequestUrl('https://video-tools.p.apihiver.com/v1/thumbnail');
$request->setRequestMethod('POST');
$request->setBody($body);
$request->setHeaders([
'Accept' => 'application/json',
'X-API-Key' => 'YOUR_API_KEY'
]);
$client->enqueue($request)->send();
$response = $client->getResponse();
echo $response->getBody();POST /v1/thumbnail in Java (AsyncHttp)
AsyncHttpClient client = new DefaultAsyncHttpClient();
client.prepare("POST", "https://video-tools.p.apihiver.com/v1/thumbnail")
.setHeader("Accept", "application/json")
.setHeader("X-API-Key", "YOUR_API_KEY")
.setHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001")
.setBody("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n")
.execute()
.toCompletableFuture()
.thenAccept(System.out::println)
.join();
client.close();POST /v1/thumbnail in Java (java.net.http)
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://video-tools.p.apihiver.com/v1/thumbnail"))
.header("Accept", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.header("content-type", "multipart/form-data; boundary=---011000010111000001101001")
.method("POST", HttpRequest.BodyPublishers.ofString("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n"))
.build();
HttpResponse<String> response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());POST /v1/thumbnail in Java (OkHttp)
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001");
RequestBody body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n");
Request request = new Request.Builder()
.url("https://video-tools.p.apihiver.com/v1/thumbnail")
.post(body)
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.addHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001")
.build();
Response response = client.newCall(request).execute();POST /v1/thumbnail in Java (Unirest)
HttpResponse<String> response = Unirest.post("https://video-tools.p.apihiver.com/v1/thumbnail")
.header("Accept", "application/json")
.header("X-API-Key", "YOUR_API_KEY")
.header("content-type", "multipart/form-data; boundary=---011000010111000001101001")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n")
.asString();POST /v1/thumbnail in C# (HttpClient)
using System.Net.Http.Headers;
var client = new HttpClient();
var request = new HttpRequestMessage
{
Method = HttpMethod.Post,
RequestUri = new Uri("https://video-tools.p.apihiver.com/v1/thumbnail"),
Headers =
{
{ "Accept", "application/json" },
{ "X-API-Key", "YOUR_API_KEY" },
},
Content = new MultipartFormDataContent
{
new StringContent("")
{
Headers =
{
ContentType = new MediaTypeHeaderValue("multipart/form-data"),
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "file",
FileName = "file.bin",
}
}
},
new StringContent("1.5")
{
Headers =
{
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "at",
}
}
},
new StringContent("640")
{
Headers =
{
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "width",
}
}
},
new StringContent("jpeg")
{
Headers =
{
ContentDisposition = new ContentDispositionHeaderValue("form-data")
{
Name = "format",
}
}
},
},
};
using (var response = await client.SendAsync(request))
{
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body);
}POST /v1/thumbnail in C# (RestSharp)
var client = new RestClient("https://video-tools.p.apihiver.com/v1/thumbnail");
var request = new RestRequest("", Method.Post);
request.AddHeader("Accept", "application/json");
request.AddHeader("X-API-Key", "YOUR_API_KEY");
request.AddHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001");
request.AddParameter("multipart/form-data; boundary=---011000010111000001101001", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
var response = client.Execute(request);POST /v1/thumbnail in Go (NewRequest)
package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://video-tools.p.apihiver.com/v1/thumbnail"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Accept", "application/json")
req.Header.Add("X-API-Key", "YOUR_API_KEY")
req.Header.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(res)
fmt.Println(string(body))
}POST /v1/thumbnail in Ruby (net::http)
require 'uri'
require 'net/http'
url = URI("https://video-tools.p.apihiver.com/v1/thumbnail")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Accept"] = 'application/json'
request["X-API-Key"] = 'YOUR_API_KEY'
request["content-type"] = 'multipart/form-data; boundary=---011000010111000001101001'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n"
response = http.request(request)
puts response.read_bodyPOST /v1/thumbnail in Swift (NSURLSession)
import Foundation
let headers = [
"Accept": "application/json",
"X-API-Key": "YOUR_API_KEY",
"content-type": "multipart/form-data; boundary=---011000010111000001101001"
]
let parameters = [
[
"name": "file",
"fileName": "file.bin",
"contentType": "multipart/form-data"
],
[
"name": "at",
"value": "1.5"
],
[
"name": "width",
"value": "640"
],
[
"name": "format",
"value": "jpeg"
]
]
let boundary = "---011000010111000001101001"
var body = ""
var error: NSError? = nil
for param in parameters {
let paramName = param["name"]!
body += "--\(boundary)\r\n"
body += "Content-Disposition:form-data; name=\"\(paramName)\""
if let filename = param["fileName"] {
let contentType = param["content-type"]!
let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8)
if (error != nil) {
print(error as Any)
}
body += "; filename=\"\(filename)\"\r\n"
body += "Content-Type: \(contentType)\r\n\r\n"
body += fileContent
} else if let paramValue = param["value"] {
body += "\r\n\r\n\(paramValue)"
}
}
let request = NSMutableURLRequest(url: NSURL(string: "https://video-tools.p.apihiver.com/v1/thumbnail")! as URL,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
if (error != nil) {
print(error as Any)
} else {
let httpResponse = response as? HTTPURLResponse
print(httpResponse)
}
})
dataTask.resume()POST /v1/thumbnail in Objective-C (NSURLSession)
#import <Foundation/Foundation.h>
NSDictionary *headers = @{ @"Accept": @"application/json",
@"X-API-Key": @"YOUR_API_KEY",
@"content-type": @"multipart/form-data; boundary=---011000010111000001101001" };
NSArray *parameters = @[ @{ @"name": @"file", @"fileName": @"file.bin", @"contentType": @"multipart/form-data" },
@{ @"name": @"at", @"value": @"1.5" },
@{ @"name": @"width", @"value": @"640" },
@{ @"name": @"format", @"value": @"jpeg" } ];
NSString *boundary = @"---011000010111000001101001";
NSError *error;
NSMutableString *body = [NSMutableString string];
for (NSDictionary *param in parameters) {
[body appendFormat:@"--%@\r\n", boundary];
if (param[@"fileName"]) {
[body appendFormat:@"Content-Disposition:form-data; name=\"%@\"; filename=\"%@\"\r\n", param[@"name"], param[@"fileName"]];
[body appendFormat:@"Content-Type: %@\r\n\r\n", param[@"contentType"]];
[body appendFormat:@"%@", [NSString stringWithContentsOfFile:param[@"fileName"] encoding:NSUTF8StringEncoding error:&error]];
if (error) {
NSLog(@"%@", error);
}
} else {
[body appendFormat:@"Content-Disposition:form-data; name=\"%@\"\r\n\r\n", param[@"name"]];
[body appendFormat:@"%@", param[@"value"]];
}
}
[body appendFormat:@"\r\n--%@--\r\n", boundary];
NSData *postData = [body dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://video-tools.p.apihiver.com/v1/thumbnail"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:postData];
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
if (error) {
NSLog(@"%@", error);
} else {
NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
NSLog(@"%@", httpResponse);
}
}];
[dataTask resume];POST /v1/thumbnail in Kotlin (OkHttp)
val client = OkHttpClient()
val mediaType = MediaType.parse("multipart/form-data; boundary=---011000010111000001101001")
val body = RequestBody.create(mediaType, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n")
val request = Request.Builder()
.url("https://video-tools.p.apihiver.com/v1/thumbnail")
.post(body)
.addHeader("Accept", "application/json")
.addHeader("X-API-Key", "YOUR_API_KEY")
.addHeader("content-type", "multipart/form-data; boundary=---011000010111000001101001")
.build()
val response = client.newCall(request).execute()POST /v1/thumbnail in C (libcurl)
CURL *hnd = curl_easy_init();
curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(hnd, CURLOPT_URL, "https://video-tools.p.apihiver.com/v1/thumbnail");
struct curl_slist *headers = NULL;
headers = curl_slist_append(headers, "Accept: application/json");
headers = curl_slist_append(headers, "X-API-Key: YOUR_API_KEY");
headers = curl_slist_append(headers, "content-type: multipart/form-data; boundary=---011000010111000001101001");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n");
CURLcode ret = curl_easy_perform(hnd);POST /v1/thumbnail in Clojure (clj-http)
(require '[clj-http.client :as client])
(client/post "https://video-tools.p.apihiver.com/v1/thumbnail" {:headers {:X-API-Key "YOUR_API_KEY"}
:multipart [{:name "file"
:content (clojure.java.io/file "file.bin")} {:name "at"
:content "1.5"} {:name "width"
:content "640"} {:name "format"
:content "jpeg"}]
:accept :json})POST /v1/thumbnail in OCaml (CoHTTP)
open Cohttp_lwt_unix
open Cohttp
open Lwt
let uri = Uri.of_string "https://video-tools.p.apihiver.com/v1/thumbnail" in
let headers = Header.add_list (Header.init ()) [
("Accept", "application/json");
("X-API-Key", "YOUR_API_KEY");
("content-type", "multipart/form-data; boundary=---011000010111000001101001");
] in
let body = Cohttp_lwt_body.of_string "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n" in
Client.call ~headers ~body `POST uri
>>= fun (res, body_stream) ->
(* Do stuff with the result *)POST /v1/thumbnail in R (httr)
library(httr)
url <- "https://video-tools.p.apihiver.com/v1/thumbnail"
payload <- "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"file.bin\"\r\nContent-Type: multipart/form-data\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"at\"\r\n\r\n1.5\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n640\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"format\"\r\n\r\njpeg\r\n-----011000010111000001101001--\r\n"
encode <- "multipart"
response <- VERB("POST", url, body = payload, add_headers('X-API-Key' = 'YOUR_API_KEY'), content_type("multipart/form-data"), accept("application/json"), encode = encode)
content(response, "text")POST /v1/thumbnail in PowerShell (Invoke-WebRequest)
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "YOUR_API_KEY")
$headers.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")
$response = Invoke-WebRequest -Uri 'https://video-tools.p.apihiver.com/v1/thumbnail' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"; filename="file.bin"
Content-Type: multipart/form-data
-----011000010111000001101001
Content-Disposition: form-data; name="at"
1.5
-----011000010111000001101001
Content-Disposition: form-data; name="width"
640
-----011000010111000001101001
Content-Disposition: form-data; name="format"
jpeg
-----011000010111000001101001--
'POST /v1/thumbnail in PowerShell (Invoke-RestMethod)
$headers=@{}
$headers.Add("Accept", "application/json")
$headers.Add("X-API-Key", "YOUR_API_KEY")
$headers.Add("content-type", "multipart/form-data; boundary=---011000010111000001101001")
$response = Invoke-RestMethod -Uri 'https://video-tools.p.apihiver.com/v1/thumbnail' -Method POST -Headers $headers -ContentType 'multipart/form-data; boundary=---011000010111000001101001' -Body '-----011000010111000001101001
Content-Disposition: form-data; name="file"; filename="file.bin"
Content-Type: multipart/form-data
-----011000010111000001101001
Content-Disposition: form-data; name="at"
1.5
-----011000010111000001101001
Content-Disposition: form-data; name="width"
640
-----011000010111000001101001
Content-Disposition: form-data; name="format"
jpeg
-----011000010111000001101001--
'POST /v1/thumbnail in HTTP (HTTP/1.1)
POST /v1/thumbnail HTTP/1.1
Accept: application/json
X-Api-Key: YOUR_API_KEY
Content-Type: multipart/form-data; boundary=---011000010111000001101001
Host: video-tools.p.apihiver.com
Content-Length: 420
-----011000010111000001101001
Content-Disposition: form-data; name="file"; filename="file.bin"
Content-Type: multipart/form-data
-----011000010111000001101001
Content-Disposition: form-data; name="at"
1.5
-----011000010111000001101001
Content-Disposition: form-data; name="width"
640
-----011000010111000001101001
Content-Disposition: form-data; name="format"
jpeg
-----011000010111000001101001--
Example response (200, image/jpeg)
The frame image (type follows `format`). Header `X-Frame-At-Seconds`.
Errors
- 400 — A required parameter is missing or a value has the wrong format.
1{ 2 "error": { 3 "code": "INVALID_INPUT", 4 "message": "Provide a file upload, 'url', or 'base64'." 5 } 6}
Gateway errors (missing key, no subscription, rate limits) are listed in Error codes.