GPSR Economic Operators Tutorial#

Economic operators are the manufacturer and EU responsible person records that the EU General Product Safety Regulation (GPSR) asks sellers to attach to the products they sell to EU buyers. This guide explains how to manage economic operators through the API, how to attach them to listings, who has to do so, and which validation rules apply. It covers the Shop Economic Operators endpoints together with the gpsr_* fields on the ShopListing endpoints (createDraftListing, updateListing, and every endpoint that returns a ShopListing).

info

What's new

  • Four endpoints to manage the economic operators of a shop: getShopEconomicOperators, getShopEconomicOperator, createShopEconomicOperator, and updateShopEconomicOperator.
  • Six GPSR fields on listings: gpsr_manufacturer_type, gpsr_manufacturer_id, gpsr_responsible_person_type, gpsr_responsible_person_id, gpsr_serial_number, and gpsr_safety_warnings.
  • GPSR requirements will be enforced on February 1, 2027. The endpoints and fields are available to use now, so you have the full notice period to update your integration.

Timeline: available now, required later#

PeriodWhat happens
Now, until enforcementThe endpoints and fields are live. Every GPSR field is optional. Listings that do not include them keep being created, updated, and activated exactly as before.
Always, including nowAny GPSR value you do send is validated against the rules below. A value that breaks a rule is rejected immediately; it does not wait for the enforcement date.
From enforcementFor listings of traders that sell into the EU the manufacturer and the EU responsible person must be set for certain categories. Listings that are missing them will be rejected.

Who is affected, and which listings#

Whether a listing needs GPSR information depends on the shop and on the listing, not on where the shop is located.

  • The shop must be a trader. A trader is a shop that identifies itself in Etsy's Shop Home editor as a professional seller or as an incorporated business. Individual (non-trader) sellers can fill in the GPSR fields but are never required to.
  • The shop must sell into the EEA. Shops can opt out of selling physical items, digital items, or both into the EEA. A shop that has opted out is not affected for that kind of listing. A shop based outside the EU that sells into the EU is affected in the same way as an EU-based shop.
  • The listing must be in a category that requires GPSR information. This is decided by the listing's taxonomy_id. See Categories requiring GPSR information for the full list.

You can send the GPSR fields on any listing, eligible or not. They are stored and returned as you sent them. Only listings of eligible traders are checked for completeness once enforcement starts.

If any of these three conditions does not apply to your shop or listing, you do not need to change anything. If all three apply, read on.

Required changes#

To keep creating and updating listings for eligible traders after the enforcement date, you must make the following changes.

If you create or update listings:#

  • Create the economic operators you'll need for the GPSR compliance with createShopEconomicOperator. Or use existing ones.
  • Send the GPSR fields when you create or update listings.
  • Back-fill existing listings during the notice period, so nothing is blocked on the enforcement date.

How the data fits together#

  • An economic operator is a reusable record that belongs to one shop. It holds a name, an email address, a postal address, a phone number, and an optional trademark name. Create it once and reference it from as many listings as you like.
  • Every listing has two roles: the manufacturer and the EU responsible person. For each role, you choose a type:
    • seller: your own shop fills the role. No economic operator record is needed. For the EU responsible person this is only allowed when the shop's legal address (or, if there is none, the address on file) is in the European Union.
    • economic_operator: a record fills the role. You also send the record's economic_operator_id.
  • The same economic operator can be the manufacturer on some listings and the EU responsible person on others.
  • Two further fields are optional free text: gpsr_serial_number (up to 255 characters) and gpsr_safety_warnings (up to 102,400 characters).

Step by step#

1. Decide who fills each role. For each product, work out who the manufacturer is and who the EU responsible person is. If it is your shop, use seller. If it is a third party (a supplier, a workshop, or an EU-based representative), you need an economic operator for it.

2. Create the economic operators you need with createShopEconomicOperator (POST /v3/application/shops/{shop_id}/economic-operators, scope listings_w). operator_name, email, first_line, city, zip, country_iso, and phone are required. trademark_name, second_line, and phone_country_iso are optional. state is required only if the country_iso is in the Countries requiring a state table below, and optional otherwise. The response contains the economic_operator_id you will use on listings. You can list the operators you already have with getShopEconomicOperators, or fetch one with getShopEconomicOperator.

