Server-side direct upload
curl --request POST \
--url https://app-api.autorender.io/api/v1/uploads \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file='@example-file' \
--form file_name=product.jpg \
--form folder=products/sku123 \
--form 'transform=<string>' \
--form 'tags=product,thumbnail' \
--form 'random_prefix=<string>' \
--form custom_id=sku123 \
--form 'metadata={"productId":"123"}' \
--form 'webhook_url=<string>'import requests
url = "https://app-api.autorender.io/api/v1/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_name": "product.jpg",
"folder": "products/sku123",
"transform": "<string>",
"tags": "product,thumbnail",
"random_prefix": "<string>",
"custom_id": "sku123",
"metadata": "{\"productId\":\"123\"}",
"webhook_url": "<string>"
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('file_name', 'product.jpg');
form.append('folder', 'products/sku123');
form.append('transform', '<string>');
form.append('tags', 'product,thumbnail');
form.append('random_prefix', '<string>');
form.append('custom_id', 'sku123');
form.append('metadata', '{"productId":"123"}');
form.append('webhook_url', '<string>');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://app-api.autorender.io/api/v1/uploads', 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://app-api.autorender.io/api/v1/uploads",
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=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-api-key: <api-key>"
],
]);
$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://app-api.autorender.io/api/v1/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app-api.autorender.io/api/v1/uploads")
.header("x-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://app-api.autorender.io/api/v1/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"file_no": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"path": "<string>",
"url": "<string>",
"width": 0,
"height": 0,
"size": 0,
"mime_type": "<string>",
"tags": [
"<string>"
],
"metadata": {},
"custom_id": "<string>",
"folder_no": "<string>",
"is_duplicate": true,
"created_at": "2023-11-07T05:31:56Z",
"upload_source": "<string>",
"thumbnail": "<string>",
"extension": "<string>",
"format": "<string>",
"hash": "<string>",
"is_private": true
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"retryAfterSeconds": 123
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}Upload
Direct upload
Upload a file with multipart/form-data using an API key.
POST
/
api
/
v1
/
uploads
Server-side direct upload
curl --request POST \
--url https://app-api.autorender.io/api/v1/uploads \
--header 'Content-Type: multipart/form-data' \
--header 'x-api-key: <api-key>' \
--form file='@example-file' \
--form file_name=product.jpg \
--form folder=products/sku123 \
--form 'transform=<string>' \
--form 'tags=product,thumbnail' \
--form 'random_prefix=<string>' \
--form custom_id=sku123 \
--form 'metadata={"productId":"123"}' \
--form 'webhook_url=<string>'import requests
url = "https://app-api.autorender.io/api/v1/uploads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"file_name": "product.jpg",
"folder": "products/sku123",
"transform": "<string>",
"tags": "product,thumbnail",
"random_prefix": "<string>",
"custom_id": "sku123",
"metadata": "{\"productId\":\"123\"}",
"webhook_url": "<string>"
}
headers = {"x-api-key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('file_name', 'product.jpg');
form.append('folder', 'products/sku123');
form.append('transform', '<string>');
form.append('tags', 'product,thumbnail');
form.append('random_prefix', '<string>');
form.append('custom_id', 'sku123');
form.append('metadata', '{"productId":"123"}');
form.append('webhook_url', '<string>');
const options = {method: 'POST', headers: {'x-api-key': '<api-key>'}};
options.body = form;
fetch('https://app-api.autorender.io/api/v1/uploads', 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://app-api.autorender.io/api/v1/uploads",
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=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"x-api-key: <api-key>"
],
]);
$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://app-api.autorender.io/api/v1/uploads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://app-api.autorender.io/api/v1/uploads")
.header("x-api-key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://app-api.autorender.io/api/v1/uploads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-api-key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file_name\"\r\n\r\nproduct.jpg\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"folder\"\r\n\r\nproducts/sku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"transform\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"tags\"\r\n\r\nproduct,thumbnail\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"random_prefix\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"custom_id\"\r\n\r\nsku123\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"metadata\"\r\n\r\n{\"productId\":\"123\"}\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"webhook_url\"\r\n\r\n<string>\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"file_no": "<string>",
"workspace_id": "<string>",
"name": "<string>",
"path": "<string>",
"url": "<string>",
"width": 0,
"height": 0,
"size": 0,
"mime_type": "<string>",
"tags": [
"<string>"
],
"metadata": {},
"custom_id": "<string>",
"folder_no": "<string>",
"is_duplicate": true,
"created_at": "2023-11-07T05:31:56Z",
"upload_source": "<string>",
"thumbnail": "<string>",
"extension": "<string>",
"format": "<string>",
"hash": "<string>",
"is_private": true
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>"
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}{
"error": "<string>",
"message": "<string>",
"retryAfterSeconds": 123
}{
"error": "<string>",
"success": true,
"errorCode": "<string>",
"message": "<string>"
}Overview
Uploads a file to your workspace asmultipart/form-data. This is the primary upload endpoint for backend services.
Required request
Headers
| Header | Value |
|---|---|
Authorization | Bearer YOUR_API_KEY |
Content-Type | multipart/form-data |
Form fields
| Field | Required | Description |
|---|---|---|
file | Yes | The binary file to upload |
file_name | Yes | The name the file is stored under in your workspace |
Minimal example
curl -X POST \
https://upload.autorender.io/api/v1/uploads \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "file=@./image.jpg" \
-F "file_name=image.jpg"
Common optional fields
| Field | Description |
|---|---|
folder | Destination path for the file (e.g. products/shoes) |
tags | Comma-separated labels you can filter by later (e.g. hero,banner) |
transform | Transformation string applied as the file is stored (e.g. w_800,f_auto) |
metadata | JSON string of custom fields (e.g. {"source":"shopify"}) |
custom_id | Your own reference ID for the file |
random_prefix | Appends a random suffix to the stored name so filenames don’t collide |
Success response shape
{
"success": true,
"data": {
"file_no": "1234567890",
"name": "image.jpg",
"url": "https://assets.autorender.io/...",
"path": "products/image.jpg",
"format": "jpg",
"file_size": 102400
}
}
Error pattern
A failed request returnssuccess: false with an error and a message. A missing or invalid key returns:
{
"success": false,
"error": "Unauthorized",
"message": "Invalid or missing API key"
}
Next steps
Remote URL upload
Fetch a file from another server instead of uploading its bytes.
Multipart start
Upload large files in parts with presigned URLs.
Authorizations
API key for public endpoints. Can also be provided via Authorization: Bearer
Body
multipart/form-data
File to upload.
File name (e.g. product.jpg)
Example:
"product.jpg"
Optional folder path
Example:
"products/sku123"
Transform string (w_300,h_300,c_crop,...)
Comma-separated tags
Example:
"product,thumbnail"
true/false to append random suffix
Custom identifier
Example:
"sku123"
JSON string of metadata
Example:
"{\"productId\":\"123\"}"
URL to notify on success
Response
Upload created
Upload created
Required range:
-9007199254740991 <= x <= 9007199254740991Required range:
-9007199254740991 <= x <= 9007199254740991Required range:
-9007199254740991 <= x <= 9007199254740991Show child attributes
Show child attributes
Pattern:
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Was this page helpful?
⌘I