> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flextell.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Dosya yükleme

> Ön imzalı yükleme ile doğrudan yüklemeyi, dosya türlerini ve boyut sınırlarını anlatır.

Flextell'e dosya yüklemenin iki yolu vardır: tek istekle `multipart/form-data` göndermek ya da dosyayı üç adımda doğrudan depolama alanına yüklemek. Bu sayfa iki yolu, kabul edilen dosya türlerini, boyut sınırlarını ve depolama kotasını anlatır. Dosya kaynağının kendisi (listeleme, indirme, silme) için [Dosyalar](/api/kaynaklar/dosyalar) sayfasına bakın.

Tüm yükleme istekleri `files:write` scope'u, `X-Tenant` başlığı ve `Create:File` izni ister. Başlıklar için [Başlıklar, dil ve CORS](/api/istekler/basliklar) sayfasına bakın.

## Yükleme yöntemleri

| | Doğrudan yükleme | Ön imzalı yükleme |
| - | - | - |
| Endpoint | `POST /v1/files` | `POST /v1/uploads/presign`, depolama adresine `PUT`, `POST /v1/uploads/confirm` |
| İstek sayısı | 1 | 3 |
| Üst sınır | 50 MB | 50 MB; `video/*` için 5 GB |
| Ne zaman | 50 MB'a kadar dosyalar | 50 MB'ı aşan videolar |

<Tip>
  50 MB'a kadar olan dosyalar için doğrudan yükleme daha basittir. Yalnızca videolar 50 MB'ı aşabilir ve bunlar ön imzalı yüklemeyle gönderilmelidir; diğer türlerde iki yolda da üst sınır 50 MB'tır.
</Tip>

## Ön imzalı yükleme

Dosya baytları Flextell API'sinden geçmez, size verilen geçici adrese gönderilir. Akış üç adımdır.

<Steps>
  <Step title="Yüklemeyi hazırlayın">
    `POST /v1/uploads/presign` isteğiyle dosyayı bildirin.

    | Alan | Zorunlu | Açıklama |
    | - | - | - |
    | `filename` | Evet | En çok 255 karakter. Uzantısı, depolanan nesnenin uzantısını belirler. |
    | `content_type` | Evet | İzin verilen MIME türlerinden biri (aşağıdaki tabloya bakın). |
    | `size` | Evet | Dosyanın bayt cinsinden boyutu. En az 1; en çok 50 MB, `video/*` için 5 GB. |
    | `type` | Evet | Dosya kategorisi (`image`, `audio`, `video` vb.). Değerler aşağıda. |
    | `description` | Hayır | Açıklama. |
    | `group_id` | Hayır | UUID. Aynı gruba birden çok dosya eklemek için verin; vermezseniz yeni bir `group_id` üretilir. |
    | `fileable_type`, `fileable_id` | Evet | Dosyanın ait olacağı kayıt. Onay adımında aynısını göndermeniz gerekir. |

    Yanıt, yükleme için gereken her şeyi verir:

    ```json theme={null}
    {
      "success": true,
      "data": {
        "upload_url": "https://<depolama-adresi>/...",
        "key": "123/files/...",
        "group_id": "9b1f6c1e-0000-0000-0000-000000000000",
        "headers": { "Content-Type": "application/pdf" },
        "expires_at": "2026-10-12T14:45:00+03:00"
      }
    }
    ```

    `expires_at`, istek zamanından 15 dakika sonrasıdır.
  </Step>

  <Step title="Dosyayı yükleyin">
    Dosya baytlarını `upload_url` adresine `PUT` ile gönderin. Yanıttaki `headers` değerlerini aynen ekleyin; `Content-Type`, hazırlama adımında bildirdiğiniz değerle aynı olmalıdır. İşlemi `expires_at` zamanından önce bitirin.

    <Warning>
      Bu isteğe `Authorization` ve `X-Tenant` başlıklarını eklemeyin. `upload_url` Flextell API'si değildir.
    </Warning>
  </Step>

  <Step title="Yüklemeyi onaylayın">
    `POST /v1/uploads/confirm` isteğiyle dosyayı kayda dönüştürün. Başarılı yanıt `201` ve dosya nesnesidir.

    | Alan | Zorunlu | Açıklama |
    | - | - | - |
    | `key` | Evet | Hazırlama yanıtındaki `key`. |
    | `group_id` | Evet | Hazırlama yanıtındaki `group_id`. |
    | `name` | Evet | Görünen ad; en çok 255 karakter. |
    | `type` | Evet | Dosya kategorisi. |
    | `description` | Hayır | Açıklama. |
    | `fileable_type`, `fileable_id` | Evet | Hazırlama adımındakiyle aynı olmalıdır. |
  </Step>