3. Set the GPSR fields on the listing, either when creating it (createDraftListing) or later (updateListing).

4. Read the listing back. Every endpoint that returns a ShopListing includes the gpsr_* fields that have a value.

5. Keep your operators up to date with updateShopEconomicOperator (PATCH, scope listings_w). Only the fields you send are changed. The change applies to every listing that references the operator.

6. Removing economic operators. There is no DELETE endpoint, because removing an operator that active listings still reference would leave those listings non-compliant. To retire an operator, update the listings that reference it first and then edit or stop using the operator. An economic operator can be deleted from the Shop Manager only if it is not associated to a listing.

For examples of complete requests and responses for each step, see Examples.

Economic operator fields#

FieldCreateUpdateNotes
operator_nameRequiredOptionalCannot be blank. Maximum 50 characters.
emailRequiredOptionalValid email address. Maximum 255 characters.
trademark_nameOptionalOptionalMaximum 255 characters. null on update clears it.
first_lineRequiredOptionalCannot be blank. Maximum 50 characters (95 in a few countries, such as India, Brazil, and Japan).
second_lineOptionalOptionalSame maximum as first_line. null on update clears it.
cityRequiredOptionalCannot be blank. Same maximum as first_line.
stateRequired if the country_iso requires a state, otherwise optionalOptionalSame maximum as first_line. See Countries requiring a state. null on update clears it (not allowed for those countries).
zipRequiredOptionalCannot be blank.
country_isoRequiredOptionalISO 3166-1 alpha-2 code, for example DE. Not case-sensitive on input.
phoneRequiredOptionalCannot be blank. Digits, spaces, and ( ) . - + # only.
phone_country_isoOptionalOptionalCountry the phone number belongs to. When sent, phone is validated as a number of that country. null on update clears it.

The response (ShopEconomicOperator) also contains economic_operator_id, shop_id, create_date, and update_date (Unix timestamps).

Countries requiring a state#

Like origin_postal_code on shipping profiles, state depends on the country. Addresses in the countries below cannot be written without a state, province, prefecture, or equivalent, so state is required when country_iso is one of these codes, and the request is rejected with 400 if it is missing. For any other country state is optional.

  • The value is free text. Send the name or the usual abbreviation, for example CA or California for the United States.
country_isoCountry
ASAmerican Samoa
AUAustralia
BRBrazil
CACanada
COColombia
CRCosta Rica
ESSpain
FMMicronesia (Federated States of)
IDIndonesia
INIndia
ITItaly
JPJapan
KRSouth Korea
MHMarshall Islands
MPNorthern Mariana Islands
MXMexico
PWPalau
RURussia
USUnited States
VIU.S. Virgin Islands

GPSR fields on listings#

These fields are accepted by createDraftListing and updateListing, and returned by every endpoint that returns a ShopListing. All of them are optional until enforcement.

FieldTypeAllowed valuesNotes
gpsr_manufacturer_typestring or nullseller, economic_operatorWho the manufacturer is. Any other value is rejected as invalid input. Required for eligible traders once enforced.
gpsr_manufacturer_idinteger or nullAn economic_operator_id of your shopRequired when the type is economic_operator; must not be sent otherwise.
gpsr_responsible_person_typestring or nullseller, economic_operatorWho the EU responsible person is. Any other value is rejected as invalid input. Required for eligible traders once enforced.
gpsr_responsible_person_idinteger or nullAn economic_operator_id of your shop, located in the EURequired when the type is economic_operator; must not be sent otherwise.
gpsr_serial_numberstring or nullUp to 255 charactersOptional serial, batch, or lot identifier.
gpsr_safety_warningsstring or nullUp to 102,400 charactersOptional safety information shown to buyers.
note

The Manufacturers field in the listing form was deprecated. Use the structured fields Product manufacturer and EU responsible person (gpsr_manufacturer_type, gpsr_manufacturer_id, gpsr_responsible_person_type, and gpsr_responsible_person_id) instead.

