Skip to main content
cURL
Cost: Free.
seller_country is where the seller is based: their bank account’s country for Etsy Payments. Without it, you get only the fees that are the same everywhere, and requires_seller_country names the fee keys left out. as_of defaults to today (UTC). Etsy’s announced changes are stored with their future dates, so any day, past or future, gets an answer.

Read a fee row

Each row in fees is one fee for one group of sellers or orders:
A fee Etsy doesn’t publish for the country is null with a fee_unknown notice, never 0. Treat it as unknown, not as free.

Estimate what Etsy takes from an order

There is no estimate endpoint. Read the rows for the seller’s country on the order’s date, and let T be the item price plus shipping plus gift wrap, in the listing currency. Then add: Then subtract share_and_save_refund (rate% of T) for an order from the seller’s own Share & Save link. Convert every amount in another currency to one currency at the market rate before adding: the USD caps and listing fees, and the fixed part of the processing fee. Etsy converts its USD fees at the market rate too. Get currency has Alura’s USD rates.
With the example response’s rows for a seller in France: an order of 20 EUR plus 5 EUR shipping, with 5 EUR VAT paid by the buyer, from a listing priced in EUR. T is 25 EUR.
  • transaction: 6.5% of 25 = 1.625 EUR
  • regulatory_operating: 1.14% of 25 = 0.285 EUR
  • payment_processing: 4% of 30 = 1.20, plus 0.30 = 1.50 EUR
  • listing: 0.20 USD, at 0.893 EUR to the dollar = 0.179 EUR
That’s about 3.59 EUR, plus VAT on those fees. vat_on_seller_fees has a null rate (Etsy doesn’t publish it), so the VAT part is unknown.

Notices

sources holds the one Etsy page that states the fee, and a second only for what the first doesn’t say, such as a note, the start date or an earlier rate.
To see when a fee changed and why, use List updates with kind=fees. List countries with expand=fees gives today’s schedule for many countries at once.

Authorizations

Authorization
string
header
required

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

Query Parameters

seller_country
string

Where the seller is based (their bank account's country for Etsy Payments), ISO 3166-1 alpha-2 such as FR, in any letter case. Without it, only the fees that are the same everywhere.

Pattern: ^[A-Za-z]{2}$
Example:

"FR"

as_of
string<date>

The day to answer for, YYYY-MM-DD, past or future (announced changes are dated). Default: today (UTC).

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
Example:

"2026-10-22"

fields
string

Comma-separated dotted paths to return; id, object and as_of always come back.

Response

OK

object
string
required
Allowed value: "etsy_fees"
seller_country
string | null
required

ISO 3166-1 alpha-2, upper case; null when none was given.

as_of
string<date>
required

The day the schedule is for.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
recorded_from
string<date>
required

The earliest day Alura's recorded fee history covers. Before it, rows without a start date are today's values, and a before_recorded_history notice says so.

Pattern: ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$
fees
object[]
required

The fee rows in effect on as_of for seller_country; without it, only the fees that are the same everywhere.

requires_seller_country
string[]
required

The fee keys that depend on the seller country, left out until seller_country is given; empty when it is.

notices
object[]
required

Why a fee is unknown or the schedule may be incomplete; empty when nothing is.