# Besleme Endpointi

Push feed ile katalog gönderme
Kaynak: https://selwise.com/docs/api-reference/feeds

Ürün kataloğunu Selwise'e göndermek için push uç noktası. Besleme dosyası üretemiyorsanız ya da değişiklikleri anında yansıtmak istiyorsanız kullanılır. Panelde kurulum ve diğer yöntemler (adres, dosya yükleme) için [Besleme Kurulumu](/docs/product-feeds/setup) sayfasına bakın.

## Uç nokta

```http
POST /api/v1/public/feeds/{token}
```

- **Kimlik:** Adresteki gizli besleme anahtarı
- **Katman:** Kararlı sözleşme

**Parametreler**

| Ad | Konum | Tip | Zorunlu | Açıklama |
| --- | --- | --- | --- | --- |
| `token` | yol | `string` | Evet | Besleme ayarlarındaki gizli gönderim anahtarı. Adresin kendisi yetkidir; paylaşmayın. |

**İstek gövdesi** (`application/json`)


**Yanıt: 201 Başarılı**

| Alan | Tip | Zorunlu | Açıklama |
| --- | --- | --- | --- |
| `productCount` | `number` | Evet | Gönderim sonunda katalogdaki ürün sayısı. |
| `rowsRead` | `number` | Evet | Okunan satır sayısı. |
| `rowsSkipped` | `number` | Evet | Reddedilen satır sayısı; sıfır değilse katalog beslemenizden küçüktür. |
| `productsCreated` | `number` | Evet | Yeni eklenen ürün sayısı. |
| `productsUpdated` | `number` | Evet | İçeriği değiştiği için yeniden yazılan ürün sayısı. |
| `productsUnchanged` | `number` | Evet | Kayıtlı haliyle aynı olduğu için hiç yazılmayan ürün sayısı. |
| `productsRemoved` | `number` | Evet | Bu tam okumada görülmediği için katalogdan çıkarılan ürün sayısı. |
| `skippedSamples` | `FeedSkippedSample[]` | Evet | Reddedilen ilk birkaç satır ve nedeni. |
| `catalogSignals` | `object` | Evet | Senaryolar için gözlenen fiyat düşüşleri ve stoğa dönüşler. Tanılama içindir; şekli değişebilir. |

**Hatalar:** 400 okunamayan besleme, 404 besleme anahtarı bilinmiyor, 409 aynı beslemenin senkronu sürüyor, 413 çok büyük, 429 hız sınırı. Gövde biçimi: [Hatalar ve Limitler](/docs/api-reference/errors-and-limits).

`:token`, panelde **Product Feed** ekranının **API Access** sekmesindeki **API Token**'dır. Bu uç **site anahtarı istemez ve başka bir kimlik de aramaz**: token tek başına bir feed'e yazma yetkisidir. Token bir feed'e aittir; önce bir adres kaydedin ya da bir dosya yükleyin, ondan sonra token oluşur. **Regenerate Token** eskisini iptal eder.

> **Token katalogunuzu yazma yetkisidir**
>
> Sunucu tarafında saklayın; tarayıcıya, mobil uygulama paketine, herkese açık depoya koymayın. Sızarsa **Regenerate Token** ile yenileyin; eski token anında geçersiz olur.

## İstek

Gövde, besleme dosyanızın ham içeriğidir. Biçim **bayttan algılanır**, `Content-Type` ile bildirmeniz gerekmez; yani mevcut beslemenizi olduğu gibi gönderirsiniz.

Her `Content-Type` aynı yoldan okunur ve sınır her biri için **50 MB**'tır: `application/xml`, `text/xml`, `application/rss+xml`, `application/json`, `text/csv`, `text/plain` ya da hiç başlık. XML, JSON, CSV ve TSV gövdeleri ilk baytlarından tanınır.

```bash
curl -X POST "https://api.selwise.com/api/v1/public/feeds/TOKEN" \
  -H "Content-Type: application/xml" \
  --data-binary @katalog.xml
```

CSV için:

```bash
curl -X POST "https://api.selwise.com/api/v1/public/feeds/TOKEN" \
  -H "Content-Type: text/plain" \
  --data-binary @katalog.csv
```

`--data-binary` kullanın; `-d` satır sonlarını siler. Gövde boşsa ya da okunamıyorsa `400` döner ve mesaj aldığı `Content-Type`'ı söyler.

## Yanıt

İşlem **eşzamanlıdır**: istek besleme okunup yazılana kadar bekler ve sonucu döndürür.

Sayaçların anlamı yukarıdaki uç kutusundadır. `rowsSkipped` sıfır değilse katalog beslemenizden küçüktür; nedeni [Çalışma Geçmişi](/docs/product-feeds/runs) sayfası anlatır.

Yanıtta ayrıca fiyat düşüşü ve stok yenilenmesi gibi senaryoların tükettiği bir `catalogSignals` nesnesi bulunur; entegrasyonunuzun okuması gerekmez.

## Hatalar

| Durum | Kod | Anlamı |
| --- | --- | --- |
| `400` | — | Gövde boş ya da okunamıyor (`Empty or unreadable feed body`) |
| `404` | `FEED_TOKEN_INVALID` | Bu token'ı kullanan feed yok; token yenilenmiş olabilir. Adresi panelden yeniden kopyalayın |
| `409` | `FEED_SYNC_IN_PROGRESS` | Bu feed için bir senkronizasyon zaten sürüyor. Bitmesini bekleyip yeniden deneyin |
| `413` | `FEED_BODY_TOO_LARGE` | Gövde 50 MB'ı aşıyor (mesaj boyutu ve sınırı söyler). Daha büyük kataloğu bir adreste sunup panelden **Feed URL** olarak verin |
| `402` | — | Planınızın ürün sınırı aşıldı; hiçbir ürün sınır yüzünden silinmez |
| `429` | — | Dakikada 100 istek aşıldı |

Bir çalışma yarıda kalırsa ya da başarısız olursa **hiçbir ürün silinmez**: katalog bir önceki başarılı çalışmanın hâlinde kalır; feed durumu `error` olur ve mesaj panelde görünür.

## Katalog baştan yazılır

Her gönderim katalogun **tamamını** temsil eder: göndermediğiniz ürünler, okuma sorunsuz tamamlandıysa katalogdan kalkar.

> **Kısmi gönderim kataloğu kısaltır**
>
> Yalnızca değişen ürünleri göndermek, katalogdaki diğer tüm ürünleri siler. Her gönderimde **tam** kataloğu gönderin.

## Alan eşleştirme

Push yönteminde de alan eşleştirmesi geçerlidir. Beslemenizdeki alan adları Selwise'in beklediğinden farklıysa panelden eşleyin: [Alan Eşleştirme](/docs/product-feeds/field-mapping).

## Ne sıklıkla

Push yönteminin avantajı anlık güncellemedir, ama her fiyat değişikliğinde tüm kataloğu göndermek verimsizdir.

| Değişiklik | Yaklaşım |
| --- | --- |
| Fiyat ve stok gün içinde sık değişiyor | Saatlik tam gönderim |
| Katalog nadiren değişiyor | Değişiklik olduğunda gönderim |
| Kampanya başlangıcı | Kampanya anında bir gönderim |

## Doğrulama

Gönderim sonrası **Product Feed** ekranında ürün sayısının ve son senkronizasyon zamanının güncellendiğini kontrol edin; gönderim **Analytics** sekmesinde "API push" etiketiyle bir çalışma olarak görünür. Hata varsa durum `error` olur ve mesaj görünür: [Besleme Sorunları](/docs/product-feeds/troubleshooting).
