Request signed upload URL (recommended)
curl --request POST \ --url https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "content_type": "<string>", "file_name": "<string>", "file_size_bytes": 0, "source_type": "pose"}'import requests
url = "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url"
payload = { "content_type": "<string>", "file_name": "<string>", "file_size_bytes": 0, "source_type": "pose"}headers = { "Authorization": "Bearer <token>", "Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.json())const url = 'https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"content_type":"<string>","file_name":"<string>","file_size_bytes":0,"source_type":"pose"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url"
payload := strings.NewReader("{\n \"content_type\": \"<string>\",\n \"file_name\": \"<string>\",\n \"file_size_bytes\": 0,\n \"source_type\": \"pose\"\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(res) fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [ CURLOPT_URL => "https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url", 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([ 'content_type' => '<string>', 'file_name' => '<string>', 'file_size_bytes' => 0, 'source_type' => 'pose' ]), 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;}OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "{\n \"content_type\": \"<string>\",\n \"file_name\": \"<string>\",\n \"file_size_bytes\": 0,\n \"source_type\": \"pose\"\n}");Request request = new Request.Builder() .url("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url") .post(body) .addHeader("Authorization", "Bearer <token>") .addHeader("Content-Type", "application/json") .build();
Response response = client.newCall(request).execute();require 'uri'require 'net/http'
url = URI("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url")
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 \"content_type\": \"<string>\",\n \"file_name\": \"<string>\",\n \"file_size_bytes\": 0,\n \"source_type\": \"pose\"\n}"
response = http.request(request)puts response.read_bodyvar client = new RestClient("https://api.app.layer.ai/api/v1/workspaces/:workspace_id/files/upload-url");var request = new RestRequest("", Method.Post);request.AddHeader("Authorization", "Bearer <token>");request.AddHeader("Content-Type", "application/json");request.AddParameter("application/json", "{\n \"content_type\": \"<string>\",\n \"file_name\": \"<string>\",\n \"file_size_bytes\": 0,\n \"source_type\": \"pose\"\n}", ParameterType.RequestBody);var response = client.Execute(request);Get a signed URL to upload a file directly to storage, bypassing the server. This is the recommended upload method for large files.
Flow:
- Call this endpoint with content_type and file_size_bytes
- POST to the returned upload_url with header
x-goog-resumable: startto get a session URI - PUT your file content to the session URI (supports chunked/resumable uploads)
- Use the returned file_id as input to generation endpoints
Allowed types: application/x-zip-compressed, application/zip, audio/mpeg, audio/wav, image/jpeg, image/png, image/webp, video/mp4. Max size: 64 MB. Upload URL expires in 15 minutes.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Request Bodyrequired
Section titled “Request Bodyrequired”object
MIME type of the file to upload.
Expected file size in bytes. Used to enforce upload limits.
Responses
Section titled “Responses”Successful Response
object
Unique identifier for the file. Use as input to generation endpoints after upload completes.
Signed upload URL. POST to this URL to initiate a resumable upload, then PUT file chunks to the session URI returned in the Location header. Expires in 15 minutes.
MIME type to use when uploading.
Example
{ "source_type": "pose"}Unauthenticated — missing or invalid Bearer token.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Forbidden — insufficient permissions.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Resource not found.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Invalid input parameters.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Rate limited — too many concurrent requests.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}Internal server error.
object
Example
{ "type": "https://api.layer.ai/errors/ERROR_CODE", "title": "Error Title", "status": 400, "detail": "Human-readable description."}