I'm not using S3 to store my files and after uploads complete their status says "InTransit" and no value is returned for the key or container, is this normal and what does "InTransit" mean?

If you are using a storage solution that is not S3 (such as Azure or Google Cloud Storage) The reason the key and container is not included is partially because of the "InTransit" status.

The upload API in v3 works like this when storing the file to Google Cloud Storage for example:

First, the picker takes the file and uploads it to one of Filestack's S3 buckets and returns a Filestack link and marks it as "InTransit". Then the file is transferred to your Google Cloud Storage bucket and the link is marked as "stored" and the path to the file is updated in Filestack's database.

In v2, the same process happens except we do not return the Filestack link until the file has been transferred to your Google Cloud Storage bucket. Effectively, this makes the upload faster if you are using Filestack links since you can start using that link as soon as it gets returned to you.

If your workflow relies on the key value being returned here is one way you can deal with this.

Repeat metadata call until status is Stored

Repeat metadata call until status is Stored
client.pick({ fromSources: 'local_file_system', minFiles: 1, storeTo: { location: 'gcs', }, onFileUploadFinished: function(file) { customOnFileUploadFinished(file); } }).then(function(result) { console.log(JSON.stringify(result.filesUploaded)) }); function customOnFileUploadFinished(file) { client.metadata(file.handle).then(isFileUploadCompleted); function isFileUploadCompleted(result) { if (result.key == "" || result.key == null) { console.log("EMPTY KEY"); delay(3000).then(function() { return customOnFileUploadFinished(file); }); } else { console.log("KEY NOT EMPTY"); console.log(JSON.stringify(result)); } } } function delay(t) { return new Promise(function(resolve) { setTimeout(resolve, t) }); }