# Kargo yöntemleri

Kargo yöntemleri satıcı tarafından yapılandırılır. Her birinin sabit bir `amount` değeri ve opsiyonel bir `free_over_amount` eşiği vardır: sepetin brüt ürün toplamı eşiğe ulaştığında, o sepet için kargo ücretsizdir. Bu endpoint her yöntemi, `effective_amount` alanı verilen sepete göre önceden çözümlenmiş olarak döndürür; böylece storefront, ücretsiz kargo kuralını yeniden uygulamak zorunda kalmadan kargo seçim arayüzünü render edebilir.

Kargo yalnızca kargolanabilir satırlar içeren sepetler için geçerlidir: ürünü `requires_shipping: true` olan satırlar. `shipping_method_id` alanının ne zaman zorunlu olduğu için Checkout sayfasına bakın.

## GET /v1/api/commerce/carts/{id}/shipping-methods

Mağazanın aktif kargo yöntemlerini, ada göre sıralı ve bu sepet için geçerli fiyatla birlikte listeler. `commerce:read` gerektirir. Sepet sahipliği uygulanır (Sepetler sayfasına bakın). Liste sayfalanmaz.

### Parametreler

**Path**

| Ad | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `id` | string (UUID) | evet | Sepet id'si. Arama için her durum kabul edilir, ancak fiyat bağlamı yalnızca `active` bir sepet için anlamlıdır. |

**Header'lar**

| Ad | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `X-Customer-Token` | string | hayır | Sepet misafir olmayan bir müşteriye bağlıysa zorunludur. |

### Response alanları

Zarf `{"data": [...]}` şeklindedir. Sepet ve sipariş para değerlerinin aksine buradaki tutarlar, para nesneleri değil, minör birim cinsinden düz tamsayılardır; para birimi, sepetin para birimidir (`EUR`).

| Ad | Tür | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `id` | string (UUID) | her zaman | Kargo yöntemi id'si. Checkout'ta `shipping_method_id` olarak gönderin. |
| `name` | string | her zaman | Görünen ad. |
| `amount` | integer | her zaman | Minör birim cinsinden taban fiyat. |
| `free_over_amount` | integer veya null | her zaman | Kargonun ücretsiz hale geldiği brüt ürün toplamı (minör birim) veya yöntem hiçbir zaman ücretsiz olmuyorsa null. |
| `effective_amount` | integer | her zaman | Bu sepetin şu anda ödeyeceği fiyat: sepetin brüt ürün toplamı `free_over_amount` değerine ulaştığında 0, aksi halde `amount`. |

```bash title="Request"
curl https://api.borkol.com/v1/api/commerce/carts/9d3f2a10-6b7c-4e6d-9f21-8a54c1d2e3f4/shipping-methods \
  -H "Authorization: Bearer {api_key}"
```

```javascript title="Request (JS)"
const res = await fetch(
  `https://api.borkol.com/v1/api/commerce/carts/${cartId}/shipping-methods`,
  { headers: { Authorization: `Bearer ${apiKey}` } }
);
const { data: methods } = await res.json();
```

```json title="Response"
{
  "data": [
    {
      "id": "3c4d5e6f-7a8b-4c9d-0e1f-2a3b4c5d6e7f",
      "name": "Express",
      "amount": 995,
      "free_over_amount": null,
      "effective_amount": 995
    },
    {
      "id": "4d5e6f7a-8b9c-4d0e-1f2a-3b4c5d6e7f8a",
      "name": "Standard",
      "amount": 495,
      "free_over_amount": 5000,
      "effective_amount": 0
    }
  ]
}
```

`effective_amount`, sepetin şu anki haline ilişkin bir anlık görüntüdür: sepet içeriğini değiştirmek onu değiştirebilir; bu nedenle kargo seçim arayüzü görünürken sepet değişikliklerinden sonra yeniden çekin.

### Hatalar

| Durum | Gövde | Ne zaman |
| --- | --- | --- |
| 404 | `{"message": "..."}` | Bilinmeyen sepet id'si veya başka bir mağazanın sepeti. |
| 403 | `{"message": "This cart belongs to a customer."}` | Sahiplik kontrolü başarısız. |
| 403 | scope, modül veya askıya alma gövdesi | Sepetler sayfasına bakın. |
| 429 | `{"message": "Too Many Attempts."}` | Rate limit aşıldı. |
