curl -X POST https://platform.streampixel.io/api/v1/projects/upload-file \
-H "Content-Type: application/json" \
-d '{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": true
}'
const axios = require('axios');
const response = await axios.post(
'https://platform.streampixel.io/api/v1/projects/upload-file',
{
apiKey: '[YOUR_API_KEY]',
userId: '[YOUR_USER_ID]',
fileUrl: '[PUBLIC_FILE_URL]',
projectId: '[YOUR_PROJECT_ID]',
autoRelease: false,
}
);
console.log('Upload successful:', response.data);
import requests
response = requests.post(
"https://platform.streampixel.io/api/v1/projects/upload-file",
json={
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": False,
}
)
print("Upload successful:", response.json())
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://platform.streampixel.io/api/v1/projects/upload-file"
data := map[string]interface{}{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": false,
}
body, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", bytes.NewBuffer(body))
if err != nil {
fmt.Println("Request failed:", err)
return
}
defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)
}
import okhttp3.*;
public class UploadFile {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
String jsonBody = "{"
+ "\"apiKey\":\"[YOUR_API_KEY]\","
+ "\"userId\":\"[YOUR_USER_ID]\","
+ "\"fileUrl\":\"[PUBLIC_FILE_URL]\","
+ "\"projectId\":\"[YOUR_PROJECT_ID]\","
+ "\"autoRelease\":false"
+ "}";
RequestBody body = RequestBody.create(mediaType, jsonBody);
Request request = new Request.Builder()
.url("https://platform.streampixel.io/api/v1/projects/upload-file")
.post(body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
{
"success": true,
"uploadId": "665a2b3c4d5e6f7a8b9c0e1f",
"message": "File uploaded successfully"
}
{
"message": "Missing required fields"
}
{
"message": "Unauthorized: Invalid API Key"
}
{
"message": "This build is already registered"
}
{
"message": "Unsupported Media Type"
}
Upload File API
Submit a packaged Unreal Engine build to a Streampixel project by providing a public download URL.
POST
/
api
/
v1
/
projects
/
upload-file
curl -X POST https://platform.streampixel.io/api/v1/projects/upload-file \
-H "Content-Type: application/json" \
-d '{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": true
}'
const axios = require('axios');
const response = await axios.post(
'https://platform.streampixel.io/api/v1/projects/upload-file',
{
apiKey: '[YOUR_API_KEY]',
userId: '[YOUR_USER_ID]',
fileUrl: '[PUBLIC_FILE_URL]',
projectId: '[YOUR_PROJECT_ID]',
autoRelease: false,
}
);
console.log('Upload successful:', response.data);
import requests
response = requests.post(
"https://platform.streampixel.io/api/v1/projects/upload-file",
json={
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": False,
}
)
print("Upload successful:", response.json())
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://platform.streampixel.io/api/v1/projects/upload-file"
data := map[string]interface{}{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": false,
}
body, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", bytes.NewBuffer(body))
if err != nil {
fmt.Println("Request failed:", err)
return
}
defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)
}
import okhttp3.*;
public class UploadFile {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
String jsonBody = "{"
+ "\"apiKey\":\"[YOUR_API_KEY]\","
+ "\"userId\":\"[YOUR_USER_ID]\","
+ "\"fileUrl\":\"[PUBLIC_FILE_URL]\","
+ "\"projectId\":\"[YOUR_PROJECT_ID]\","
+ "\"autoRelease\":false"
+ "}";
RequestBody body = RequestBody.create(mediaType, jsonBody);
Request request = new Request.Builder()
.url("https://platform.streampixel.io/api/v1/projects/upload-file")
.post(body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
{
"success": true,
"uploadId": "665a2b3c4d5e6f7a8b9c0e1f",
"message": "File uploaded successfully"
}
{
"message": "Missing required fields"
}
{
"message": "Unauthorized: Invalid API Key"
}
{
"message": "This build is already registered"
}
{
"message": "Unsupported Media Type"
}
Upload a packaged Unreal Engine build (
Supported hosting:
.zip) to your Streampixel project by providing a publicly accessible download URL. This is the endpoint used by CI/CD pipelines, automation tools, and the official Unreal plugin.
Typical workflow
1
Build
Compile your Unreal Engine project.
2
Package
Package the build into a
.zip file.3
Upload to your storage
Upload the
.zip to your own cloud storage (S3, GCS, etc.) and obtain a public download link.4
Call this API
Submit the public link to Streampixel via this endpoint.
Prerequisites
| Requirement | Where to get it |
|---|---|
| API Key | API authentication |
| User ID | Finding your IDs |
| Project ID | Finding your IDs |
| File URL | Your cloud storage (see requirements below) |
File URL requirements
The
fileUrl must be a direct download link. The moment Streampixel accesses it, the .zip download must begin — no login pages, redirects, HTML wrappers, or download buttons.- AWS S3 (signed or public URL)
- Google Cloud Storage
- DigitalOcean Spaces
- Any HTTP-accessible file server
| URL | |
|---|---|
| ✅ Valid | https://your-bucket.s3.amazonaws.com/MyBuild.zip |
| ❌ Invalid | https://drive.google.com/file/d/abc123/view |
Request body
string
required
Your Streampixel API key. See API authentication.
string
required
The ID of the account that owns the project.
string
required
The project to upload the build to.
string
required
Public direct-download URL of the
.zip build file.boolean
default:"true"
When
true, the build is automatically distributed to streaming servers after approval. Set to false if you want to call the Distribute File API manually instead.Response
boolean
true when the build was accepted and registered.string
Unique identifier of the uploaded build (the build’s
_id). Pass it to the Distribute File API or use it to correlate webhook events.string
Human-readable status —
"File uploaded successfully" on success.curl -X POST https://platform.streampixel.io/api/v1/projects/upload-file \
-H "Content-Type: application/json" \
-d '{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": true
}'
const axios = require('axios');
const response = await axios.post(
'https://platform.streampixel.io/api/v1/projects/upload-file',
{
apiKey: '[YOUR_API_KEY]',
userId: '[YOUR_USER_ID]',
fileUrl: '[PUBLIC_FILE_URL]',
projectId: '[YOUR_PROJECT_ID]',
autoRelease: false,
}
);
console.log('Upload successful:', response.data);
import requests
response = requests.post(
"https://platform.streampixel.io/api/v1/projects/upload-file",
json={
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": False,
}
)
print("Upload successful:", response.json())
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
url := "https://platform.streampixel.io/api/v1/projects/upload-file"
data := map[string]interface{}{
"apiKey": "[YOUR_API_KEY]",
"userId": "[YOUR_USER_ID]",
"fileUrl": "[PUBLIC_FILE_URL]",
"projectId": "[YOUR_PROJECT_ID]",
"autoRelease": false,
}
body, _ := json.Marshal(data)
resp, err := http.Post(url, "application/json", bytes.NewBuffer(body))
if err != nil {
fmt.Println("Request failed:", err)
return
}
defer resp.Body.Close()
fmt.Println("Response status:", resp.Status)
}
import okhttp3.*;
public class UploadFile {
public static void main(String[] args) throws Exception {
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");
String jsonBody = "{"
+ "\"apiKey\":\"[YOUR_API_KEY]\","
+ "\"userId\":\"[YOUR_USER_ID]\","
+ "\"fileUrl\":\"[PUBLIC_FILE_URL]\","
+ "\"projectId\":\"[YOUR_PROJECT_ID]\","
+ "\"autoRelease\":false"
+ "}";
RequestBody body = RequestBody.create(mediaType, jsonBody);
Request request = new Request.Builder()
.url("https://platform.streampixel.io/api/v1/projects/upload-file")
.post(body)
.addHeader("Content-Type", "application/json")
.build();
Response response = client.newCall(request).execute();
System.out.println(response.body().string());
}
}
{
"success": true,
"uploadId": "665a2b3c4d5e6f7a8b9c0e1f",
"message": "File uploaded successfully"
}
{
"message": "Missing required fields"
}
{
"message": "Unauthorized: Invalid API Key"
}
{
"message": "This build is already registered"
}
{
"message": "Unsupported Media Type"
}
Error reference
| Status | Message | Cause |
|---|---|---|
400 | Missing required fields | fileUrl, projectId, or apiKey was omitted from the body. |
400 | ❌ Invalid content type | fileUrl isn’t a direct https://…/name.zip link (or carries a query string). |
400 | File too large | The file exceeds your project’s upload limit. |
400 | That host looks like a Streampixel build host but is not one we serve | The URL points at a Streampixel-style host we don’t serve. Use your own storage. |
401 | Invalid User | userId doesn’t match any account. |
401 | Unauthorized: Invalid API Key | apiKey is wrong or has been invalidated. |
403 | Access denied | The authenticated account doesn’t own the project (or it’s disabled by an admin). |
404 | Project not found | No project with the supplied projectId. |
404 | No object exists at that location — the upload may not have completed | The fileUrl returned nothing; finish the upload to your storage first. |
409 | This build is already registered | The same fileUrl was already submitted — retries are de-duplicated. |
415 | Unsupported Media Type | The file at fileUrl is zero-length. |
500 | Internal Server Error | Unexpected failure. Retry after a short delay. |
The
409 Conflict guard means a retried upload of the same fileUrl won’t create a duplicate build — it’s safe to retry a call that timed out.What happens after upload
1
Build Manager downloads the file
Streampixel pulls the
.zip from your fileUrl.2
Validation
The system verifies the archive is accessible and properly structured.
3
Linked to project
On success, the build is attached to your project and becomes ready to distribute.
Track each stage of the pipeline via webhooks — listen for
build.downloading, build.extracting, build.saving, and build.approved events.Confirming success
- Sign in to the dashboard.
- Open your project’s detail page.
- The new build appears in the build list with its current processing status.
Next steps
Distribute the build
Push an approved build to streaming servers (only needed when
autoRelease: false).Listen for webhooks
Get notified when builds are approved, rejected, or distributed.