๐Ÿ”ฎ Sanity Create is here. Writing is reinvented. Try now, no developer setup

Uploading an image as an asset from a URL and using createIfNotExists and createOrReplace in the Sanity API.

13 replies
Last updated: Jan 27, 2021
I'm using this command to upload an image from the airtable code block as an asset:
curl \
  -X POST \
  -H 'Content-Type: image/jpeg' \
  --data-binary "<https://dl.airtable.com/.attachments/image.jpg>" \
but I'm getting this error:

{statusCode: 400, error: "Bad Request", message: "Invalid image, could not read metadata", details: "Input buffer contains unsupported image format"}
Can anyone help how to upload an image as an asset from a url string?
Jan 22, 2021, 4:57 PM
Hi Aldrin - this seems like an issue with not having a readable stream for the image. Could it be an issue with access to the Airtable image, e.g. needing a token? Does the issue persist if you try with a publicly available image?
Jan 22, 2021, 6:01 PM
user M
hey dude thanks for replying. the image in the url is publicly available, i just tried in incognito
Jan 25, 2021, 7:18 AM
Thanks Aldrin - looks like the issue is different.
here relies on using a local file as shown by the
portion of the example. When inserting a remote URL instead,
doesn't fetch and upload, so we're essentially sending a URL as image content. To create a readable stream, an extra step is necessary before including it in the POST request. For example:

// Fetch the original image
// Retrieve its body as ReadableStream
.then(response => response.body)
Hope that helps!
Jan 25, 2021, 9:27 AM
user M
, i'll try this one
Jan 25, 2021, 9:33 AM
user M
hi peter, thank you for your suggestion. its working now. cheers!
Jan 25, 2021, 3:38 PM
Awesome, Aldrin! Glad to hear ๐Ÿ™‚
Jan 25, 2021, 3:41 PM
user M
i do have another question. in the mutations api (https://www.sanity.io/docs/http-mutations ), i'm trying to use
, what does the api check if the record exists? the
Jan 25, 2021, 3:50 PM
is it also the same case if i try to use
? i need to pass the sanity id?
Jan 25, 2021, 3:51 PM
That's correct, it checks if any document with the provided
exists. If you use
, a new document will only be created if a document with a given
does not exist yet.
, on the other hand, creates (or sets) the document even if a document with the same
already exists, thereby replacing it.
checks if the
and the
exist. If both are the same, it acts as a
patch to replace the document's entire contents. If the
is the same but the
is different, it deletes the old doc and then creates the new one. The result of both is the same but the procedure behind the scenes is slightly different.
Hope that clarifies things
Jan 25, 2021, 3:58 PM
user M
if i pass
as an id for
, it should be an automatic create, right?
Jan 25, 2021, 4:04 PM
also, on succesful api call, is the
the sanity id of the document?
Jan 25, 2021, 4:48 PM
user M
! any ideas for this? the transactionid mentioned seems to be the
revision id instead of the document id. How can we get the
to postback to Airtable?
Jan 27, 2021, 4:46 AM
If no ID is provided, it should generate a new, unique ID for you - but only if you use
and not
in this case. The latter requires an explicit
As Micaela suggested,
is the
(revision) and not the document
If you need to return the document
to Airtable, you could consider fetching the document after creation, using a query like:
*[_rev == "<transactionId>"][0]_.id
Jan 27, 2021, 9:04 AM

Sanityโ€“ build remarkable experiences at scale

Sanity is a modern headless CMS that treats content as data to power your digital business. Free to get started, and pay-as-you-go on all plans.

Was this answer helpful?