Entegrasyon API'si

Çalışan listesini, günlük puantajı, aylık ücret özetini, ham okutmaları ve izinleri bordro, ERP veya İK sisteminize Excel'siz aktarın. Rakamlar Burdaa panelindeki raporla ve ücret hesabıyla birebir aynı hesaptan gelir.

Hızlı başlangıç

API'yi şirketin bilgi işlem ekibi ya da entegrasyonu kuran danışman kullanır. Burdaa tarafında kurulum gerekmez:

  1. Burdaa panelinde Şirket Ayarları → Entegrasyonlar → API anahtarları bölümünden anahtar oluşturun. Anahtar yalnızca bir kez gösterilir.
  2. Her isteğe anahtarı başlık olarak ekleyin.
  3. Cevaplar JSON; kayıtlar data alanında, sayfa sayfa gelir (bkz. sayfalama).
curl
curl "https://app.burdaa.co/api/v1/timesheet?from=2026-09-01&to=2026-09-30" \
  -H "Authorization: Bearer brd_..."

Kimlik doğrulama

Her istekte Authorization: Bearer <anahtar> başlığı gönderilir. Anahtarlar brd_ ile başlar ve şirkete özeldir: yalnızca o şirketin verisini döndürür.

  • Burdaa anahtarın kendisini saklamaz, yalnızca özetini (SHA-256) tutar.
  • Ücret verisi ayrı izindir: anahtar oluşturulurken "Ücret özetini de okuyabilsin" işaretlenmezse /pay-summary 403 döner.
  • Anahtar panelden iptal edildiği anda çalışmaz; son kullanım zamanı panelde görünür.

Hız sınırı

Anahtar başına dakikada 60 istek. Aşılırsa 429 ve Retry-After: 60 döner; bekleyip tekrar deneyin. Günlük ya da aylık toplu çekim için bu sınır fazlasıyla yeterlidir.

Sayfalama

Tüm liste uçları aynı biçimde döner. Sayfa başına varsayılan 1000 kayıt gelir; limit ile 5000'e kadar artırabilirsiniz. has_more true ise aynı isteği offset=next_offset ile tekrarlayın. Sıralama sabittir, sayfalar arasında kayıt kaymaz.

200 OK
{
  "data": [ … ],
  "has_more": true,
  "next_offset": 1000
}
Tüm sayfaları almak (Python)
import requests

def fetch_all(path, **params):
    rows, offset = [], 0
    while True:
        r = requests.get(f"https://app.burdaa.co/api/v1{path}", params={**params, "offset": offset},
                         headers={"Authorization": "Bearer brd_..."})
        r.raise_for_status()
        page = r.json()
        rows += page["data"]
        if not page["has_more"]:
            return rows
        offset = page["next_offset"]

timesheet = fetch_all("/timesheet", **{"from": "2026-09-01", "to": "2026-09-30"})

Çalışanlar

GET/employees

Şirketin tüm çalışanları. İşten ayrılanlar da gelir; is_active ile ayırın. Kendi sisteminizdeki kayıtla employee_code (sicil no) üzerinden eşleştirin.

AlanTürAçıklama
employee_iduuidBurdaa çalışan kimliği
full_namestringAd soyad
employee_codestring | nullSicil no
departmentstring | nullDepartman
location_namestring | nullBağlı olduğu lokasyon / mağaza
store_codestring | nullMağaza kodu
pay_typestringsalaried (aylık) | hourly (saatlik)
hire_datedate | nullİşe giriş tarihi
is_activebooleanÇalışıyor mu
deactivated_atdatetime | nullİşten ayrılış zamanı

Günlük puantaj

GET/timesheet?from=YYYY-MM-DD&to=YYYY-MM-DD

Kişi × gün puantajı: giriş-çıkış, çalışılan süre, geç kalma, mesai. Süreler dakika cinsinden.

  • Yalnızca kapanmış günler: to bugünden önce olmalı. Gün içindeki anlık durum için webhook kullanın.
  • İstek başına en fazla 63 gün.
AlanTürAçıklama
employee_iduuid
employee_codestring | nullSicil no
full_namestring
work_datedateÇalışma günü (şirketin saat diliminde)
day_typestringAşağıdaki gün tiplerinden biri
location_name / store_codestring | nullOkutulan lokasyon
shift_start / shift_endtime | nullPlanlanan vardiya (yerel saat)
check_in / check_outdatetime | nullİlk giriş, son çıkış (UTC)
worked_minutesintegerÇalışılan süre
late_minutesintegerGeç kalma
early_leave_minutesintegerErken çıkış
overtime_minutesintegerFazla mesai
shortfall_minutesintegerVardiyaya göre eksik çalışma
day_typeAnlamı
workedÇalıştı
absentVardiyası vardı, gelmedi
missing_punchGiriş ya da çıkıştan biri eksik
off_day / off_day_workedVardiyasız gün / vardiyasız günde çalıştı
holiday / holiday_workedResmi tatil / resmi tatilde çalıştı
leave_<tür>İzinli; tür /leaves'teki type değeri (ör. leave_annual, leave_sick)
200 OK
{
  "data": [
    {
      "employee_id": "3f6c…",
      "employee_code": "1042",
      "full_name": "Ayşe Yılmaz",
      "work_date": "2026-09-01",
      "day_type": "worked",
      "location_name": "Kadıköy",
      "store_code": "M012",
      "shift_start": "09:00:00",
      "shift_end": "18:00:00",
      "check_in": "2026-09-01T06:12:00+00:00",
      "check_out": "2026-09-01T15:31:00+00:00",
      "worked_minutes": 559,
      "late_minutes": 12,
      "early_leave_minutes": 0,
      "overtime_minutes": 0,
      "shortfall_minutes": 0
    }
  ]
}

