curl --request POST \
--url https://core.cyberun.cloud/api/v1/r/files/presign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"file_name": "input_image.png",
"file_size": 1048576,
"content_type": "image/png"
}
'import requests
url = "https://core.cyberun.cloud/api/v1/r/files/presign"
payload = {
"file_name": "input_image.png",
"file_size": 1048576,
"content_type": "image/png"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({file_name: 'input_image.png', file_size: 1048576, content_type: 'image/png'})
};
fetch('https://core.cyberun.cloud/api/v1/r/files/presign', 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://core.cyberun.cloud/api/v1/r/files/presign",
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([
'file_name' => 'input_image.png',
'file_size' => 1048576,
'content_type' => 'image/png'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://core.cyberun.cloud/api/v1/r/files/presign"
payload := strings.NewReader("{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://core.cyberun.cloud/api/v1/r/files/presign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.cyberun.cloud/api/v1/r/files/presign")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}"
response = http.request(request)
puts response.read_body{
"file_key": "inputs/019abc12-3456-7890-abcd-ef1234567890/550e8400-e29b/aW1hZ2UvcG5n/input_image.png",
"upload_url": "https://s3.example.com/bucket/key?X-Amz-Signature=...",
"upload_headers": {}
}{
"error_message": "resource not found"
}{
"error_message": "resource not found"
}{
"error_message": "resource not found"
}Request a presigned upload URL
Request a presigned S3 PUT URL to upload a file for use as a workflow input.
Usage flow
- Call this endpoint with the file name and content type.
- Upload the file directly to the returned
upload_urlusing HTTP PUT. - Use the returned
file_keyas the value for atype: fileparameter when running a workflow.
Uploaded input files are stored in S3 and automatically cleaned up after 1 day via S3 lifecycle policy. Output artifacts from task execution are retained for 7 days.
File size limit: Configured on the server (default 500 MB).
Accepts JWT Bearer, sk- integration credential, or dk- device credential.
curl --request POST \
--url https://core.cyberun.cloud/api/v1/r/files/presign \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"file_name": "input_image.png",
"file_size": 1048576,
"content_type": "image/png"
}
'import requests
url = "https://core.cyberun.cloud/api/v1/r/files/presign"
payload = {
"file_name": "input_image.png",
"file_size": 1048576,
"content_type": "image/png"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({file_name: 'input_image.png', file_size: 1048576, content_type: 'image/png'})
};
fetch('https://core.cyberun.cloud/api/v1/r/files/presign', 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://core.cyberun.cloud/api/v1/r/files/presign",
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([
'file_name' => 'input_image.png',
'file_size' => 1048576,
'content_type' => 'image/png'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"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://core.cyberun.cloud/api/v1/r/files/presign"
payload := strings.NewReader("{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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://core.cyberun.cloud/api/v1/r/files/presign")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.cyberun.cloud/api/v1/r/files/presign")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"file_name\": \"input_image.png\",\n \"file_size\": 1048576,\n \"content_type\": \"image/png\"\n}"
response = http.request(request)
puts response.read_body{
"file_key": "inputs/019abc12-3456-7890-abcd-ef1234567890/550e8400-e29b/aW1hZ2UvcG5n/input_image.png",
"upload_url": "https://s3.example.com/bucket/key?X-Amz-Signature=...",
"upload_headers": {}
}{
"error_message": "resource not found"
}{
"error_message": "resource not found"
}{
"error_message": "resource not found"
}Authorizations
User session JWT (Bearer ). Must be paired with the X-Team-ID
request header on team-scoped endpoints so the server knows which
team's resources to operate on.
Headers
UUID of the team to scope the request to. Used by dual-auth endpoints (runtime + scoped management):
- JWT callers MUST send it — a user may belong to multiple teams and the runtime cannot otherwise know which one to operate on. Missing header → 400.
- Credential callers (
sk-,dk-) can omit it because the team is derived from the credential row itself. Any value sent is ignored.
"019abc12-4567-7890-abcd-ef1234567891"
Body
Response
Presigned upload URL generated
Opaque file reference to use as a parameter value when running a workflow.
Pass this string as the value for any type: file parameter.
"inputs/019abc12-3456-7890-abcd-ef1234567890/550e8400-e29b/aW1hZ2UvcG5n/input_image.png"
S3 PUT URL with a signed query string. Upload the file by sending a PUT
request to this URL with the file as the request body. You must
include all headers listed in upload_headers.
Security guarantees (enforced by the signature):
Content-Length— upload must match the declaredfile_sizeexactly.If-None-Match: *— upload fails with 412 if the object already exists (prevents overwrite).
Example upload (curl):
curl -X PUT \
-H "Content-Length: 1048576" \
-H "If-None-Match: *" \
--upload-file photo.png \
"<upload_url>"
Example upload (JavaScript):
await fetch(uploadUrl, { method: 'PUT', headers: uploadHeaders, body: file, });
"https://s3.example.com/bucket/key?X-Amz-Signature=..."
Required HTTP headers for the PUT upload. These headers are signed into the presigned URL — the request will fail with 403 if any header is missing or has a different value.
Show child attributes
Show child attributes
