# Shipping — Eto API

> Shipping profiles, destinations, upgrades and carriers.

Base URL `https://eto.tools/api/v1/`. Every request carries the `X-Eto-API-Key` header. Part of the [Eto API reference](https://eto.tools/dev/docs/).

## Endpoints in this category

- [GET/POST /api/v1/shops/{shop_id}/shipping-profiles](https://eto.tools/dev/docs/shipping/shipping-profiles.md): List or create shipping profiles
- [PUT/DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}](https://eto.tools/dev/docs/shipping/shipping-profile-detail.md): Update or delete shipping profile
- [GET/POST /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/destinations](https://eto.tools/dev/docs/shipping/shipping-destinations.md): List or add shipping destinations
- [PUT/DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/destinations/{destination_id}](https://eto.tools/dev/docs/shipping/shipping-destination-detail.md): Update or delete a shipping destination
- [GET/POST /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades](https://eto.tools/dev/docs/shipping/shipping-upgrades.md): List or add shipping upgrades
- [GET/PUT/DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades/{upgrade_id}](https://eto.tools/dev/docs/shipping/shipping-upgrade-detail.md): Get, update, or delete a shipping upgrade
- [GET /api/v1/shipping-carriers](https://eto.tools/dev/docs/shipping/shipping-carriers.md): Get shipping carriers

## GET · POST /api/v1/shops/{shop_id}/shipping-profiles

List or create shipping profiles

- Operation ID: `shipping_profiles_get`
- Slug: `shipping-profiles`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-profiles
- Markdown: https://eto.tools/dev/docs/shipping/shipping-profiles.md
- Operation IDs by method: `shipping_profiles_get` = GET, `shipping_profiles_post` = POST

GET: List all shipping profiles for your shop. POST: Create a new shipping profile.

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |

### Request — GET

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/shops/12345678/shipping-profiles"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — POST

```bash
curl -X POST "https://eto.tools/api/v1/shops/12345678/shipping-profiles" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.post(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles";

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## PUT · DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}

Update or delete shipping profile

- Operation ID: `shipping_profile_detail_put`
- Slug: `shipping-profile-detail`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-profile-detail
- Markdown: https://eto.tools/dev/docs/shipping/shipping-profile-detail.md
- Operation IDs by method: `shipping_profile_detail_put` = PUT, `shipping_profile_detail_delete` = DELETE

Update or delete a specific shipping profile.

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |
| `profile_id` | path | `integer` | yes | The shipping profile ID |

### Request — PUT

```bash
curl -X PUT -H "X-Eto-API-Key: eto_your_key" -H "Content-Type: application/json" -d '{"title": "Updated"}' "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333"
headers = {"X-Eto-API-Key": "eto_your_key"}
payload = {
    "title": "Updated"
}

response = requests.put(url, headers=headers, json=payload, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333";
const payload = {
  "title": "Updated"
};

const response = await fetch(url, {
  method: "PUT",
  body: JSON.stringify(payload),
  headers: {
    "X-Eto-API-Key": "eto_your_key",
    "Content-Type": "application/json",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — DELETE

```bash
curl -X DELETE "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.delete(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1";

const response = await fetch(url, {
  method: "DELETE",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## GET · POST /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/destinations

List or add shipping destinations

- Operation ID: `shipping_destinations_get`
- Slug: `shipping-destinations`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-destinations
- Markdown: https://eto.tools/dev/docs/shipping/shipping-destinations.md
- Operation IDs by method: `shipping_destinations_get` = GET, `shipping_destinations_post` = POST

Get or add destination countries/regions for a shipping profile. Etsy docs: "Shipping Profile Destinations".

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/destinations`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |
| `profile_id` | path | `integer` | yes | The shipping profile ID |

### Request — GET

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — POST

```bash
curl -X POST "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.post(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations";

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/destinations` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## PUT · DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/destinations/{destination_id}

Update or delete a shipping destination

- Operation ID: `shipping_destination_detail_put`
- Slug: `shipping-destination-detail`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-destination-detail
- Markdown: https://eto.tools/dev/docs/shipping/shipping-destination-detail.md
- Operation IDs by method: `shipping_destination_detail_put` = PUT, `shipping_destination_detail_delete` = DELETE

Manage a specific shipping destination. Etsy docs: "Shipping Profile Destination".

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/destinations/{destination_id}`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |
| `profile_id` | path | `integer` | yes | The shipping profile ID |
| `destination_id` | path | `integer` | yes | The destination ID |

### Request — PUT

```bash
curl -X PUT -H "X-Eto-API-Key: eto_your_key" -H "Content-Type: application/json" -d '{"primary_cost": 500}' "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations/77777"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations/77777"
headers = {"X-Eto-API-Key": "eto_your_key"}
payload = {
    "primary_cost": 500
}

response = requests.put(url, headers=headers, json=payload, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/destinations/77777";
const payload = {
  "primary_cost": 500
};

const response = await fetch(url, {
  method: "PUT",
  body: JSON.stringify(payload),
  headers: {
    "X-Eto-API-Key": "eto_your_key",
    "Content-Type": "application/json",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — DELETE

```bash
curl -X DELETE "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations/1" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations/1"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.delete(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/destinations/1";

const response = await fetch(url, {
  method: "DELETE",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/destinations/{destination_id}` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## GET · POST /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades

List or add shipping upgrades

- Operation ID: `shipping_upgrades_get`
- Slug: `shipping-upgrades`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-upgrades
- Markdown: https://eto.tools/dev/docs/shipping/shipping-upgrades.md
- Operation IDs by method: `shipping_upgrades_get` = GET, `shipping_upgrades_post` = POST

Get or add shipping speed upgrades (e.g. express, priority). Etsy docs: "Shipping Profile Upgrades".

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |
| `profile_id` | path | `integer` | yes | The shipping profile ID |

### Request — GET

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — POST

```bash
curl -X POST "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.post(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades";

const response = await fetch(url, {
  method: "POST",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## GET · PUT · DELETE /api/v1/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades/{upgrade_id}

Get, update, or delete a shipping upgrade

- Operation ID: `shipping_upgrade_detail_get`
- Slug: `shipping-upgrade-detail`
- Category: Shipping
- Authentication: API key plus a connected store. Eto uses that store’s Etsy token, so the shop_id must belong to a store connected to your Eto account or the call answers 403 STORE_NOT_CONNECTED.
- HTML: https://eto.tools/dev/docs/#ep-shipping-upgrade-detail
- Markdown: https://eto.tools/dev/docs/shipping/shipping-upgrade-detail.md
- Operation IDs by method: `shipping_upgrade_detail_get` = GET, `shipping_upgrade_detail_put` = PUT, `shipping_upgrade_detail_delete` = DELETE

Manage a specific shipping speed upgrade. Etsy docs: "Shipping Profile Upgrade".

Proxied to the Etsy API at `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades/{upgrade_id}`. Fields Etsy returns are passed through untouched.

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `shop_id` | path | `integer` | yes | Your Etsy shop ID |
| `profile_id` | path | `integer` | yes | The shipping profile ID |
| `upgrade_id` | path | `integer` | yes | The upgrade ID |

### Request — GET

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades/88888"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades/88888"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/111222333/upgrades/88888";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — PUT

```bash
curl -X PUT "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.put(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1";

const response = await fetch(url, {
  method: "PUT",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Request — DELETE

```bash
curl -X DELETE "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1" \
  -H "X-Eto-API-Key: eto_your_key"
```

```python
import requests

url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.delete(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shops/12345678/shipping-profiles/1/upgrades/1";

const response = await fetch(url, {
  method: "DELETE",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shops/{shop_id}/shipping-profiles/{profile_id}/upgrades/{upgrade_id}` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.

This endpoint can additionally return `STORE_NOT_CONNECTED` (403) when the shop is not linked to your account, and `STORE_TOKEN_EXPIRED` (503) when its Etsy authorisation has lapsed and needs reconnecting.


## GET /api/v1/shipping-carriers

Get shipping carriers

- Operation ID: `shipping_carriers`
- Slug: `shipping-carriers`
- Category: Shipping
- Authentication: API key only. Reads public marketplace data, so no store needs to be connected.
- HTML: https://eto.tools/dev/docs/#ep-shipping-carriers
- Markdown: https://eto.tools/dev/docs/shipping/shipping-carriers.md

List all available shipping carriers (USPS, FedEx, DHL, etc.). Etsy docs: "Shipping Carriers".

Proxied to the Etsy API at `/v3/application/shipping-carriers`. Fields Etsy returns are passed through untouched.

### Parameters

None. Send the request with only the API key header.

### Request

```bash
curl -H "X-Eto-API-Key: eto_your_key" "https://eto.tools/api/v1/shipping-carriers"
```

```python
import requests

url = "https://eto.tools/api/v1/shipping-carriers"
headers = {"X-Eto-API-Key": "eto_your_key"}

response = requests.get(url, headers=headers, timeout=120)
response.raise_for_status()
print(response.json())
```

```javascript
const url = "https://eto.tools/api/v1/shipping-carriers";

const response = await fetch(url, {
  method: "GET",
  headers: {
    "X-Eto-API-Key": "eto_your_key",
  },
});
if (!response.ok) throw new Error(`Eto API ${response.status}`);
const data = await response.json();
```

### Response

`application/json`, passed through from Etsy’s `/v3/application/shipping-carriers` verbatim. The field-by-field data model is in the [v2 preview reference](https://eto.tools/eto-dev-api-v2/), which documents these same routes alongside the whole Etsy schema.

### Errors

Failures answer with the shared error body described in the Errors section: `{"error": {"code", "status", "message", "hint", "docs"}}`. Branch on `code`, not on the message.