</Steps>

<CodeGroup>
  ```bash 1. Hazırlama theme={null}
  curl -X POST https://app.flextell.ai/api/v1/uploads/presign \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "filename": "panoramik.pdf",
      "content_type": "application/pdf",
      "size": 2457600,
      "type": "other",
      "fileable_type": "customer",
      "fileable_id": 123
    }'
  ```

  ```bash 2. Yükleme theme={null}
  curl -X PUT "<upload_url>" \
    -H "Content-Type: application/pdf" \
    --data-binary @panoramik.pdf
  ```

  ```bash 3. Onay theme={null}
  curl -X POST https://app.flextell.ai/api/v1/uploads/confirm \
    -H "Authorization: Bearer <access_token>" \
    -H "X-Tenant: <tenant_id>" \
    -H "Content-Type: application/json" \
    -d '{
      "key": "<key>",
      "group_id": "<group_id>",
      "name": "Panoramik röntgen",
      "type": "other",
      "fileable_type": "customer",
      "fileable_id": 123
    }'
  ```
</CodeGroup>

<Warning>
  Onaylamadığınız yükleme silinir. `expires_at` zamanından 2 saat sonra bekleyen yükleme kaydı ve yüklenen nesne temizlenir (temizlik saatte bir çalışır). Bu süre dolmadan yüklemeyi onaylayın.
</Warning>

Onayda dosyanın türü, hazırlama adımında bildirdiğiniz `content_type` olarak kaydedilir.

## Doğrudan yükleme

`POST /v1/files` isteğini `multipart/form-data` olarak gönderin. Başarılı yanıt `201` ve dosya nesnesidir.

| Alan | Zorunlu | Açıklama |
| - | - | - |
| `file` | Evet | Tek dosya; en çok 50 MB (51 200 KB). |
| `type` | Evet | Dosya kategorisi. |
| `fileable_type` | Evet | Dosyanın bağlanacağı kayıt türü. |
| `fileable_id` | Evet | Kayıt kimliği. Kayıt klinikte olmalıdır. |
| `description` | Hayır | En çok 1000 karakter. |

```bash theme={null}
curl -X POST https://app.flextell.ai/api/v1/files \
  -H "Authorization: Bearer <access_token>" \
  -H "X-Tenant: <tenant_id>" \
  -F "file=@panoramik.pdf" \
  -F "type=other" \
  -F "fileable_type=customer" \
  -F "fileable_id=123" \
  -F "description=Örnek açıklama"
```

Görünen ad, istemcinin gönderdiği dosya adıdır; uzantı yoksa eklenir. Bu yolla yüklenen her dosya kendi grubunda tek başına yer alır.

<Note>
  Bu isteğin ve ön imzalı yüklemenin hazırlama adımının doğrulama mesajları her zaman İngilizce gelir, örneğin `The file may not be larger than 50 MB.` ve `The provided file type is not allowed.` Kodunuzda mesaja değil `error_code` alanına bakın.
</Note>

## Dosya türleri ve boyutları

### Kabul edilen MIME türleri

İki yolda da aynı liste geçerlidir. Düz metin, CSV, ZIP ve SVG kabul edilmez.

| Grup | MIME türleri |
| - | - |
| Görsel | `image/jpeg`, `image/png`, `image/webp`, `image/heic`, `image/heif`, `image/gif` |
| Belge | `application/pdf`, `application/msword`, `application/vnd.openxmlformats-officedocument.wordprocessingml.document`, `application/vnd.ms-excel`, `application/vnd.openxmlformats-officedocument.spreadsheetml.sheet` |
| Ses | `audio/mpeg`, `audio/mp4`, `audio/aac`, `audio/ogg`, `audio/wav`, `audio/webm` |
| Video | `video/mp4`, `video/quicktime`, `video/webm`, `video/3gpp`, `video/x-matroska`, `video/mpeg` |

### Boyut sınırları

| Yol | Sınır |
| - | - |
| `POST /v1/files` | 50 MB, her tür için |
| Ön imzalı yükleme | 50 MB; `video/*` için 5 GB |

Onay adımında Flextell yüklenen nesnenin gerçek boyutunu yeniden denetler. Gerçek boyut bildirdiğiniz `size` değerini ya da türün üst sınırını aşarsa onay reddedilir.

### Dosya kategorisi (`type`)

| Değer | Açıklama |
| - | - |
| `image` | Görsel |
| `form_image` | Form görseli |
| `before_after` | Before/After görseli |
| `audio` | Ses |
| `video` | Video |
| `catalog` | Katalog. Klinik başına en çok bir tane olabilir. |
| `certificate` | Sertifika |
| `other` | Diğer |

