Türkçe dokümantasyon için aşağıya bakın / See below for Turkish documentation.
A Spring Boot 3.4.4 / Java 17 REST API that wraps Turkey's GİB e-Arşiv (eArchive) electronic invoice portal. This is the only open-source Spring Boot / Java implementation of the GİB eArşiv dispatch API available on GitHub.
- Create, list, fetch, and cancel e-Arşiv invoices (draft + SMS-OTP approval flow)
- Export invoices as HTML or PDF (unsigned draft or signed final)
- Look up company info by tax/ID number (VKN / TCKN)
- Manage user profile on the eArşiv portal
- Trigger and verify SMS OTP to approve invoices
- Targets both the GİB test portal (
earsivportaltest.efatura.gov.tr) and the live portal (earsivportal.efatura.gov.tr) via Spring profiles
git clone https://github.com/iamhusrev/efatura-api-spring-boot.git
cd efatura-api-spring-boot
mvn spring-boot:run -Dspring-boot.run.profiles=test
# Swagger UI: http://localhost:8080/swagger-ui.html
curl -X POST http://localhost:8080/api/auth/test-credentialsJava 17 · Spring Boot 3.4.4 · Spring RestClient · openhtmltopdf 1.0.10 · jsoup 1.17.2 · SpringDoc OpenAPI 2.8.6 · Lombok · JUnit 5 + Mockito
This is an independent open-source project. It is not affiliated with, endorsed by, or approved by the Turkish Revenue Administration (GİB). All tax and legal responsibilities rest with the user. See DISCLAIMER.md for full details.
Türkiye eArşiv (GİB) portalı ile entegre olan Spring Boot tabanlı REST API servisi. Fatura oluşturma, sorgulama, iptal, HTML/PDF çıktı ve firma sorgu işlemlerini tek bir API üzerinden sunar.
Bu proje bağımsız bir açık kaynak çalışmasıdır; Gelir İdaresi Başkanlığı (GİB) ile resmi bir ilişkisi yoktur. Üretilen fatura/verilerin doğruluğu ve mevzuata uygunluğu kullanıcının sorumluluğundadır. Üretim kullanımı öncesi mali müşavirinize danışın. Detay için mutlaka
DISCLAIMER.mddosyasını okuyun.
- Özellikler
- Teknoloji Stack
- Hızlı Başlangıç
- Derleme ve Çalıştırma
- Konfigürasyon
- Fatura Yaşam Döngüsü
- REST Endpoint'leri
- Swagger UI
- Postman ile Test
- Mimari
- Katkıda Bulunma
- Yasal Uyarı
- Lisans
- ✅ Taslak fatura oluşturma, sorgulama, iptal
- ✅ Fatura HTML ve PDF çıktısı (openhtmltopdf ile)
- ✅ Tarih aralığına göre fatura listeleme (kestiğin ve sana kesilen ayrı ayrı)
- ✅ VKN/TCKN ile firma bilgisi sorgulama
- ✅ Kullanıcı/firma profil bilgilerini getir/güncelle
- ✅ SMS ile fatura doğrulama
- ✅ Test ve prod ortamları için ayrı Spring profilleri
- ✅ Stateless token-based auth (
X-Earsiv-Tokenheader) - ✅ Swagger UI + OpenAPI 3 dokümantasyonu
- ✅ Merkezi hata yönetimi (
@RestControllerAdvice)
| Kategori | Teknoloji |
|---|---|
| Dil | Java 17+ |
| Framework | Spring Boot 3.4.4 |
| Build | Maven |
| HTTP Client | Spring RestClient (JDK HttpClient) |
| PDF Üretim | openhtmltopdf-pdfbox 1.0.10 |
| HTML Parsing | jsoup 1.17.2 |
| Validation | Jakarta Validation |
| Boilerplate | Lombok |
| API Docs | SpringDoc OpenAPI 2.8.6 |
| Test | JUnit 5 + Mockito |
# 1. Klonla
git clone https://github.com/iamhusrev/efatura-api-spring-boot.git
cd efatura-api-spring-boot
# 2. Test ortamında ayağa kaldır (GİB test portalı)
mvn spring-boot:run -Dspring-boot.run.profiles=test
# 3. Otomatik test credentials ile token al
curl -X POST http://localhost:8080/api/auth/test-credentials
# 4. Swagger UI'da keşfet
open http://localhost:8080/swagger-ui.htmlİlk 5 dakikada Postman collection ile daha hızlı başlamak istersen → Postman ile Test.
# Derle
mvn clean compile
# Testleri çalıştır
mvn test
# Test ortamında ayağa kaldır (GİB test: earsivportaltest.efatura.gov.tr)
mvn spring-boot:run -Dspring-boot.run.profiles=test
# Prod ortamında ayağa kaldır (GİB canlı: earsivportal.efatura.gov.tr)
mvn spring-boot:run -Dspring-boot.run.profiles=prod
# JAR olarak paketle ve çalıştır
mvn clean package
java -jar target/efatura-api-spring-boot-1.0.0-SNAPSHOT.jar --spring.profiles.active=testUygulama URL'i: http://localhost:8080 (varsayılan port, SERVER_PORT environment variable ile değiştirilebilir)
- Varsayılan:
8080 - Değiştirmek için:
SERVER_PORTenvironment variable'ını ayarla
# Örnek: port 9000'de çalıştır
SERVER_PORT=9000 mvn spring-boot:run -Dspring-boot.run.profiles=test
# veya JAR ile
java -jar target/efatura-api-*.jar --SERVER_PORT=9000 --spring.profiles.active=testGİB endpoint'leri ve login komutu src/main/resources/application*.yml dosyalarında tanımlıdır:
earsiv:
base-url: https://earsivportal.efatura.gov.tr
dispatch-path: /earsiv-services/dispatch
token-path: /earsiv-services/assos-login
esign-path: /earsiv-services/esign
download-path: /earsiv-services/download
login-command: anologin # test ortamında "login"| Profil | Base URL | Login Command |
|---|---|---|
test |
earsivportaltest.efatura.gov.tr |
login |
prod (default) |
earsivportal.efatura.gov.tr |
anologin |
Kimlik bilgilerini asla koda veya konfig dosyasına gömmeyin. Production'da environment variable veya secret manager kullanın.
GİB eArşiv portalında tüm faturalar önce taslak olarak doğar, sonra SMS OTP ile onaylanır:
POST /api/invoices (taslak oluştur — onayDurumu: "Onaylanmadı")
│
▼
POST /api/sms/send (GİB'den SMS tetikle — operationId döner)
│
▼
POST /api/sms/verify {code, oid, (kullanıcının girdiği 6 haneli kod)
invoices:[ettn]}
│
▼
Fatura "Onaylandı" statüsüne geçer; HTML/PDF artık imzalı olarak alınabilir.
İp ucu:
GET /api/invoices?status=onaysizile sadece onay bekleyen faturaları,status=onayliile imzalı faturaları filtreleyebilirsiniz.
Tüm endpoint'ler (/api/auth/* hariç) X-Earsiv-Token header'ı gerektirir.
| Method | Endpoint | Açıklama |
|---|---|---|
| POST | /api/auth/login |
Kullanıcı adı + şifre ile giriş |
| POST | /api/auth/test-credentials |
Test ortamı için otomatik credential + token |
| POST | /api/auth/logout |
Çıkış yap |
| GET | /api/company/{taxNumber} |
VKN/TCKN ile firma sorgula |
| GET | /api/user-info |
Kullanıcı profilini getir |
| PUT | /api/user-info |
Kullanıcı profilini güncelle |
| POST | /api/invoices |
Taslak fatura oluştur |
| GET | /api/invoices?startDate=&endDate=&status=hepsi|onayli|onaysiz |
Kestiği faturaları listele |
| GET | /api/invoices/issued-to-me?startDate=&endDate= |
Kesilen faturaları listele |
| GET | /api/invoices/{uuid} |
Tek fatura detayı |
| GET | /api/invoices/{uuid}/html?signed=true |
Fatura HTML |
| GET | /api/invoices/{uuid}/pdf?signed=true |
Fatura PDF |
| GET | /api/invoices/{uuid}/download-url?signed=true |
Fatura indirme URL'i |
| DELETE | /api/invoices/{uuid} |
Fatura iptal |
| POST | /api/sms/send |
SMS doğrulama başlat |
| POST | /api/sms/verify |
SMS kodunu doğrula |
Tarih formatı: DD/MM/YYYY (örn. 01/03/2026)
Uygulama ayağa kalktıktan sonra:
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/v3/api-docs
Tüm endpoint'leri tarayıcıdan try-out butonu ile test edebilirsin.
Repo içinde hazır Postman koleksiyonu bulunur: postman/
- Postman'i aç → Import →
postman/efatura-api.postman_collection.jsonvepostman/efatura-local.postman_environment.jsondosyalarını içeri al - Sağ üstten eFatura Local environment'ını seç
- Environment değişkenlerine
username(VKN/TCKN) vepasswordbilgilerini gir
- Login isteğini çalıştırdığında cevaptaki
tokenotomatik olaraktokendeğişkenine yazılır (test script'i yapar) - Sonraki tüm istekler
X-Earsiv-Token: {{token}}header'ıyla otomatik gider - Login atmadan başka bir isteği çalıştırmaya çalışırsan → collection seviyesindeki pre-request script seni "Token yok!" hatasıyla uyarır
- Fatura listeleme yaptığında ilk ETTN otomatik
ettndeğişkenine yazılır; HTML/PDF/detay istekleri bu değeri kullanır
1. Login (test ortamı — otomatik credential) → token set
2. Kullanıcı bilgilerini getir → profil kontrol
3. Taslak fatura oluştur → yeni ETTN set
4. Fatura HTML / PDF → çıktıyı al
5. (Opsiyonel) Fatura iptal
Katmanlı (layered) mimari, endpoint → service → HTTP client zinciri:
HTTP İstemcisi
↓ (X-Earsiv-Token)
Controller ───────→ GlobalExceptionHandler
↓
Service
↓
EarsivApiClient (düşük seviye GIB dispatch)
↓
GİB API (earsivportal.efatura.gov.tr)
Paket özeti:
controller/— REST endpoint'leri (5 controller)service/— İş mantığı;EarsivApiClientortak GİB dispatch logic'imodel/— Invoice (47 alan), InvoiceLineItem, UserInformation + DTO'lar + enum'larmapper/— EN ↔ TR key dönüşümü (GİB API Türkçe key ister)exception/— Özel exception'lar +@RestControllerAdviceile merkezi handlingconfig/—RestClientbean,@ConfigurationProperties, OpenAPI konfig
Detaylı paket yapısı ve akış diyagramları için → PROJECT_STRUCTURE.md
Katkılarınız memnuniyetle karşılanır:
- Repoyu fork'la
- Bir feature branch aç (
git checkout -b feature/yeni-ozellik) - Değişikliklerini commit'le (
git commit -m 'feat: yeni özellik eklendi') - Branch'i push'la (
git push origin feature/yeni-ozellik) - Pull Request aç
Büyük değişiklikler için önce bir Issue açıp tartışalım.
Hata bulduysan: Issue tracker'dan bildir; mümkünse repro adımlarını ve stack trace'i ekle.
Bu proje bağımsız bir açık kaynak çalışmasıdır. T.C. Gelir İdaresi Başkanlığı (GİB) tarafından geliştirilmemiş, desteklenmemiş veya onaylanmamıştır.
Bu yazılımla oluşturulan her türlü fatura ve belge üzerindeki mali, hukuki ve cezai sorumluluk tamamen kullanıcıya aittir. Üretim ortamında kullanmadan önce yetkili bir mali müşavire (SMMM/YMM) danışın.
Tam sorumluluk reddi beyanı için → DISCLAIMER.md
- GİB eArşiv portal ekibi — Public test ortamını kamuya açık tuttukları için.
Bu proje MIT lisansı ile lisanslanmıştır. Detaylar için LICENSE dosyasına bakınız.
Kullanım öncesi mutlaka DISCLAIMER.md dosyasındaki sorumluluk reddi beyanını okuyun.
GitHub Topics (önerilen):
spring-boot·java·efatura·e-fatura·earsiv·gib·e-invoice·turkey·rest-api·java17