How requests are read:

  • To clear a field, send it as null. Because null cannot be expressed in a form-encoded body, send the request as application/json when you need to clear a field.
  • On updateListing (a PATCH), fields you leave out are not changed. A request is judged only on what it sends.
  • A type and its id are checked as a pair. If you send only the id, it is checked against the type already stored on the listing. If you send only the type, the id already stored is checked against it.
  • If you change a type to seller without sending the id, the stored id is cleared for you. If you send both a conflicting type and an id, you get an error instead of a silent correction.
  • Where the economic_operator type is used, the id must belong to the same shop as the listing and must not be deleted.

The who_made and gpsr_manufacturer_type rule#

who_made tells buyers who made an item and takes i_did, collective, or someone_else. (On updateListing, who_made has to be sent together with when_made and is_supply, as it always has been.) Your shop cannot be the manufacturer of something that someone else made, so:

  • When who_made is someone_else, gpsr_manufacturer_type must not be seller. Set it to economic_operator and reference an economic operator that represents the real manufacturer or leave it unset if not required.
  • When who_made is i_did or collective, seller and economic_operator are both allowed.

The rule applies in both directions. If you send who_made: "someone_else" on a listing that already has gpsr_manufacturer_type: "seller", the request is rejected, even though you did not send the manufacturer fields. A request that sends both values is checked the same way. To fix it, either change the manufacturer to an economic operator, or change who_made if it was set incorrectly.

Categories requiring GPSR information#

Once enforcement starts, listings of eligible traders whose taxonomy_id is one of the categories below must have the manufacturer and the EU responsible person set. Listings in any other category are not checked for completeness. You can retrieve the full seller taxonomy tree with getSellerTaxonomyNodes.

note

This list can change over time as categories are added, removed, or reorganized.

Taxonomy IDTaxonomy path
838electronics_and_accessories > cameras_and_equipment
840electronics_and_accessories > cameras_and_equipment > cameras
841electronics_and_accessories > cameras_and_equipment > flashes_and_lighting
850electronics_and_accessories > computers_and_peripherals
851electronics_and_accessories > computers_and_peripherals > computers
886electronics_and_accessories > tv_and_projection
887electronics_and_accessories > tv_and_projection > projectors
888electronics_and_accessories > tv_and_projection > televisions
889electronics_and_accessories > tv_and_projection > video_players
892home_and_living > home_appliances
895home_and_living > home_appliances > fans_and_heaters
896home_and_living > home_appliances > irons_and_steamers
897home_and_living > home_appliances > large_appliances
1086home_and_living > lighting
1088home_and_living > lighting > light_fixtures
1089home_and_living > lighting > lamps_shades_and_bases
1091home_and_living > lighting > light_fixtures > wall_lights > electric_lanterns
1093home_and_living > lighting > light_fixtures > wall_lights > night_lights
1094home_and_living > lighting > light_fixtures > wall_lights > sconces
1117home_and_living > lighting > light_fixtures > garden_and_string_lights
1906electronics_and_accessories > computers_and_peripherals > monitors
1911home_and_living > home_appliances > fans_and_heaters > fans
1912home_and_living > home_appliances > fans_and_heaters > heaters
1913home_and_living > home_appliances > irons_and_steamers > irons
1914home_and_living > home_appliances > irons_and_steamers > steamers
2195home_and_living > lighting > light_fixtures > ceiling_lights > chandeliers
2196home_and_living > lighting > light_fixtures > ceiling_lights > pendant_lights
2813home_and_living > lighting > lamps_shades_and_bases > lamps > desk_lamps
2814home_and_living > lighting > lamps_shades_and_bases > lamps > floor_lamps
2815home_and_living > lighting > lamps_shades_and_bases > lamps > table_lamps
2914home_and_living > lighting > lamps_shades_and_bases > lamps > accent_lamps
6225electronics_and_accessories > cameras_and_equipment > slides_and_accessories > slide_viewers
6226craft_supplies_and_tools > imaging_and_lighting > lighting
6331craft_supplies_and_tools > imaging_and_lighting > lighting > studio_lighting
6333craft_supplies_and_tools > imaging_and_lighting > lighting > flashlights
6334craft_supplies_and_tools > imaging_and_lighting > lighting > lightboxes_and_tables
6336home_and_living > lighting > light_fixtures > garden_and_string_lights > string_lights
9139craft_supplies_and_tools > imaging_and_lighting
10809home_and_living > home_improvement > lighting_parts
10811home_and_living > home_improvement > lighting_parts > lamp_bases_and_parts
10812home_and_living > home_improvement > lighting_parts > light_bulbs
10813home_and_living > home_improvement > lighting_parts > light_sockets
10814home_and_living > home_improvement > lighting_parts > plugs_and_cords
10816home_and_living > home_improvement > lighting_parts > light_switches
12348home_and_living > lighting > light_fixtures > ceiling_lights
12349home_and_living > lighting > light_fixtures > wall_lights
12351home_and_living > lighting > lamps_shades_and_bases > lamps
12352home_and_living > lighting > lamps_shades_and_bases > lamps > lamp_sets
12353home_and_living > lighting > lamps_shades_and_bases > lamps > lava_lamps
12357home_and_living > lighting > lamps_shades_and_bases > lamps > salt_lamps
12358home_and_living > lighting > ceiling_fans
12361home_and_living > lighting > light_fixtures > wall_lights > picture_lights
12362home_and_living > lighting > light_fixtures > wall_lights > vanity_lights
12410home_and_living > lighting > light_fixtures > garden_and_string_lights > garden_lights

