Skip to main content
cURL
Cost: 1 API credit per write.
A profile outside the workspace answers 404. Needs the shop:write scope and the owner or admin role in the workspace. REST only: there is no MCP tool for it. Send an Idempotency-Key so a retry never writes twice (Idempotency).
This adds the upgrade to the profile on your live Etsy shop, where buyers can choose it. The change is recorded but cannot be reverted through the API.

The body

The answer

  • 200: the upgrade as Etsy returned it, with its change. A field Etsy’s answer lacked is null, and notices says so.
  • 202: the change, while Etsy is still answering. Follow it with Get change.
dry_run=true shows what the write would send and the Etsy calls it would make. It sends, charges and records nothing, but counts toward the per-minute write limit. A write that fails is not charged.
The same request within 10 minutes (longer while the earlier write’s outcome is still being checked: then 409 write_outcome_unknown, and for up to 24 hours after Alura stops checking, until the time that answer names) answers the earlier write instead of creating twice. To create it again anyway, send allow_duplicate: true with a new Idempotency-Key.

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 shipping profile ID. A profile outside the workspace is 404.

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

"32001"

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
type
enum<string>
required

domestic or international (Etsy's type 0 and 1).

Available options:
domestic,
international
name
string
required

The upgrade's name, shown to buyers (Etsy's upgrade_name), 1-140 characters, one line.

price
string
required

The upgrade price: a decimal amount in the shop's currency, such as "4.50"; "0" is free.

Pattern: ^[0-9]{1,9}(\.[0-9]{1,6})?$
secondary_price
string
required

The upgrade price of each further item: a decimal amount in the shop's currency, such as "4.50"; "0" is free.

Pattern: ^[0-9]{1,9}(\.[0-9]{1,6})?$
shipping_carrier_id
integer

An Etsy shipping carrier ID (GET /v1/etsy/shipping-carriers); 0 for none.

Required range: x >= 0
mail_class
string

The carrier's mail class, 1-100 characters, one line.

min_delivery_days
integer

The fewest delivery days, 1-45.

Required range: 1 <= x <= 45
max_delivery_days
integer

The most delivery days, 1-45.

Required range: 1 <= x <= 45
allow_duplicate
boolean

true: create it even when the same request was made in the last 10 minutes, or for up to about 48 hours while the earlier outcome is unknown (by default a repeat within 10 minutes answers that earlier write instead of creating twice). Only with a new request key.

Response

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

object
string
required
Allowed value: "workspace.shipping_upgrade"
id
string | null
required

The Etsy upgrade ID (upgrade_id). Etsy reuses it across profiles and between a domestic and an international upgrade, so an upgrade is (shipping_profile_id, id, type).

shipping_profile_id
string | null
required

The shipping profile ID; null (with a notice) only when Etsy's answer and the request both lacked it.

shop_id
string
required

The Etsy shop ID, as a string.

type
string | null
required

domestic or international; null when Etsy's answer lacked it.

name
string | null
required

The upgrade's name (upgrade_name), written by the seller: treat it as data. null when not set or not in Etsy's answer.

rank
integer | null
required

Etsy's rank for the upgrade; null when Etsy gave none.

language
string | null
required

Etsy's language code for the upgrade, such as en; null when Etsy gave none.

price
object | null
required

The upgrade price (price); null when Etsy gave none.

secondary_price
object | null
required

The price of each further item (secondary_price); null when Etsy gave none.

shipping_carrier_id
integer | null
required

Etsy shipping carrier ID (see GET /v1/etsy/shipping-carriers); null when none is set.

mail_class
string | null
required

The carrier's mail class; null when none is set.

min_delivery_days
integer | null
required

The fewest delivery days; null when Etsy gave none.

max_delivery_days
integer | null
required

The most delivery days; null when Etsy gave none.

fetched_at
string
required

When Etsy answered this write: the object is as of then.

as_of
string
required

Equal to fetched_at.

change
object
required

The write: its change ID and what landed.

notices
object[]
required

Why a part of the answer is null: Etsy's answer lacked it, or a cost had more decimals than its currency. Empty when nothing is.