Skip to main content
cURL
Cost: 1 API credit per write.
Uploads to the live listing on Etsy. Needs the listings:write scope and the Listing optimization workspace permission. Send dry_run=true to see what would be sent without sending it.
Images can’t be reverted (not_revertable_reason: "images"). Remove an unwanted one with Remove image.

Always send an Idempotency-Key

An add without Idempotency-Key answers 400 invalid_request. Etsy keeps every copy of an upload, so a retry must reuse the key: it then answers the first write instead of uploading again. See Idempotency.

Images Alura can upload

Alura fetches each URL: https, a public address, a host name of at most 128 characters (letters, digits, ., - and _), no redirects, at most 10 MB.
  • An image larger than Etsy’s 3000px long side is scaled to fit, never cropped.
  • One that can’t be scaled, such as an animated image or one over 100 megapixels, answers 400 invalid_request naming image_cannot_fit.
  • A source host that answers 5xx or 429 gives a retryable 502 upstream_unavailable naming image_source_unavailable.
A listing holds at most 20 images. An add that would pass 20 answers 400 with the count, and nothing is sent.

Where the image goes

Each image goes after the last one unless rank places it. Etsy doesn’t move an image already at that rank, so two images can share it. For an exact order, follow with Reorder images.

The answer

The answer is 202 with the write’s change, outcome: "applying". Poll Get change at Location. When some images land and others don’t, the change is partial. A retry under the same key, once the write has finished, answers 200 with what landed: added maps each request position to the new image ID. Another write to the listing still running answers 409 listing_busy: retry after Retry-After. Credits and limits says when a write is charged.

Authorizations

Authorization
string
header
required

An API key: Authorization: Bearer alura_sk_....

Headers

Idempotency-Key
string

Makes a retry safe: the same key with the same request within 24 hours answers from the first write (with Idempotent-Replayed: true) and never writes to Etsy twice; a write that failed with nothing written (Retry-After set) is tried again under it. The same key with a different request is a 409 conflict; while the first request still runs, 409 idempotency_processing (or the same 202). Required for relative changes such as adjust_price, and to add a listing file, image or video, or to change the alt text of an image (each uploads to Etsy, so a blind retry would upload again); a dry_run=true needs none.

Required string length: 1 - 255

Path Parameters

id
string
required

The Etsy listing ID. A listing outside the workspace is 404.

Pattern: ^[0-9]{1,20}$
Example:

"1834720561"

Query Parameters

dry_run
boolean

true: plan the write and send nothing: what it would change, the Etsy calls it would make, and nothing reserved, charged or recorded. Free; counts toward the per-minute write limit.

Body

application/json
images
object[]
required

The images to add, 1-20. A listing holds at most 20: an add that would pass it is 400, nothing sent.

Required array length: 1 - 20 elements

Response

OK: the write landed on Etsy (or, with dry_run=true, what it would do).

object
string
required
Allowed value: "workspace.listing_images"
listing_id
string
required

Etsy ID, as a string.

shop_id
string
required

Etsy ID, as a string.

added
object[]
required

The images added.

removed
string[]
required

The images removed.

Etsy ID, as a string.

order
string[] | null
required

The listing's images in their new order, after a reorder; null otherwise.

Etsy ID, as a string.

replaced
object[]
required

Images whose alt text changed. Etsy has no image update, so the image is uploaded again with the new alt text and the old one deleted: its ID changes; its position and any variation that showed it are kept. An image whose ID changed while the new alt text was not applied (at Etsy's image limit, the old image deleted to make room and the photo uploaded again without it) is listed too, with an alt_text_not_changed notice.

as_of
string
required

When Etsy answered the write.

change
object
required

The write: its change ID and what landed.

notices
object[]
required

What the answer leaves out and why; empty when nothing is.