### Dosyanın bağlanacağı kayıt

`fileable_type` şu değerlerden biri olur: `customer`, `lead`, `user`, `tenant`, `chat_log`, `ai_report`, `treatment`, `treatment_group`. Kayıt çağırdığınız kliniğe ait olmalıdır.

* **Tedavi ve tedavi grubu galerileri** yalnızca görsel kabul eder (`image/*`). Bu galerilere yükleme için `Update:Treatment` ya da `Update:TreatmentGroup` izni de gerekir.
* **Silinmiş (imha edilmiş) hasta** kayıtlarına dosya eklenemez; `409 CUSTOMER_ERASED` döner.
* **Başka bir temsilciye atanmış lead** için `403 LEAD_NOT_ASSIGNED` döner. Ayrıntı için [İzinler ve görünürlük](/api/izinler-ve-gorunurluk) sayfasına bakın.
* Hazırlama adımında verdiğiniz `group_id` başka bir kayda aitse istek `422 VALIDATION_FAILED` ile reddedilir.

## Depolama sınırı

Her klinik için bir depolama kotası vardır: plana dahil depolama artı aktif depolama kredileri. Aşıma izin veren planlarda kotayı aşmak yüklemeyi engellemez; aşım faturalanır. Yüklemeyi engelleyen şey kliniğin **üst sınırıdır**.

* Üst sınır aşılırsa `422 STORAGE_HARD_LIMIT_EXCEEDED` döner. Yanıtın `data` alanı `used_bytes`, `hard_limit_bytes` ve `requested_bytes` değerlerini verir.
* Sınır, hazırlama adımında bildirdiğiniz `size` ile, onay adımında gerçek boyutla denetlenir.
* Kullanım, tekrarları ayıklanarak sayılır. Klinikte aynı içerik birden çok kez yüklenirse bir kez sayılır. Silinen dosyalar kullanıma dahil edilmez.
* Aboneliği sona ermiş ya da ödeme kısıtı olan klinikte yükleme `402 SUBSCRIPTION_REQUIRED` ile reddedilir. Ayrıntı için [Erişim kilitleri](/api/istekler/erisim-kilitleri) sayfasına bakın.

## Hatalar

Hata zarfı için [Hata yanıtları](/api/istekler/hatalar), tüm kodlar için [Hata kodları](/api/istekler/hata-kodlari) sayfasına bakın.

| Kod | HTTP | Ne zaman |
| - | - | - |
| `VALIDATION_FAILED` | 422 | Alan eksik ya da geçersiz; tür izinli değil; boyut sınırı aşıldı; `group_id` başka kayda ait. |
| `STORAGE_HARD_LIMIT_EXCEEDED` | 422 | Yükleme kliniğin depolama üst sınırını aşar. |
| `FILE_CONFIRM_FAILED` | 422 | Onay doğrulanamadı. `message` alanı aşağıdaki nedenlerden birini söyler. |
| `SUBSCRIPTION_REQUIRED` | 402 | Abonelik sona erdi ya da klinik ödeme kısıtında. |
| `CUSTOMER_ERASED` | 409 | Hasta verileri imha edilmiş; kayıt salt okunurdur. |
| `LEAD_NOT_ASSIGNED` | 403 | Lead size atanmamış. |
| `FORBIDDEN` | 403 | Scope ya da izin eksik. |

`FILE_CONFIRM_FAILED` için `error_code` her durumda aynıdır; nedeni `message` alanı söyler. Mesaj dili `Accept-Language` başlığına göre değişir, tabloda Türkçe metinler verilmiştir:

| Mesaj | Anlamı |
| - | - |
| `Sağlanan anahtar bu kliniğe ait değil.` | `key`, çağırdığınız kliniğe ait değil. |
| `Bu anahtarla eşleşen bekleyen yükleme bulunamadı.` | `key` ve `group_id` eşleşmiyor, yükleme süresi dolup temizlenmiş ya da daha önce onaylanmış. |
| `Bu yükleme farklı bir kayıt için hazırlanmış.` | `fileable_type` ya da `fileable_id`, hazırlamadakinden farklı. |
| `Yüklenen nesne depolama alanında bulunamadı.` | `upload_url` adresine `PUT` yapılmamış. |
| `Yüklenen dosya bildirilen boyuttan daha büyük.` | Gerçek boyut, hazırlamadaki `size` değerinden büyük. |
| `Yüklenen dosya izin verilen azami boyutu aşıyor.` | Gerçek boyut 50 MB'ı (video için 5 GB'ı) aşıyor. |
| `Yükleme doğrulaması zaten devam ediyor.` | Aynı `key` için başka bir onay isteği çalışıyor. |


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.