Examples#

Create an economic operator:

POST /v3/application/shops/12345678/economic-operators
Content-Type: application/json
{
"operator_name": "Muster GmbH",
"email": "compliance@muster-gmbh.example",
"trademark_name": "Muster",
"first_line": "Musterstrasse 12",
"city": "Berlin",
"zip": "10115",
"country_iso": "DE",
"phone": "+49 30 1234567",
"phone_country_iso": "DE"
}

Response 200 OK:

{
"economic_operator_id": 7841209387,
"shop_id": 12345678,
"operator_name": "Muster GmbH",
"email": "compliance@muster-gmbh.example",
"trademark_name": "Muster",
"first_line": "Musterstrasse 12",
"second_line": null,
"city": "Berlin",
"state": null,
"zip": "10115",
"country_iso": "DE",
"phone": "+49 30 1234567",
"phone_country_iso": "DE",
"create_date": 1790000000,
"update_date": 1790000000
}

Set the manufacturer to that operator, and the shop itself as the EU responsible person, on an existing listing:

PATCH /v3/application/shops/12345678/listings/987654321
Content-Type: application/json
{
"who_made": "someone_else",
"when_made": "made_to_order",
"is_supply": false,
"gpsr_manufacturer_type": "economic_operator",
"gpsr_manufacturer_id": 7841209387,
"gpsr_responsible_person_type": "seller",
"gpsr_serial_number": "LOT-2026-114",
"gpsr_safety_warnings": "Not suitable for children under 3 years. Small parts."
}

The ShopListing in the response contains the stored values:

{
"listing_id": 987654321,
"who_made": "someone_else",
"gpsr_manufacturer_type": "economic_operator",
"gpsr_manufacturer_id": 7841209387,
"gpsr_responsible_person_type": "seller",
"gpsr_serial_number": "LOT-2026-114",
"gpsr_safety_warnings": "Not suitable for children under 3 years. Small parts."
}

Clear the serial number and move the manufacturer back to the seller (use a JSON body so null can be sent):

PATCH /v3/application/shops/12345678/listings/987654321
Content-Type: application/json
{
"who_made": "i_did",
"when_made": "made_to_order",
"is_supply": false,
"gpsr_manufacturer_type": "seller",
"gpsr_serial_number": null
}

Update only the email address of an economic operator:

PATCH /v3/application/shops/12345678/economic-operators/7841209387
Content-Type: application/json
{
"email": "product-safety@muster-gmbh.example"
}