curl --request POST \
--url https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"shared_metadata": {
"campaign": "summer_2024"
},
"shared_object_metadata": {
"category": "marketing"
},
"uploads": [
{
"blob_property": "video",
"content_type": "video/mp4",
"filename": "video1.mp4"
},
{
"blob_property": "thumbnail",
"content_type": "image/jpeg",
"filename": "thumbnail1.jpg"
}
]
}
'import requests
url = "https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch"
payload = {
"shared_metadata": { "campaign": "summer_2024" },
"shared_object_metadata": { "category": "marketing" },
"uploads": [
{
"blob_property": "video",
"content_type": "video/mp4",
"filename": "video1.mp4"
},
{
"blob_property": "thumbnail",
"content_type": "image/jpeg",
"filename": "thumbnail1.jpg"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
shared_metadata: {campaign: 'summer_2024'},
shared_object_metadata: {category: 'marketing'},
uploads: [
{blob_property: 'video', content_type: 'video/mp4', filename: 'video1.mp4'},
{
blob_property: 'thumbnail',
content_type: 'image/jpeg',
filename: 'thumbnail1.jpg'
}
]
})
};
fetch('https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch', 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.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'shared_metadata' => [
'campaign' => 'summer_2024'
],
'shared_object_metadata' => [
'category' => 'marketing'
],
'uploads' => [
[
'blob_property' => 'video',
'content_type' => 'video/mp4',
'filename' => 'video1.mp4'
],
[
'blob_property' => 'thumbnail',
'content_type' => 'image/jpeg',
'filename' => 'thumbnail1.jpg'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Namespace: <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://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch"
payload := strings.NewReader("{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-Namespace", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"total": 2,
"uploads": [
{
"filename": "video1.mp4",
"presigned_url": "https://s3.amazonaws.com/...",
"status": "PENDING",
"upload_id": "upl_abc123"
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Batch Create Uploads
Generate multiple presigned URLs in a single request.
All uploads belong to the same bucket (from path parameter). Maximum 100 uploads per batch.
Shared metadata is merged with individual upload metadata (individual takes precedence).
curl --request POST \
--url https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'X-Namespace: <api-key>' \
--data '
{
"shared_metadata": {
"campaign": "summer_2024"
},
"shared_object_metadata": {
"category": "marketing"
},
"uploads": [
{
"blob_property": "video",
"content_type": "video/mp4",
"filename": "video1.mp4"
},
{
"blob_property": "thumbnail",
"content_type": "image/jpeg",
"filename": "thumbnail1.jpg"
}
]
}
'import requests
url = "https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch"
payload = {
"shared_metadata": { "campaign": "summer_2024" },
"shared_object_metadata": { "category": "marketing" },
"uploads": [
{
"blob_property": "video",
"content_type": "video/mp4",
"filename": "video1.mp4"
},
{
"blob_property": "thumbnail",
"content_type": "image/jpeg",
"filename": "thumbnail1.jpg"
}
]
}
headers = {
"Authorization": "Bearer <token>",
"X-Namespace": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
'X-Namespace': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
shared_metadata: {campaign: 'summer_2024'},
shared_object_metadata: {category: 'marketing'},
uploads: [
{blob_property: 'video', content_type: 'video/mp4', filename: 'video1.mp4'},
{
blob_property: 'thumbnail',
content_type: 'image/jpeg',
filename: 'thumbnail1.jpg'
}
]
})
};
fetch('https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch', 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.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'shared_metadata' => [
'campaign' => 'summer_2024'
],
'shared_object_metadata' => [
'category' => 'marketing'
],
'uploads' => [
[
'blob_property' => 'video',
'content_type' => 'video/mp4',
'filename' => 'video1.mp4'
],
[
'blob_property' => 'thumbnail',
'content_type' => 'image/jpeg',
'filename' => 'thumbnail1.jpg'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"X-Namespace: <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://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch"
payload := strings.NewReader("{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("X-Namespace", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch")
.header("Authorization", "Bearer <token>")
.header("X-Namespace", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mixpeek.com/v1/buckets/{bucket_identifier}/uploads/batch")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["X-Namespace"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"shared_metadata\": {\n \"campaign\": \"summer_2024\"\n },\n \"shared_object_metadata\": {\n \"category\": \"marketing\"\n },\n \"uploads\": [\n {\n \"blob_property\": \"video\",\n \"content_type\": \"video/mp4\",\n \"filename\": \"video1.mp4\"\n },\n {\n \"blob_property\": \"thumbnail\",\n \"content_type\": \"image/jpeg\",\n \"filename\": \"thumbnail1.jpg\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"total": 2,
"uploads": [
{
"filename": "video1.mp4",
"presigned_url": "https://s3.amazonaws.com/...",
"status": "PENDING",
"upload_id": "upl_abc123"
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}{
"error": {
"details": {
"id": "ns_123",
"resource": "namespace"
},
"message": "Namespace not found",
"type": "NotFoundError"
},
"status": 404,
"success": false
}Authorizations
Mixpeek API key, sent as Authorization: Bearer mxp_sk_.... Create one in Studio under Settings → API Keys, or with an admin key via POST /v1/organizations/users/{user_email}/api-keys. A missing header returns 403; an invalid or revoked key returns 401.
Namespace id (ns_...), not the namespace name. This scopes the request rather than authenticating it, and it is required on every operation marked x-mixpeek-namespace-scoped.
Path Parameters
The unique identifier of the bucket
Body
Request to generate multiple presigned URLs in a single request.
List of upload requests (max 100)
1 - 100 elementsShow child attributes
Show child attributes
Metadata to apply to all uploads (merged with individual metadata)
Object metadata to apply to all uploads (merged with individual)
Was this page helpful?

