Hello,
We are updating our code base to work with Frameio v4. Though having trouble uploading a mov file and making a review link.
Previous:
result = client.assets.upload(
destination_id=destination_id,
filepath=filename
)
I’ve changed it to this but the file just says permanently upload status on Frameio:
result = client.files.create_local_upload(
account_id=account_id,
folder_id=destination_id,
data={
“file_size”: os.path.getsize(filename),
“name”: filename
}
)
Also creating the review link we previously used this:
asset = client.assets.get(asset_id)
rev_link = client.review_links.create(
asset["project_id"],
name=asset["name"],
enable_downloading=True
)
rev_assets = self.client.review_links.update_assets(
link_id=rev_link["id"],
asset_ids=[asset["id"]]
)
Is the client.shares.create the new equivalent?
Many Thanks
Hi @joeleveson !
To answer your first question, the V4 SDK does not currently have an uploader like the V3 SDK did. This is something we’re hoping to include in the future. For now, though, client.files.create_local_upload() will create an empty asset on Frame.io and a 201 response will provide you with upload URLs you can use to design your own uploader. The number of upload URLs you get will depend on the size of the file you’re looking to upload. I can provide some sample code if needed.
To answer your second question, Shares have replaced both Review Links and Presentation Links. That means that, yes, client.shares.create() is the method you’d want to use to create a Share link.
@joeleveson we have a guide on How to Upload on our docs that has example code on creating a multipart upload via python.
Thanks very much @RobertLoughlin and @CharlieAnderson . With your feedback and the upload code link our movies are uploading now. Many thanks.
Having a bit of a problem with the client.shares.create command. I used the example provided here:
And tested with both the upload directory id (which we used before) and the uploaded asset id but its gives an raise UnprocessableEntityError:
frameio.errors.unprocessable_entity_error.UnprocessableEntityError: headers: {‘date’: ‘Mon, 26 Jan 2026 19:49:48 GMT’, ‘content-type’: ‘application/json; charset=utf-8’, ‘content-length’: ‘59’, ‘connection’: ‘keep-alive’, ‘api-version’: ‘4.0’, ‘cache-control’: ‘max-age=0, private, must-revalidate’, ‘server’: ‘Cowboy’, ‘x-ratelimit-limit’: ‘10’, ‘x-ratelimit-remaining’: ‘9’, ‘x-ratelimit-window’: ‘60000’, ‘x-request-id’: ‘WORK_ID’}, status_code: 422, body: {‘errors’: [{‘detail’: ‘expiration: must be in the future’}]}
Is there and invalid or missing value?
Thanks very much for your help.
Joe
hi @joeleveson the error is ‘expiration: must be in the future’ if you are copying the example, be sure to update the "expiration": to be some time in the future as the expiration can’t be in the past when created.
Oh yes. Changed that and all working great now! Many thanks @CharlieAnderson
1 Like