transloadit/uppy · error · Error
Transloadit: Assembly status is missing ${label}.
Error message
Transloadit: Assembly status is missing ${label}. What it means
Thrown by ensureUrl when none of the expected URL fields on the Transloadit Assembly status response contain a non-empty string. This means the assembly object returned by Transloadit's API lacks both assembly_url and assembly_ssl_url. It usually indicates an unexpected or malformed Assembly status payload rather than a client configuration problem.
Source
Thrown at packages/@uppy/transloadit/src/index.ts:218
function ensureAssemblyId(status: AssemblyResponse): string {
if (!status.assembly_id) {
console.warn('Assembly status is missing `assembly_id`.', status)
throw new Error('Transloadit: Assembly status is missing `assembly_id`.')
}
return status.assembly_id
}
function ensureUrl(
label: string,
...candidates: Array<string | undefined>
): string {
for (const value of candidates) {
if (typeof value === 'string' && value.length > 0) {
return value
}
}
throw new Error(`Transloadit: Assembly status is missing ${label}.`)
}
export function getAssemblyUrl(
assembly: Pick<AssemblyResponse, 'assembly_ssl_url' | 'assembly_url'>,
): string {
return ensureUrl(
'`assembly_url`',
assembly.assembly_url,
assembly.assembly_ssl_url,
)
}
export function getAssemblyUrlSsl(
assembly: Pick<AssemblyResponse, 'assembly_ssl_url' | 'assembly_url'>,
): string {
return ensureUrl(
'`assembly_ssl_url`',
assembly.assembly_ssl_url,View on GitHub (pinned to 5d4dedd02a)
Solutions
- Log and inspect the full assembly status object you received to see which fields are present and whether it is actually an error payload
- Check for and surface any preceding error (auth failure, rate limit) from the createAssembly / status fetch that produced this object
- Upgrade @uppy/transloadit and @uppy/companion to the latest versions in case of API response-shape changes
- If mocking assemblies in tests, include non-empty assembly_url and assembly_ssl_url
Example fix
// before
const url = getAssemblyUrl(assembly) // throws if both URL fields empty
// after
if (!assembly.assembly_url && !assembly.assembly_ssl_url) {
throw new Error(`Unexpected assembly status: ${JSON.stringify(assembly)}`)
}
const url = getAssemblyUrl(assembly) Defensive patterns
Strategy: validation
Validate before calling
function hasAssemblyUrl(a: unknown): a is { assembly_url: string } {
return typeof (a as any)?.assembly_url === 'string' && (a as any).assembly_url.length > 0
|| typeof (a as any)?.assembly_ssl_url === 'string' && (a as any).assembly_ssl_url.length > 0
} Type guard
const hasAssemblyUrl = (a: unknown): a is Record<'assembly_url' | 'assembly_ssl_url', string> => ['assembly_url', 'assembly_ssl_url'].some((k) => typeof (a as any)?.[k] === 'string' && (a as any)[k].length > 0)
Prevention
- Log full assembly status responses in development
- Pin @uppy/transloadit to tested versions
- When mocking assemblies in tests, always include URL fields
When it happens
Trigger: Calling getAssemblyUrl/getAssemblyUrlSsl/tusEndpoint with an AssemblyResponse object where both assembly_ssl_url and assembly_url are undefined, empty, or missing — e.g. a truncated or error-shaped response from Transloadit was treated as a valid assembly status.
Common situations: Transloadit API changed its response shape, a proxy/Companion stripped fields, rate-limit or auth error responses being parsed as assembly status, or mocked/stubbed assembly objects in tests missing URL fields.
Related errors
- Transloadit: Assembly status is missing `assembly_id`.
- All files were canceled after assembly was created
- URL server responded with status: ${urlMeta.statusCode}
- Transloadit: The `params` option is required.
- Transloadit: The `params` option is a malformed JSON string.
AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28).
Data as JSON: /api/errors/378c9c20c3429fe1.
Report an issue: GitHub.