Generate Thumbnail
curl --request POST \
--url https://api.example.com/api/v1/thumbnails/generate \
--header 'Content-Type: multipart/form-data' \
--form 'file=<string>' \
--form 'url=<string>' \
--form 'url_headers=<string>' \
--form width=600 \
--form height=400 \
--form quality=95 \
--form sync=true \
--form 'webhook_url=<string>' \
--form response_type=urlimport requests
url = "https://api.example.com/api/v1/thumbnails/generate"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--"
headers = {"Content-Type": "multipart/form-data"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('url', '<string>');
form.append('url_headers', '<string>');
form.append('width', '600');
form.append('height', '400');
form.append('quality', '95');
form.append('sync', 'true');
form.append('webhook_url', '<string>');
form.append('response_type', 'url');
const options = {method: 'POST'};
options.body = form;
fetch('https://api.example.com/api/v1/thumbnails/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/thumbnails/generate",
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\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/thumbnails/generate"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/thumbnails/generate")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/thumbnails/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"job_id": "job_abc123",
"metadata": {
"created_at": "2024-01-15T10:30:00Z",
"file_category": "pdf",
"file_size": 102400,
"file_type": "pdf",
"mime_type": "application/pdf",
"original_filename": "document.pdf",
"thumbnail_height": 400,
"thumbnail_width": 600
},
"status": "completed",
"success": true,
"thumbnail_url": "https://storage.example.com/thumbnails/thumb_abc123.jpg"
}{
"job_id": "job_abc123",
"message": "Job created. Poll /api/v1/thumbnails/jobs/{job_id} for status.",
"status": "pending",
"success": true
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}Utilities
Generate Thumbnail
Generate a thumbnail from a file upload or URL.
File Upload: Use multipart/form-data with a file field.
URL Fetch: Use JSON body with url field. Optionally include url_headers for authenticated URLs.
Options:
width,height: Max dimensions (default 600x400)quality: JPEG quality 1-100 (default 95)sync: Wait for result (true) or return job ID (false)webhook_url: URL to POST result when complete (async only)response_type: “url” returns storage URL, “base64” returns encoded image
POST
/
api
/
v1
/
thumbnails
/
generate
Generate Thumbnail
curl --request POST \
--url https://api.example.com/api/v1/thumbnails/generate \
--header 'Content-Type: multipart/form-data' \
--form 'file=<string>' \
--form 'url=<string>' \
--form 'url_headers=<string>' \
--form width=600 \
--form height=400 \
--form quality=95 \
--form sync=true \
--form 'webhook_url=<string>' \
--form response_type=urlimport requests
url = "https://api.example.com/api/v1/thumbnails/generate"
payload = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--"
headers = {"Content-Type": "multipart/form-data"}
response = requests.post(url, data=payload, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('url', '<string>');
form.append('url_headers', '<string>');
form.append('width', '600');
form.append('height', '400');
form.append('quality', '95');
form.append('sync', 'true');
form.append('webhook_url', '<string>');
form.append('response_type', 'url');
const options = {method: 'POST'};
options.body = form;
fetch('https://api.example.com/api/v1/thumbnails/generate', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/api/v1/thumbnails/generate",
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\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/api/v1/thumbnails/generate"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/api/v1/thumbnails/generate")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/api/v1/thumbnails/generate")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"url_headers\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"width\"\r\n\r\n600\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"height\"\r\n\r\n400\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"quality\"\r\n\r\n95\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"sync\"\r\n\r\ntrue\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"response_type\"\r\n\r\nurl\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"job_id": "job_abc123",
"metadata": {
"created_at": "2024-01-15T10:30:00Z",
"file_category": "pdf",
"file_size": 102400,
"file_type": "pdf",
"mime_type": "application/pdf",
"original_filename": "document.pdf",
"thumbnail_height": 400,
"thumbnail_width": 600
},
"status": "completed",
"success": true,
"thumbnail_url": "https://storage.example.com/thumbnails/thumb_abc123.jpg"
}{
"job_id": "job_abc123",
"message": "Job created. Poll /api/v1/thumbnails/jobs/{job_id} for status.",
"status": "pending",
"success": true
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}{
"detail": "File size exceeds maximum allowed (50MB)",
"error": "validation_error",
"success": false
}Headers
Body
multipart/form-data
File to generate thumbnail from
URL to fetch file from
JSON-encoded headers for URL auth
Max thumbnail width
Required range:
50 <= x <= 2000Max thumbnail height
Required range:
50 <= x <= 2000JPEG quality
Required range:
1 <= x <= 100Wait for result or return job ID
Webhook URL for async completion
Response type: 'url' or 'base64'
Response
Successful Response
Response for a completed thumbnail generation.
Unique job identifier
Thumbnail metadata
Show child attributes
Show child attributes
Job processing status.
Available options:
pending, processing, completed, failed URL to the thumbnail image
Base64-encoded thumbnail (if response_type='base64')
⌘I