{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"59789240-5fd7-4067-8f9f-254fe7bf6598","name":"PublicApi","description":"### February 15, 2024\n\n- **User Service Updated:** branch_description alanı eklendi.!\n    \n\n---\n\nNovember 7, 2024\n\n- **Leave Service Updated:** user_hourly_leave key'i **is_hourly_leave** olarak değiştirildi.\n    \n\n---\n\n### August 23, 2024\n\n- **User Shift Service Added:** Yeni bir User Shift servisi eklendi.\n    \n- **User Patch Response Structure Updated:** User Patch Response yapısı güncellendi.\n    \n- **User Service Response Update:** User servisi response yapısına `user_zone_ids` alanı eklendi.\n    \n\n### August 20, 2024\n\n- **Slacks Service Added:** Yeni bir Slacks servisi eklendi.\n    \n\n### August 19, 2024\n\n- **Night Works Service Added:** Yeni bir Night Works servisi eklendi.\n    \n\n### August 6, 2024\n\n- **User Endpoint Response Update:** User endpoint response yapısına `user_device_ids` alanı eklendi.\n    \n    - `\"user_device_ids\": [\"700dd47c-4f4f-4644-ad61\"]`\n        \n\n---\n\n# Passgage API Kullanımı\n\nPassgage API'yi kullanarak verilere ulaşabilir ve kendi uygulamalarınızla entegre edebilirsiniz. Ayrıca, Passgage Web arayüzündeki işlemleri API aracılığıyla gerçekleştirebilirsiniz.\n\n## Temel Bilgiler\n\n- **BASE_URL:** [https://api.passgage.com](https://api.passgage.com)\n    \n- **API Anahtarı (API_KEY):** API hizmetimize erişmek için bir API anahtarına ihtiyacınız vardır. Anahtarınızı almak için [deneyim@passgage.com](https://mailto:deneyim@passgage.com) adresi üzerinden talep yapabilirsiniz.\n    \n\n---\n\n# Hatalar (Error Reference)\n\nPassgage API, istek başarısını veya başarısızlığını göstermek için HTTP yanıt kodlarını kullanır:\n\n- **2xx** aralığı: Başarılı işlem\n    \n- **4xx** aralığı: İstemci hatası (eksik parametre, validasyon hatası, vb.)\n    \n- **5xx** aralığı: Sunucu hatası (nadir)\n    \n\n---\n\n## Hata Yanıt Formatı\n\nTüm hatalar aşağıdaki JSON formatında döner:\n\n``` json\n{\n  \"success\": false,\n  \"status\": 422,\n  \"message\": \"Unprocessable entity\",\n  \"errors\": [\n    {\n      \"property\": \"field_name\",\n      \"constraints\": [\n        { \"error_type\": \"Hata mesajı\" }\n      ]\n    }\n  ]\n}\n\n ```\n\n**Örnek:**\n\n``` json\n{\n  \"success\": false,\n  \"status\": 422,\n  \"message\": \"Unprocessable entity\",\n  \"errors\": [\n    {\n      \"property\": \"first_name\",\n      \"constraints\": [{ \"blank\": \"doldurulmalı\" }]\n    },\n    {\n      \"property\": \"email\",\n      \"constraints\": [{ \"taken\": \"hali hazırda kullanılmakta\" }]\n    }\n  ]\n}\n\n ```\n\n---\n\n## HTTP Status Kodları\n\n| Kod | Mesaj | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- |\n| 400 | `Bad request: Invalid parameters` | Geçersiz istek. Lütfen girdiğiniz bilgileri kontrol edin. |\n| 401 | `Access denied` | Oturum süreniz dolmuş. Lütfen tekrar giriş yapın. |\n| 403 | `You don't have permission to perform this action` | Bu işlem için yetkiniz bulunmamaktadır. |\n| 404 | `Record not found` | Aradığınız kayıt bulunamadı. |\n| 422 | `Unprocessable entity` | İşlem gerçekleştirilemedi. Lütfen hataları düzeltin. |\n| 422 | `Parameter missing: X` | Zorunlu alan eksik. Lütfen tüm alanları doldurun. |\n| 429 | `Rate limit exceeded` | Çok fazla istek gönderildi. Lütfen biraz bekleyin. |\n| 500 | `Internal server error` | Bir hata oluştu. Lütfen daha sonra tekrar deneyin. |\n\n---\n\n## Standart Validasyon Hataları\n\nBu hatalar tüm endpoint'lerde geçerlidir:\n\n| Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- |\n| `blank` | `doldurulmalı` | Bu alan boş bırakılamaz |\n| `taken` | `hali hazırda kullanılmakta` | Bu değer zaten kullanılıyor |\n| `invalid` | `geçersiz` | Geçersiz format. Lütfen kontrol edin |\n| `inclusion` | `kabul edilen bir kelime değil` | Geçersiz seçim. Lütfen listeden seçin |\n| `not_a_number` | `geçerli bir sayı değil` | Lütfen geçerli bir sayı girin |\n| `not_an_integer` | `tam sayı olmalı` | Lütfen tam sayı girin |\n| `greater_than` | `X sayısından büyük olmalı` | Değer X'den büyük olmalıdır |\n| `less_than` | `X sayısından küçük olmalı` | Değer X'den küçük olmalıdır |\n\n---\n\n## Users (Kullanıcılar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `first_name` | `blank` | `doldurulmalı` | Ad alanı boş bırakılamaz |\n| `last_name` | `blank` | `doldurulmalı` | Soyad alanı boş bırakılamaz |\n| `email` | `taken` | `hali hazırda kullanılmakta` | Bu e-posta adresi zaten kayıtlı |\n| `email` | `invalid` | `geçersiz` | Geçersiz e-posta formatı |\n| `citizenship_number` | `taken` | `hali hazırda kullanılmakta` | Bu TC Kimlik numarası zaten kayıtlı |\n| `client_id` | `taken` | `hali hazırda kullanılmakta` | Bu sicil numarası zaten kullanılıyor |\n| `employee_id` | `taken` | `hali hazırda kullanılmakta` | Bu personel numarası zaten kullanılıyor |\n| `gender` | `inclusion` | `kabul edilen bir kelime değil` | Geçersiz cinsiyet değeri. (male/female) |\n\n---\n\n## Leaves (İzinler)\n\n### Zorunlu Alan Hataları\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `company_id` | `blank` | `doldurulmalı` | Şirket bilgisi eksik |\n| `user_id` | `blank` | `doldurulmalı` | Kullanıcı seçilmedi |\n| `leave_type_id` | `blank` | `doldurulmalı` | İzin tipi seçilmedi |\n| `start_date` | `blank` | `doldurulmalı` | Başlangıç tarihi seçilmedi |\n| `end_date` | `blank` | `doldurulmalı` | Bitiş tarihi seçilmedi |\n\n### Tarih ve Kısıtlama Hataları\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `end_date` | `must_be_after_the_start_date` | `başlangıç tarihinden sonrası olmalıdır` | Bitiş tarihi başlangıç tarihinden sonra olmalıdır |\n| `base` | `must_be_include_segmentation` | `Bu izin türünü kullanma yetkiniz bulunmamaktadır.` | Bu izin türünü kullanma yetkiniz bulunmamaktadır |\n| `base` | `gender_type` | `Cinsiyetle uyumsuz bir izin türü seçtiniz` | Bu izin türü cinsiyetiniz ile uyumlu değil |\n| `base` | `banned_dates` | `Yasaklı tarihler için izin giremezsiniz.` | Seçilen tarihler için izin talebi oluşturulamaz |\n| `leave_type` | `type_of_permit_is_mandatory` | `bu izin tipinde belge zorunludur` | Bu izin türü için belge yüklemeniz gerekmektedir |\n| `days_off_count` | `must_be_standby_time_available` | `bekleme süresi mevcut olmalıdır` | Henüz bu izin türünü kullanmak için yeterli süre çalışmadınız |\n\n### Çakışma Hataları\n\n| API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- |\n| `Mevcut tarihlerde izin talebi bulunmaktadır` | Seçilen tarihlerde zaten bir izin talebiniz bulunmaktadır |\n| `Aynı gün içerisinde farklı izin türünden saatlik izin kullanılamaz` | Aynı gün içinde farklı türde saatlik izin kullanamazsınız |\n\n### Bakiye Hataları\n\n| API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- |\n| `Mevcut bakiye hesaplanamadı.` | İzin bakiyeniz hesaplanamadı. Lütfen İK ile iletişime geçin |\n| `İzin talebiniz mevcut bakiyenizi aşıyor. Mevcut bakiye: X gün Y saat` | Yetersiz izin bakiyesi. Kalan bakiyeniz: X gün Y saat |\n| `Serbest zaman bakiyeniz bulunmamaktadır.` | Serbest zaman bakiyeniz bulunmamaktadır |\n| `İzin talebiniz mevcut serbest zaman bakiyenizi aşıyor. Mevcut bakiye: X saat, Talep edilen: Y saat` | Yetersiz serbest zaman bakiyesi. Kalan: X saat, Talep edilen: Y saat |\n| `Saatlik izin talep edilemez!` | Bu izin türü için saatlik izin talep edilemez |\n\n---\n\n## User Shifts (Kullanıcı Vardiyaları)\n\n### Zorunlu Alan Hataları\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `user_id` | `blank` | `doldurulmalı` | Kullanıcı seçilmedi |\n| `shift_id` | `blank` | `doldurulmalı` | Vardiya seçilmedi |\n| `date_of_shift` | `blank` | `doldurulmalı` | Vardiya tarihi seçilmedi |\n\n### İş Kuralı Hataları\n\n| API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- |\n| `Aynı güne yalnızca bir vardiya ekleyebilirsiniz` | Bu tarihte zaten bir vardiya bulunmaktadır |\n| `İşe giriş tarihinden önce vardiya giriş yapılamaz.` | İşe giriş tarihinden öncesine vardiya atanamaz |\n| `Günlük izin alınan güne vardiya eklenemez.` | İzinli olduğunuz güne vardiya atanamaz |\n| `İzin ve tatil vardiyasının mevcut olduğu bir güne eklenemez.` | Bu tarihte izin veya tatil bulunduğundan vardiya atanamaz |\n| `X günden eski tarihli düzenleme yapılamaz.` | X günden eski tarihlerde değişiklik yapılamaz |\n| `X günden eski tarihli vardiya silinemez.` | X günden eski vardiyalar silinemez |\n| `Bu hafta için atanmış vardiyalar ve izinler, tam zamanlı çalışanlar için belirlenen maksimum X saatlik çalışma süresini aşıyor.` | Haftalık maksimum çalışma süresi aşıldı (Max: X saat) |\n| `Haftada maksimum X tatil vardiyası eklenebilir` | Haftada en fazla X gün tatil kullanılabilir |\n| `Bu hafta için en az X tatil vardiyası olmalı. Kalan tatil vardiyası sayısı: Y` | Bu hafta en az X gün tatil kullanmalısınız |\n\n---\n\n## Shifts (Vardiyalar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Vardiya adı boş bırakılamaz |\n| `name` | `taken` | `Vardiya ismi kullanımda` | Bu vardiya adı zaten kullanılıyor |\n| `check_in_time` | `blank` | `doldurulmalı` | Giriş saati seçilmedi |\n| `check_out_time` | `blank` | `doldurulmalı` | Çıkış saati seçilmedi |\n| `code` | `blank` | `doldurulmalı` | Vardiya kodu boş bırakılamaz |\n| `color_code` | `blank` | `doldurulmalı` | Renk kodu seçilmedi |\n| `shift_type` | `blank` | `doldurulmalı` | Vardiya tipi seçilmedi |\n\n---\n\n## Departments (Departmanlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Departman adı boş bırakılamaz |\n| `name` | `taken` | `hali hazırda kullanılmakta` | Bu departman adı zaten kullanılıyor |\n\n---\n\n## Branches (Lokasyonlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `title` | `blank` | `doldurulmalı` | Lokasyon adı boş bırakılamaz |\n\n---\n\n## Entrances (Giriş/Çıkışlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `entry_time` | `blank` | `doldurulmalı` | Giriş/çıkış zamanı seçilmedi |\n| `entry_type` | `blank` | `doldurulmalı` | Giriş/çıkış tipi seçilmedi |\n| `entry_type` | `inclusion` | `kabul edilen bir kelime değil` | Geçersiz giriş tipi. (in/out) |\n\n**Geçerli entry_type değerleri:** `in` (Giriş), `out` (Çıkış)\n\n---\n\n## Cards (Kartlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `card_no` | `blank` | `doldurulmalı` | Kart numarası boş bırakılamaz |\n| `card_no` | `taken` | `hali hazırda kullanılmakta` | Bu kart numarası zaten kayıtlı |\n\n---\n\n## Leave Balance Imports (İzin Bakiye Aktarımı)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `user` | `blank` | `doldurulmalı` | Kullanıcı seçilmedi |\n| `leave_type` | `blank` | `doldurulmalı` | İzin tipi seçilmedi |\n| `company` | `blank` | `doldurulmalı` | Şirket bilgisi eksik |\n| `balance` | `blank` | `doldurulmalı` | Bakiye değeri girilmedi |\n| `balance` | `not_an_integer` | `tam sayı olmalı` | Bakiye tam sayı olmalıdır |\n| `balanced_at` | `blank` | `doldurulmalı` | Bakiye tarihi seçilmedi |\n| `user_id` | `taken` | `hali hazırda kullanılmakta` | Bu kullanıcı için bu izin tipinde zaten bakiye kaydı var |\n\n---\n\n## Assignment Requests (Rotasyon Talepleri)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `start_date` | `blank` | `doldurulmalı` | Başlangıç tarihi seçilmedi |\n| `end_date` | `blank` | `doldurulmalı` | Bitiş tarihi seçilmedi |\n| `branch_id` | `blank` | `doldurulmalı` | Hedef lokasyon seçilmedi |\n| `job_position_id` | `blank` | `doldurulmalı` | Hedef pozisyon seçilmedi |\n| `end_date` | `must_be_lower_than_thirty_days` | `30 günden az olmalıdır.` | Rotasyon süresi 30 günü geçemez |\n| `selected_user_id` | \\- | `Rotasyon onayında kullanıcı seçilmeli` | Rotasyon onayı için kullanıcı seçmelisiniz |\n\n---\n\n## Titles (Unvanlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Unvan adı boş bırakılamaz |\n| `name` | `taken` | `hali hazırda kullanılmakta` | Bu unvan adı zaten kullanılıyor |\n\n---\n\n## Job Positions (Pozisyonlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Pozisyon adı boş bırakılamaz |\n| `name` | `taken` | `hali hazırda kullanılmakta` | Bu pozisyon adı zaten kullanılıyor |\n\n---\n\n## Sub Companies (Alt Şirketler)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Alt şirket adı boş bırakılamaz |\n| `name` | `taken` | `should be unique per company` | Bu alt şirket adı zaten kullanılıyor |\n\n---\n\n## Organization Units (Organizasyon Birimleri)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Birim adı boş bırakılamaz |\n\n---\n\n## Zones (Bölgeler)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Bölge adı boş bırakılamaz |\n\n---\n\n## Devices (Cihazlar)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `name` | `blank` | `doldurulmalı` | Cihaz adı boş bırakılamaz |\n\n---\n\n## User Extra Works (Fazla Mesailer)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `user_id` | `blank` | `doldurulmalı` | Kullanıcı seçilmedi |\n| `date_of_extra_work` | `blank` | `doldurulmalı` | Mesai tarihi seçilmedi |\n| `extra_work_type_id` | `blank` | `doldurulmalı` | Mesai tipi seçilmedi |\n| `start_time` | `blank` | `doldurulmalı` | Başlangıç saati seçilmedi |\n| `end_time` | `blank` | `doldurulmalı` | Bitiş saati seçilmedi |\n\n---\n\n## Temporary Assignments (Geçici Görevlendirmeler)\n\n| Property | Error Type | API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- | --- | --- |\n| `user_id` | `blank` | `doldurulmalı` | Kullanıcı seçilmedi |\n| `start_date` | `blank` | `doldurulmalı` | Başlangıç tarihi seçilmedi |\n| `end_date` | `blank` | `doldurulmalı` | Bitiş tarihi seçilmedi |\n\n---\n\n## Kilitli Kayıt Hatası\n\nTüm modellerde bordro kilidi aktifse:\n\n| API Mesajı | Kullanıcıya Gösterilecek Mesaj |\n| --- | --- |\n| `Bu kayıt kilitli olduğu için düzenlenemez` | Bu kayıt bordro hesaplaması nedeniyle kilitlenmiştir ve düzenlenemez |\n\n---\n\n## Hata Yakalama Örneği\n\n``` javascript\n// JavaScript/Node.js\nconst response = await fetch('/api/public/v1/users', { ... });\nconst data = await response.json();\nif (!data.success) {\n  data.errors.forEach(error => {\n    error.constraints.forEach(constraint => {\n      const [errorType, message] = Object.entries(constraint)[0];\n      // Kullanıcıya gösterilecek mesajları belirle\n      const userMessages = {\n        'blank': `${getFieldLabel(error.property)} boş bırakılamaz`,\n        'taken': `Bu ${getFieldLabel(error.property)} zaten kullanılıyor`,\n        'invalid': `Geçersiz ${getFieldLabel(error.property)} formatı`,\n      };\n      const userMessage = userMessages[errorType] || message;\n      showErrorToUser(userMessage);\n    });\n  });\n}\nfunction getFieldLabel(property) {\n  const labels = {\n    'first_name': 'Ad',\n    'last_name': 'Soyad',\n    'email': 'E-posta',\n    'client_id': 'Sicil numarası',\n    'citizenship_number': 'TC Kimlik numarası',\n    'employee_id': 'Personel numarası',\n    'card_no': 'Kart numarası',\n    'name': 'Ad',\n    'title': 'Başlık',\n    'start_date': 'Başlangıç tarihi',\n    'end_date': 'Bitiş tarihi',\n    'entry_time': 'Giriş zamanı',\n    'entry_type': 'Giriş tipi',\n    'balance': 'Bakiye',\n    'balanced_at': 'Bakiye tarihi'\n  };\n  return labels[property] || property;\n}\n\n ```\n\n---\n\n## Tarih Formatları\n\n- **Günlük:** `YYYY-MM-DD` (örn: `2024-01-15`)\n    \n- **Saatlik:** `YYYY-MM-DDTHH:MM:SS` (örn: `2024-01-15T09:00:00`)\n    \n\n## UUID Formatı\n\nTüm ID'ler UUID formatındadır: `550e8400-e29b-41d4-a716-446655440000`\n\n## Geçerli Enum Değerleri\n\n| Alan | Geçerli Değerler |\n| --- | --- |\n| `gender` | `male`, `female` |\n| `entry_type` | `in`, `out` |\n| `shift_type` | `0` (still), `1` (flexible) |\n| `status` (Leave) | `approaching`, `awaiting_approval`, `approved`, `rejected`, `document_delivery_awaiting`, `hr_rejection`, `hr_approval`, `cancellation_request_hr_approval`, `leave_canceled`, `on_administrator_approval`, `rejected_by_administrator`, `finished` |\n| `status` (UserShift) | `waiting_for_approval`, `approved`, `rejected`, `locked`, `ghost` |\n\n---\n\n## Destek\n\nDokümanda yer almayan hatalarla karşılaşırsanız:\n\n1. Response'daki tam hata mesajını kaydedin\n    \n2. Request body'yi JSON olarak saklayın\n    \n3. [<b>deneyim@passgage.com</b>](https://mailto:deneyim@passgage.com) adresinden bize ulaşın\n    \n\n## Dökümantasyon\n\nAPI hizmetimizin dökümantasyonunu OpenAPI-Swagger 2.0 standartlarına göre oluşturduk. Dökümantasyonu inceleyerek API'nin nasıl kullanılacağı hakkında detaylı bilgilere ulaşabilirsiniz.\n\n# Sayfalama\n\nPassgage API'de tüm listeleme isteklerinde sayfalama mekanizması **varsayılan olarak uygulanır**. Eğer `per_page` ve `page` parametrelerini belirtmezseniz, API otomatik olarak tanımlı varsayılan değerlerle yanıt verir.\n\nBu nedenle **özellikle çok sayıda kayıt içeren veri isteklerinde**, istediğiniz sayfa ve kayıt sayısını açıkça belirtmeniz önerilir.\n\n> **Not:**  \nVarsayılan `per_page` değeri sistem tarafından sınırlandırılmıştır.  \nKullanıcı kontrolü sağlamak için bu parametreleri manuel olarak belirtmelidir.  \nMaksimum `per_page` değeri: **50** \n  \n\n#### Örnek İstek\n\nAşağıdaki örnek, kullanıcı listesinin ikinci sayfasını çeker ve her sayfada 20 kullanıcı gösterecek şekilde yapılandırılmıştır:\n\n```\ncurl –location –globoff 'https://api.passgage.com/api/public/v1/users?page=2&per_page=20'\n–header 'Authorization: Bearer API_KEY'\n\n ```\n\n---\n\n#### 📦 Yanıt Yapısı ve Sayfalama Bilgisi\n\nSayfalama yapılan isteklerde, yanıtta `meta` bloğu altında sayfa bilgileri aşağıdaki gibi döner\n\n``` json\n\"meta\": {\n\"current_page\": 1,\n\"total_pages\": 384,\n\"total_count\": 3837\n}\n\n ```\n\n- current_page: İlgili isteğin döndüğü sayfa numarasıdır.\n    \n- total_pages: Elinizdeki kriterlere göre ulaşılabilecek toplam sayfa sayısıdır.\n    \n- total_count: Filtrelenmiş veri kümesindeki toplam kayıt sayısını gösterir.\n    \n\n---\n\n# Cursor Pagination ve Async Export\n\nBüyük veri setleri (>10,000 kayıt) için **cursor-based pagination** ve **async export** özelliklerini kullanabilirsiniz.\n\n## 📋 Hızlı Referans\n\n### Endpoint Özeti\n\n| Endpoint | Metod | Kullanım Senaryosu | Limit | Auth |\n| --- | --- | --- | --- | --- |\n| **Cursor Pagination (Stream)** |  |  |  |  |\n| `/user_shifts/stream` | GET | Büyük veri setleri (>10K), sürekli streaming | 500 | API Key / JWT |\n| `/payrolls/stream` | GET | Büyük veri setleri (>10K), sürekli streaming | 500 | API Key / JWT |\n| **Async Bulk Export** |  |  |  |  |\n| `/user_shifts/export` | POST | Toplu export (CSV/JSON) | \\- | API Key |\n| `/user_shifts/export/{job_id}/status` | GET | Export durumu sorgulama | \\- | API Key |\n| `/user_shifts/export/{job_id}/download` | GET | Export dosyası indirme | \\- | API Key |\n| `/user_shifts/exports` | GET | Export geçmişi listeleme | 20 | API Key |\n| `/payrolls/export` | POST | Toplu export (CSV/JSON) | \\- | API Key |\n| `/payrolls/export/{job_id}/status` | GET | Export durumu sorgulama | \\- | API Key |\n| `/payrolls/export/{job_id}/download` | GET | Export dosyası indirme | \\- | API Key |\n| `/payrolls/exports` | GET | Export geçmişi listeleme | 20 | API Key |\n\n### Hangi Yöntemi Kullanmalıyım?\n\n```\n┌─────────────────────────────────────┐\n│ Kaç kayıt çekeceksiniz?             │\n└─────────────┬───────────────────────┘\n              │\n    ┌─────────┴─────────┐\n    │                   │\n  < 10,000            > 10,000\n    │                   │\n    ▼                   ▼\nStandart            ┌─────────────────────┐\nPagination          │ Tüm veriyi sırayla  │\n                    │ mı çekeceksiniz?     │\n                    └──────────┬──────────┘\n                               │\n                    ┌──────────┴──────────┐\n                    │                     │\n                  Evet                   Hayır\n                    │                     │\n                    ▼                     ▼\n            Stream Endpoint        Async Export\n            (/stream)             (/export)\n            • Gerçek zamanlı      • CSV/JSON dosya\n            • Sayfa sayfa         • 24 saat geçerli\n            • 500 kayıt/sayfa     • Polling gerekli\n\n ```\n\n### Temel Kullanım Örnekleri\n\n#### 🔄 Stream ile Veri Çekme\n\n``` bash\n# İlk sayfa\ncurl \"https://api.passgage.com/api/public/v1/user_shifts/stream?limit=500\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\"\n# Sonraki sayfa (response'dan cursor alın)\ncurl \"https://api.passgage.com/api/public/v1/user_shifts/stream?limit=500&after=CURSOR_VALUE\" \\\n  -H \"Authorization: Bearer YOUR_TOKEN\"\n\n ```\n\n#### 📦 Export ile Toplu İndirme\n\n``` bash\n# 1. Export başlat\ncurl -X POST \"https://api.passgage.com/api/public/v1/payrolls/export\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\n  -d '{\"format\":\"csv\",\"date_from\":\"2025-01-01\",\"date_to\":\"2025-01-31\"}'\n# 2. Durumu kontrol et (5-10 saniye aralıklarla)\ncurl \"https://api.passgage.com/api/public/v1/payrolls/export/JOB_ID/status\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\"\n# 3. Dosyayı indir (status=completed olunca)\ncurl \"https://api.passgage.com/api/public/v1/payrolls/export/JOB_ID/download\" \\\n  -H \"Authorization: Bearer YOUR_API_KEY\"\n\n ```\n\n### ⚠️ Önemli Notlar\n\n- **Export Endpoint'leri sadece API Key ile çalışır** - User JWT token ile kullanılamaz\n    \n- **Export dosyaları 24 saat sonra silinir** - İndirmeyi unutmayın\n    \n- **Stream için polling yapmayın** - Cursor ile sayfa sayfa ilerleyin\n    \n- **Büyük export'lar için** - 5-10 saniye aralıklarla status kontrolü yapın\n    \n\n### 📚 Detaylı Dokümantasyon\n\nCursor pagination ve async export özellikleri hakkında detaylı bilgi için:\n\n- **User Shift** ve **Payrolls** folder'larındaki endpoint açıklamalarına bakın\n    \n\n---\n\n# Filtreleme\n\nAPI üzerinden verileri belirli kriterlere göre filtrelemek için `q` parametresini kullanabilirsiniz. Ransack altyapısı ile çalışan bu yapı sayesinde birçok farklı sorgu türü ile gelişmiş arama gerçekleştirebilirsiniz.\n\nAşağıdaki tabloda, desteklenen filtreleme türlerini ve örnek kullanımlarını bulabilirsiniz.\n\n> **İpucu:** Birden fazla filtreyi aynı anda uygulayabilir ve ihtiyaçlarınıza göre karma sorgular oluşturabilirsiniz. \n  \n\n#### Örnek İstek\n\n```\ncurl --location --globoff 'http://localhost:3000/api/public/v1/users?q[client_id_cont]=1-2-3&q[id_eq]=c634175a-3d1d-4302-b5de-f550becb1e8e' \\\n--header 'Authorization: Bearer API_KEY'\n\n ```\n\n| Sorgu Türü | Açıklama | Örnek Kullanım |\n| --- | --- | --- |\n| \\*_eq | Belirli bir değere eşitlik için kullanılır. | name_eq |\n| \\*_not_eq | Belirli bir değere eşit olmama durumu için kullanılır. | name_not_eq |\n| \\*_lt | Bir değerin başka bir değerden küçük olup olmadığını kontrol eder. | age_lt |\n| \\*_lt_any | Birden fazla değerin herhangi birinden küçük olup olmadığını kontrol eder. | age_lt_any |\n| \\*_lt_all | Birden fazla değerin hepsinden küçük olup olmadığını kontrol eder. | age_lt_all |\n| \\*_lteq | Eşit veya küçük olup olmadığını kontrol eder. | age_lteq |\n| \\*_lteq_any | Birden fazla değerin herhangi birine eşit veya küçük olup olmadığını kontrol eder. | age_lteq_any |\n| \\*_lteq_all | Birden fazla değerin hepsine eşit veya küçük olup olmadığını kontrol eder. | age_lteq_all |\n| \\*_gt | Büyük olup olmadığını kontrol eder. | age_gt |\n| \\*_gt_any | Birden fazla değerin herhangi birinden büyük olup olmadığını kontrol eder. | age_gt_any |\n| \\*_gt_all | Birden fazla değerin hepsinden büyük olup olmadığını kontrol eder. | age_gt_all |\n| \\*_gteq | Eşit veya büyük olup olmadığını kontrol eder. | age_gteq |\n| \\*_gteq_any | Birden fazla değerin herhangi birine eşit veya büyük olup olmadığını kontrol eder. | age_gteq_any |\n| \\*_gteq_all | Birden fazla değerin hepsine eşit veya büyük olup olmadığını kontrol eder. | age_gteq_all |\n| \\*_in | Belirli bir dizi içinde olup olmadığını kontrol eder. | age_in |\n| \\*_not_in | Belirli bir dizi içinde olmadığını kontrol eder. | age_not_in |\n| \\*_matches | Regex/pattern ile eşleşip eşleşmediğini kontrol eder. | name_matches |\n| \\*_matches_any | Birden fazla değerden biriyle eşleşip eşleşmediğini kontrol eder. | name_matches_any |\n| \\*_matches_all | Tüm değerlerle eşleşip eşleşmediğini kontrol eder. | name_matches_all |\n| \\*_does_not_match | Belirli bir pattern ile eşleşmediğini kontrol eder. | name_does_not_match |\n| \\*_does_not_match_any | Herhangi biriyle eşleşmeme durumu için kullanılır. | name_does_not_match_any |\n| \\*_does_not_match_all | Tüm değerlerle eşleşmeme durumu için kullanılır. | name_does_not_match_all |\n| \\*_cont | Belirli bir ifadeyi içerip içermediğini kontrol eder (case insensitive). | name_cont |\n| \\*_present | Alanın dolu (null olmayan) olup olmadığını kontrol eder. | name_present |\n| \\*_blank | Alanın boş olup olmadığını kontrol eder. | name_blank=1 veya name_blank=0 |\n| \\*_null | Null olup olmadığını kontrol eder. | name_null |\n| \\*_not_null | Null olmadığını kontrol eder. | name_not_null |\n| \\*_between | Değerin belirli bir aralıkta olup olmadığını kontrol eder. | created_at_between |\n| \\*_is_active_eq | Aktiflik durumunu kontrol eder. | user_is_active_eq=true |\n\n---\n\n# İletişim\n\nPassgage API'yi kullanmak veya görüşlerinizi paylaşmak isterseniz, lütfen [deneyim@passgage.com](https://mailto:deneyim@passgage.com) adresi üzerinden bizimle iletişime geçiniz. Geri bildirimleriniz bizim için önemlidir.\n\nTeşekkür ederiz!","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"25481311","team":4599545,"collectionId":"59789240-5fd7-4067-8f9f-254fe7bf6598","publishedId":"2s93m8xKtP","public":true,"publicUrl":"https://apidocs.passgage.com","privateUrl":"https://go.postman.co/documentation/25481311-59789240-5fd7-4067-8f9f-254fe7bf6598","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":"passgage api"}],"appearance":{"default":"system_default","themes":[{"name":"dark","logo":null,"colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":null,"colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.10.0","publishDate":"2024-03-06T20:25:02.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"passgage api","description":""},"logos":{"logoLight":null,"logoDark":null}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/7ed55369bced7e36d763e91e55841492a3791a55a215bf6533dc7d407b8ba3e7","favicon":"https://passgage.com/favicon.ico"},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://apidocs.passgage.com/view/metadata/2s93m8xKtP"}