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

  1. Log and inspect the full assembly status object you received to see which fields are present and whether it is actually an error payload
  2. Check for and surface any preceding error (auth failure, rate limit) from the createAssembly / status fetch that produced this object
  3. Upgrade @uppy/transloadit and @uppy/companion to the latest versions in case of API response-shape changes
  4. 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

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


AI-assisted analysis of transloadit/uppy@5d4dedd02a (2026-08-28). Data as JSON: /api/errors/378c9c20c3429fe1. Report an issue: GitHub.