Aylık ücret özeti

GET/pay-summary?year=2026&month=9

Burdaa'nın ücret hesabının özeti: maaş, mesai ücretleri, kesintiler, avans ve net tutar. Yalnızca ücret izni verilmiş anahtarla. Vergi ve SGK içermez; bordro programınız için girdidir.

AlanTürAçıklama
employee_id / employee_code / full_name
is_activeboolean
base_salarynumberDönem maaşı
worked_minutesintegerAy içinde çalışılan süre
absent_days / holiday_daysintegerGelmediği gün / resmi tatil günü
weekday_overtime_paynumberHafta içi mesai ücreti
saturday_overtime_pay / sunday_overtime_paynumberCumartesi / pazar mesai ücreti
absent_deduction / long_absence_deductionnumberDevamsızlık kesintileri
deactivation_deductionnumberAy içinde ayrılanlar için kesinti
shortfall_deductionnumberEksik çalışma kesintisi
total_advancenumberVerilen avanslar
net_amountnumberNet tutar

Ham okutmalar

GET/punches?from=YYYY-MM-DD&to=YYYY-MM-DD

Giriş-çıkış okutmalarının kendisi, zaman sırasıyla. Puantajın aksine bugün de alınabilir. Alanlar webhook bildirimindeki data ile aynıdır; webhook'ta kaçırılan bir olayı bu uçla telafi edebilirsiniz.

  • Gün sınırları şirketin saat dilimine göredir. İstek başına en fazla 63 gün.
  • Silinen okutmalar listede yer almaz; düzeltilen okutma son haliyle gelir.
AlanTürAçıklama
punch_iduuidOkutma kimliği
employee_id / employee_code / full_name
typestringcheck_in | check_out
methodstringqr_dynamic, qr_static (QR) ya da manual (yönetici girişi)
occurred_atdatetimeOkutma zamanı (UTC)
location_id / location_name / store_codeOkutulan lokasyon

İzinler

GET/leaves?from=YYYY-MM-DD&to=YYYY-MM-DD

Tarih aralığıyla kesişen izin kayıtları. Puantajdaki day_type izni yalnızca geçmiş günlerde gösterir; bu uç nokta ileri tarihli ve onay bekleyen izinleri de verir. Değişiklikleri anında almak için izin webhook olaylarını kullanın.

  • İstek başına en fazla 366 gün; gelecek tarihler serbest.
  • Çalışan ve yönetici notları ile ekler (ör. rapor) gizlilik nedeniyle verilmez.
AlanTürAçıklama
leave_iduuidİzin kimliği
employee_id / employee_code / full_name
typestringannual (yıllık), sick (hastalık raporu), unpaid (ücretsiz), marriage (evlilik), bereavement (ölüm), paternity (babalık), maternity (doğum), work_accident (iş kazası raporu), other (diğer / mazeret)
statusstringpending (onay bekliyor), approved (onaylandı), rejected (reddedildi)
start_date / end_datedateİlk ve son izin günü (dahil)
daysintegerTakvim günü sayısı
deduct_from_paybooleanÜcretten düşülecek mi
created_atdatetimeTalep / kayıt zamanı

Hata kodları

Hatalar { "error": { "code": "…", "message": "…" } } biçiminde döner. code sabittir, kodunuzda onu kontrol edin.

KodAnlamı
401 INVALID_API_KEYAnahtar yok, yanlış ya da iptal edilmiş
403 API_KEY_FORBIDDENAnahtarın ücret verisi izni yok
400 INVALID_RANGEfrom / to eksik ya da hatalı (YYYY-MM-DD, from ≤ to)
400 RANGE_NOT_CLOSEDto bugün ya da ileri bir tarih
400 RANGE_TOO_LONGAralık çok uzun: puantaj ve okutmalarda 63, izinlerde 366 gün
400 INVALID_PERIODyear / month hatalı ya da gelecek ay
400 INVALID_PAGINATIONlimit 1-5000, offset 0 veya üstü olmalı
429 RATE_LIMITEDDakikada 60 istek aşıldı; Retry-After kadar bekleyin

Notlar

  • Zamanlar ISO 8601, UTC. work_date ve vardiya saatleri şirketin yerel saatindedir (Türkiye için Europe/Istanbul).
  • Sürümleme: adresler /v1 altındadır. Alan eklemek geriye dönük uyumlu kabul edilir; kırıcı bir değişiklik olursa yeni sürüm açılır, eskisi çalışmaya devam eder.
  • Logo, Mikro gibi masaüstü bordro programları için dosya aktarımı ya da özel bir entegrasyon ihtiyacınız varsa bize yazın.