Create an asset upload
Creates an asset via one of three paths. (1) Direct bytes: send multipart/form-data with a file part (≤4 MB) plus workspace_id — FLORA stores the bytes and returns a ready asset in one call. (2) Server-side fetch: send JSON with source set to any public HTTPS URL (≤50 MB) — FLORA fetches the bytes with SSRF protection (private/loopback/metadata IPs and redirects to them are blocked) and stores them. (3) Signed upload: send JSON with source=“signed-url” to reserve a presigned upload URL for files larger than 4 MB; upload the bytes, then call the complete endpoint. Allowed types: images (jpeg, png, webp, gif, avif, heic, heif), video (mp4, webm, quicktime), audio (mpeg, wav, ogg), and pdf; images are capped at 150 MP. Pass project_id on any path to also surface the asset on that project’s canvas. Mutating public API requests support an optional Idempotency-Key header for client retries; duplicate keys within two hours return idempotency_duplicate.
Create an asset upload
import FLORA from '@flora-ai/flora';
const client = new FLORA({
apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});
const asset = await client.assets.create({ source: 'signed-url', workspace_id: 'ws_abc123' });
console.log(asset.asset_id);{
"asset_id": "asset_abc123",
"status": "pending_upload",
"uploaded_via": "url",
"url": "https://example.com",
"visibility": "workspace",
"workspace_id": "ws_abc123",
"expires_at": "2019-12-27T18:11:19.117Z",
"upload": {
"content_type": "multipart/form-data",
"file_field": "file",
"form_fields": {
"foo": "string"
},
"method": "POST",
"url": "https://example.com"
},
"upload_url": "https://storage.googleapis.com/flora-user-assets"
}{
"error": {
"code": "input_validation_error",
"message": "prompt: Required",
"fields": [
{
"field": "prompt",
"message": "Required"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits."
}
}{
"error": {
"code": "forbidden",
"message": "Forbidden."
}
}{
"error": {
"code": "not_found",
"message": "Not found."
}
}{
"error": {
"code": "idempotency_duplicate",
"message": "Duplicate idempotency key."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
}
}{
"error": {
"code": "unknown_error",
"message": "An unknown error occurred."
}
}Returns Examples
{
"asset_id": "asset_abc123",
"status": "pending_upload",
"uploaded_via": "url",
"url": "https://example.com",
"visibility": "workspace",
"workspace_id": "ws_abc123",
"expires_at": "2019-12-27T18:11:19.117Z",
"upload": {
"content_type": "multipart/form-data",
"file_field": "file",
"form_fields": {
"foo": "string"
},
"method": "POST",
"url": "https://example.com"
},
"upload_url": "https://storage.googleapis.com/flora-user-assets"
}{
"error": {
"code": "input_validation_error",
"message": "prompt: Required",
"fields": [
{
"field": "prompt",
"message": "Required"
}
]
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key."
}
}{
"error": {
"code": "insufficient_credits",
"message": "Insufficient credits."
}
}{
"error": {
"code": "forbidden",
"message": "Forbidden."
}
}{
"error": {
"code": "not_found",
"message": "Not found."
}
}{
"error": {
"code": "idempotency_duplicate",
"message": "Duplicate idempotency key."
}
}{
"error": {
"code": "rate_limited",
"message": "Rate limit exceeded."
}
}{
"error": {
"code": "unknown_error",
"message": "An unknown error occurred."
}
}