Uploads
Complete Multipart Upload
Assemble the uploaded parts into one object and record the file. This is where the multipart file row is created, so an object-lifecycle header belongs on this call rather than the initiate.
The fileUrl returned here is S3’s native location, which is not publicly readable. Use the fileUrl from Initiate Multipart Upload as the model input.
POST
/
storage
/
upload
/
complete
Complete Multipart Upload
curl --request POST \
--url https://api.modelrunner.run/storage/upload/complete \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"uploadId": "<string>",
"uploadKey": "<string>",
"parts": [
{
"partNumber": 2,
"etag": "<string>"
}
]
}
'import requests
url = "https://api.modelrunner.run/storage/upload/complete"
payload = {
"uploadId": "<string>",
"uploadKey": "<string>",
"parts": [
{
"partNumber": 2,
"etag": "<string>"
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
uploadId: '<string>',
uploadKey: '<string>',
parts: [{partNumber: 2, etag: '<string>'}]
})
};
fetch('https://api.modelrunner.run/storage/upload/complete', 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.modelrunner.run/storage/upload/complete",
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([
'uploadId' => '<string>',
'uploadKey' => '<string>',
'parts' => [
[
'partNumber' => 2,
'etag' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.modelrunner.run/storage/upload/complete"
payload := strings.NewReader("{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.modelrunner.run/storage/upload/complete")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelrunner.run/storage/upload/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"fileUrl": "<string>"
}{
"error": "<string>",
"request_id": "<string>"
}Authorizations
Use the format: Key modelrunner_key
Headers
JSON object setting an expiry for the stored object, e.g. {"expiration_duration_seconds": 3600}. The countdown starts at upload time. See the data retention guide.
Body
application/json
Response
Upload assembled.
S3's native location URL for the assembled object — not the public URL. See the description.
⌘I
Complete Multipart Upload
curl --request POST \
--url https://api.modelrunner.run/storage/upload/complete \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"uploadId": "<string>",
"uploadKey": "<string>",
"parts": [
{
"partNumber": 2,
"etag": "<string>"
}
]
}
'import requests
url = "https://api.modelrunner.run/storage/upload/complete"
payload = {
"uploadId": "<string>",
"uploadKey": "<string>",
"parts": [
{
"partNumber": 2,
"etag": "<string>"
}
]
}
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
uploadId: '<string>',
uploadKey: '<string>',
parts: [{partNumber: 2, etag: '<string>'}]
})
};
fetch('https://api.modelrunner.run/storage/upload/complete', 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.modelrunner.run/storage/upload/complete",
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([
'uploadId' => '<string>',
'uploadKey' => '<string>',
'parts' => [
[
'partNumber' => 2,
'etag' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$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.modelrunner.run/storage/upload/complete"
payload := strings.NewReader("{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<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.modelrunner.run/storage/upload/complete")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.modelrunner.run/storage/upload/complete")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"uploadId\": \"<string>\",\n \"uploadKey\": \"<string>\",\n \"parts\": [\n {\n \"partNumber\": 2,\n \"etag\": \"<string>\"\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"fileUrl": "<string>"
}{
"error": "<string>",
"request_id": "<string>"
}
