Webhooks
Configure Webhooks
Set notify_url in your Assembly Instructions, at the same level as steps. Once the Assembly
reaches a terminal state, Transloadit sends an HTTP POST to that URL.
Any status from 200 up to but not including
300 acknowledges delivery. Redirects and client or server errors are treated as failures. By default,
Transloadit retries failures 5 times with an exponential factor of 1.97.
Acknowledgment confirms receipt, not successful processing. Inspect the verified payload’s
ok state or error code
to distinguish completed, canceled and failed Assemblies. A Notification replay
can also deliver a nonterminal Assembly Status; do not assume every delivery means completion.
Limit the Notification payload
By default, a Webhook includes the complete Assembly Status. Set notification_payload to an array
containing any combination of these supported filters:
without_params: the top-level raw Assembly instruction fieldsparams,template, andmerged_paramsare omitted.without_result_meta_data:metais omitted from each file inresults.without_results: the top-levelresultsobject is omitted.without_upload_meta_data:metais omitted from each file inuploads.without_uploads: the top-leveluploadsarray is omitted.
Notification replays reuse filters supplied in the original Assembly request. Filters defined only
in a Template are not preserved on replay, so a replay can include data omitted from the initial
Notification. Supply notification_payload in the original Assembly request when replays must
use the same filters.
The payload schema below permits these omissions. Upload meta can be absent even when the
upload remains in uploads. Other fields retain their Assembly Status meaning. Accept additive
fields for compatibility, but do not depend on undocumented diagnostic fields.
Verify the signature
Assembly Webhooks use the application/x-www-form-urlencoded media type. The
transloadit field contains the exact serialized Assembly Status JSON, and the
signature field contains its lowercase hexadecimal HMAC.
To verify a Webhook:
- Read the
transloaditandsignatureform fields without modifying the payload string. - Calculate an
HMAC-SHA1hexadecimal digest over the exacttransloaditstring, using the trusted Auth Secret selected as described below. - Compare the calculated digest with
signatureusing a timing-safe comparison. - Parse
transloaditas JSON only after the signatures match.
An Assembly’s initial Notification uses the Auth Secret of the Auth Key that authenticated its
creation, including when it was created by an Assembly replay. Notification replays first look
up the Auth Key recorded in the Assembly Status as api_auth_key_id. If that key is not recorded,
cannot be resolved, has been deleted, or its lookup fails, the Notification replay uses the
authenticated replay caller’s Auth Secret instead.
Assembly replays retain the parent’s historical api_auth_key_id. For example, if Key A creates
an Assembly and Key B replays it, the new Assembly’s initial Notification is signed with B’s
secret. Replaying that Notification can use A’s secret, even when B calls both replay endpoints
and both keys remain active. Keep the applicable parent and replay-creation secrets available
to your verifier; do not assume every delivery for one Assembly uses the same secret.
Select verification secrets from trusted server-side configuration for the expected Workspace and Assembly, not from fields in the unverified payload. When more than one configured secret is applicable, accept the request only if its signature matches one of those trusted secrets. If none matches, reject the request; do not skip verification to accept a replay.
Unlike current API-request signatures, the Webhook signature is an unprefixed
sha1 digest for backwards compatibility. Treat the payload as untrusted and reject the request
when either field is absent, the signature is malformed, or the comparison fails.
Use one of our SDK verification helpers when available. If you implement verification yourself, do not reserialize the parsed JSON before calculating the HMAC: whitespace and object-key order are part of the signed byte sequence.
import { createHmac, timingSafeEqual } from 'node:crypto'
// authSecret must come from trusted server-side configuration.
function verifyTransloaditWebhook({ authSecret, payload, signature }) {
if (typeof payload !== 'string' || typeof signature !== 'string') return false
if (!/^[0-9a-f]+$/.test(signature)) return false
const expected = createHmac('sha1', authSecret).update(payload, 'utf8').digest()
if (signature.length !== expected.length * 2) return false
const received = Buffer.from(signature, 'hex')
return received.length === expected.length && timingSafeEqual(received, expected)
}
Webhook form fields
Complete JSON Schema
Transloadit sends only the fields listed for this object.
| Field | Type and description |
|---|---|
signaturerequired | stringLowercase hexadecimal HMAC-SHA1 of the exact transloadit string, without an algorithm prefix. Use a trusted Auth Secret and a timing-safe comparison. Validation pattern (regular expression)^[0-9a-f]{40}$ |
transloaditrequired | stringExact JSON text of the filtered Assembly Status. Verify the signature over this unmodified string before parsing it as JSON. |
Verified JSON payload
Complete JSON Schema
| Field | Type and description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
account_id | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account_name | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
account_slug | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
api_auth_key_id | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assemblyId | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assembly_id | stringThe unique ID of this Assembly. You can store this in a database when an Assembly is created, and use it to match incoming Notifications. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assembly_ssl_url | null | stringThe unique URL used to query the current status of this Assembly, but ready to be
used over SSL/HTTPS. All API requests that are sent to the | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
assembly_url | null | stringThe unique URL used to query the current status of this Assembly. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
build_id | stringOptional build identifier for support troubleshooting. Treat it as opaque; it may change between Assemblies. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes_expected | numberThe number of bytes that this Assembly expects to be uploaded. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes_received | numberThe number of bytes that have been uploaded to this Assembly so far. This is primarily used by clients to display upload progress. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bytes_usage | number | nullThe total number of bytes that this Assembly processed that count towards your usage
bill. The sum of | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client_agent | null | stringThe uploader’s user agent is not exposed; this deprecated field is always | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client_ip | null | stringThe uploader’s IP address is not exposed; this deprecated field is always | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
client_referer | null | stringThe uploader’s referrer URL is not exposed; this deprecated field is always | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
companion_url | null | stringThe URL to the Companion server that this Assembly may communicate with. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
executing_jobs | Array<string>Array item schemastring | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
execution_duration | number | nullThe time taken by Transloadit to execute this Assembly, in seconds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
execution_start | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
expected_tus_uploads | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fields | objectA key/value map of additional form fields for integrations that cannot use Additional property schemaany value | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
finished_tus_uploads | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
has_dupe_jobs | boolean | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ignored_error_count | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ignored_errors | Array<object>Array item schema
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
info |
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
info. | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
instance | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_infinite | boolean | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
jobs_queue_duration | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
last_job_completed | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
merged_params | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
message | stringA human-readable message explaining the state of this Assembly. This is not always present. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_duration | number | nullElapsed delivery time in seconds, including automatic retry attempts and the delays between them. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_error | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_response_code | number | null | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_response_data | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_start | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_status | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
notify_url | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
num_input_files | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
params | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parent_assembly_status | any value | nullAny of the following schemas may apply: any valueany valuenull | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
parent_id | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
previousStep | stringName of the preceding Step associated with the error, when available. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
queue_duration | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
region | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
results | objectThe result files that Transloadit has produced so far. Each key is the name of the Step that produced a file. Storage Robots do not produce files, so their Step names are omitted. When an Additional property schemaArray<object>Additional schema details are available in the complete JSON Schema. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
running_jobs | Array<string>Array item schemastring | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
start_date | stringThe date and time at which upload started for this Assembly. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
started_jobs | Array<string>Array item schemastring | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
started_tus_uploads | number | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
step | stringName of the Step associated with the error, when available. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template_id | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
template_name | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
transloadit_client | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tus_uploads | Array<object>Array item schema
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
tus_url | stringThe URL to the tus server used by this Assembly for resumable uploads. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
update_stream_url | null | stringThe URL to a server-sent events stream from which you can get realtime status updates of this Assembly. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
upload_duration | numberThe time taken by the uploader to upload files, in seconds. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
upload_meta_data_extracted | boolean | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uploads | Array<object>An array of files uploaded for this Assembly. For more information, see the metadata docs. Array item schema
Any of the following schemas may apply: required properties: basename, ext, field, id, mime, name, size, type, url: object
Variant 2: object
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uppyserver_url | null | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
usage_tags | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virusname | string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
warnings | Array<object>Array item schema
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
websocket_url | null | stringThe URL to a Websocket (uses Socket.IO) server from which you can get realtime status updates of this Assembly. |
Any of the following schemas may apply:
ok: "ASSEMBLY_EXECUTING" | "ASSEMBLY_REPLAYING" | "ASSEMBLY_UPLOADING"
Transloadit may send additional fields.
| Field | Type and description |
|---|---|
error | neverIndicates an error status. This key is only present if the Assembly failed. This value is prohibited. |
okrequired | "ASSEMBLY_EXECUTING" | "ASSEMBLY_REPLAYING" | "ASSEMBLY_UPLOADING"Indicates a non-error lifecycle status, including uploading, executing, aborted, and canceled states. Successful processing is indicated by |
ok: string
Transloadit may send additional fields.
| Field | Type and description |
|---|---|
error | neverIndicates an error status. This key is only present if the Assembly failed. This value is prohibited. |
okrequired | stringIndicates a non-error lifecycle status, including uploading, executing, aborted, and canceled states. Successful processing is indicated by Allowed values (6)
|
required properties: error
Transloadit may send additional fields.
| Field | Type and description |
|---|---|
cmd | string | Array<string | number>Optional processing command details for troubleshooting. Diagnostic details may vary; use the Any of the following schemas may apply: stringArray<string | number>Array<string | number>Array item schemastring | number |
errorrequired | stringIndicates an error status. This key is only present if the Assembly failed. Allowed values (362)
|
exitCode | number | nullOptional exit status of a failed processing command. Diagnostic details may vary; use the |
exitSignal | null | stringOptional signal that terminated a processing command. Diagnostic details may vary; use the |
file | string |
headers | objectAdditional property schemaany value |
is_private_address | boolean |
name | string |
numRetries | number |
ok | null |
playwright_error_code | string |
reason | null | string | number | boolean | Array<any value> | objectOptional diagnostic details. Do not assume this value is a string or display it directly; use Any of the following schemas may apply: nullstringnumberbooleanArray<any value>Array<any value>Array item schemaany valueobjectobjectAdditional property schemaany value |
response_code | number | null |
retries | number |
retryable | boolean |
stderr | stringOptional diagnostic output from a processing command, for troubleshooting. Diagnostic details may vary; use the |
stdout | stringOptional standard output from a processing command, for troubleshooting. Diagnostic details may vary; use the |
url | string |
url_host | null | string |