---
title: "Fatura ve Formlardan AI ile JSON Veri Çıkarma"
description: "Fatura ve e-postadan alanları otomatik JSON'a çeviren n8n akışı: adım adım kurulum. AgentRoost'ta AI kredisi dahil, API anahtarı gerekmez."
canonical: https://agentroost.app/tr/blog/fatura-formlardan-ai-ile-veri-cikarma-json
date: 2026-04-11T20:00:00Z
---

[Canonical URL](https://agentroost.app/tr/blog/fatura-formlardan-ai-ile-veri-cikarma-json)

Manuel veri girişi biteviye tekrarlanan, hataya açık bir iş. Bir faturayı ekrana bakarak muhasebeye yazmak ya da gelen e-postalardaki sipariş bilgilerini tabloya kopyalamak, gerçek anlamda değer üretmeyen bir zaman hırsızıdır.

Bu yazıda n8n'nin **AI Agent** ve **Information Extractor** düğümlerini kullanarak serbest metin belgeleri (PDF fatura, JPEG fiş, e-posta gövdesi) → temiz, şema-doğrulanmış JSON'a dönüştüren bir akış kuracağız. Şema uyuşmazlığını ve kötü LLM çıktısını da yakalamayı anlatacağız.

---

## Ne İnşa Ediyoruz?

Hedef: gelen her belge için aşağıdaki JSON'u üretmek.

```json
{
  "invoice_date": "2024-03-15",
  "invoice_number": "INV-2024-0347",
  "vendor_name": "Örnek Tedarik A.Ş.",
  "tax_id": "1234567890",
  "subtotal": 8474.58,
  "vat_amount": 1525.42,
  "total": 10000.00,
  "currency": "TRY",
  "line_items": [
    { "description": "Yazılım Lisansı", "qty": 1, "unit_price": 8474.58 }
  ]
}
```

Çıktı doğrulanıp bir Google Sheets satırına veya muhasebe API'sine gidecek. Eksik alan varsa akış hatayı loglayıp işlemi atlayacak.

---

## n8n Akışının Yapısı

```
[Trigger] → [Belge Al / Metni Hazırla] → [AI Veri Çıkarıcı] → [JSON Şema Doğrula] → [Hata Dalı / Başarı Dalı]
```

### 1. Trigger: E-posta, Webhook veya Zamanlayıcı

Kullanım senaryonuza göre üç başlangıç seçeneği var:

| Senaryo | n8n Düğümü | Detay |
|---|---|---|
| Muhasebe e-postalarını işle | **Gmail Trigger** veya **IMAP Email** | `Has Attachment: true`, `Subject Contains: "Fatura"` |
| Müşteri form yüklemeleri | **Webhook** | POST body'den `file_url` ve `document_type` alır |
| Dosya klasörü tarama | **Schedule Trigger** + **Read Binary Files** | Her gece 02:00, `/invoices/incoming/` klasörü |

**Schedule Trigger** kurulumu (periyodik tarama için):

```
Trigger Mode: Interval
Every: 1 Hour
```

Webhook ile gelen bir örnek body:

```json
{ "file_url": "https://storage.example.com/inv-2024-0347.pdf", "type": "invoice" }
```

### 2. Belgeyi Hazırlama

PDF veya görsel geliyorsa önce metne çevirmeniz gerekiyor. İki yol var:

**Yol A — HTTP Request ile harici PDF → metin servisi:**

```
Node: HTTP Request
Method: POST
URL: https://api.example-pdf-parser.com/extract
Body (JSON):
{
  "url": "{{ $json.file_url }}",
  "output": "text"
}
```

**Yol B — Extract Document düğümü (n8n 1.40+):**
`Extract Document Text` düğümünü ekleyin, girişi `Binary Data` olarak seçin. PDF ve görsel formatlar doğrudan desteklenir; çıkış `text` alanında düz metin gelir.

E-posta gövdesinden çıkarım yapıyorsanız bu adım gereksiz — `{{ $json.text }}` zaten düz metni içerir.

### 3. AI Bilgi Çıkarıcı (Information Extractor)

n8n'nin yerleşik **Information Extractor** düğümü, LLM'i doğrudan JSON şema çıkarmaya yönlendirmek için tasarlanmış en temiz yoldur.

Düğümü ekleyin:

- **Node Type:** Information Extractor
- **Text:** `{{ $json.document_text }}`
- **Model:** (AgentRoost'ta dahili krediyle bağlı, ek ayar gerekmez)

**Extraction Schema** alanına aşağıdaki şemayı girin:

```json
{
  "type": "object",
  "properties": {
    "invoice_date":   { "type": "string", "description": "ISO 8601 tarih, ör. 2024-03-15" },
    "invoice_number": { "type": "string" },
    "vendor_name":    { "type": "string" },
    "tax_id":         { "type": "string", "description": "10 haneli vergi kimlik no" },
    "subtotal":       { "type": "number" },
    "vat_amount":     { "type": "number" },
    "total":          { "type": "number" },
    "currency":       { "type": "string", "enum": ["TRY","USD","EUR"] }
  },
  "required": ["invoice_date","vendor_name","total","currency"]
}
```

`required` alanında olmayan alanlar bulunamazsa `null` döner; sizi panikleten `undefined` hatası yerine temiz bir `null`.

### 4. Model Seçimi

Information Extractor'ı farklı modellerle yönlendirmek için bir `AI Model` (LLM) alt-düğümü bağlayın.

**Faturalar için önerilen modeller:**
- `openai/gpt-4o-mini` — hız/maliyet dengesi, çoğu yapılandırılmış fatura için yeterli
- `anthropic/claude-3-5-haiku` — karmaşık Türkçe belgeler için daha güvenilir
- `google/gemini-flash-1.5` — çok sayfalı PDF'lerde uzun bağlam avantajı

AgentRoost'ta çok sayıda model seçeneği mevcut; akış panelinden istediğiniz zaman değiştirebilirsiniz.

### 5. JSON Şema Doğrulama

LLM her zaman mükemmel çıktı üretmez. Bir **Code** düğümüyle zorunlu alan kontrolü ekleyin:

```javascript
const data = $input.first().json;
const required = ['invoice_date', 'vendor_name', 'total', 'currency'];
const missing = required.filter(k => data[k] === null || data[k] === undefined);

if (missing.length > 0) {
  throw new Error(`Eksik alanlar: ${missing.join(', ')}`);
}

// Sayısal alanların tip kontrolü
if (typeof data.total !== 'number') {
  throw new Error(`'total' sayı olmalı, gelen: ${typeof data.total}`);
}

return [{ json: data }];
```

### 6. IF Düğümü: Başarı vs. Hata Yolu

**IF** düğümü ekleyin:

- **Condition:** `{{ $json.invoice_date }}` → `is not empty`
- **True branch → Google Sheets / veritabanı / Airtable**
- **False branch → Slack/e-posta bildirim + hata logu**

Hata yolunda **Send Email** veya **Slack** düğümüyle uyarı gönderin:

```
Mesaj: "⚠️ Belge işlenemedi: {{ $('Webhook').item.json.file_url }} — Eksik: {{ $json.error_message }}"
```

---

## Yaygın Tuzaklar ve Çözümleri

**Tuzak 1 — LLM sayıyı string döndürüyor**
`"total": "10.000,00"` gibi formatlı string alabilirsiniz. Code düğümünde normalize edin:

```javascript
const raw = data.total;
if (typeof raw === 'string') {
  data.total = parseFloat(raw.replace(/\./g, '').replace(',', '.'));
}
```

**Tuzak 2 — Tarih formatı tutarsız**
LLM `"15/03/2024"` veya `"Mart 15, 2024"` dönebilir. Şema description'ına `"ISO 8601 format YYYY-MM-DD olarak döndür"` yazın ya da prompt'ta açıkça belirtin.

**Tuzak 3 — Uzun PDF'lerde bağlam kaybı**
100 sayfalık bir belgenin tamamını LLM'e göndermek hem yavaş hem de verimsiz. İlk birkaç sayfanın metnini kesmek için:

```javascript
const text = $json.document_text;
return [{ json: { document_text: text.slice(0, 8000) } }];
```

---

## AgentRoost'ta Bu Akışı Çalıştırma

Kendi n8n örneğinizi AgentRoost'ta çalıştırmak yaklaşık 2 dakika alıyor:

1. **[agentroost.app/tr/agents/n8n](/tr/agents/n8n)** adresine gidin.
2. Kayıt olun (e-posta, Google, Microsoft veya Discord ile).
3. "n8n" framework'ünü seçin, örneğinize bir isim verin.
4. Birkaç saniye içinde `https://<sizin-id>.agentroost.app` adresinde kendi özel n8n editörünüz açılır — bu örnek tamamen size aittir.
5. Yukarıdaki akışı oluşturun; **AI nodes zaten bağlı, API anahtarı girmenize gerek yok.** AI kredileri aboneliğe dahil.

Rakip platformlarda (n8n Cloud, Elestio, Sliplane) AI düğümlerini kullanmak için OpenAI veya Anthropic API anahtarı almanız ve aylık kullanım ücreti ödemeniz gerekir. AgentRoost'ta bu maliyet abonelik fiyatına dahil: **$19,99/ay, 14 gün iade garantisi.**

Model değiştirmek ister misiniz? n8n editöründeki LLM alt-düğümünden istediğiniz modeli seçin, akışı yeniden başlatın — başka bir ayar gerekmez.

[Planları karşılaştır →](/tr/pricing)

---

## Sonuç

Belgeden yapılandırılmış veri çıkarma artık büyük mühendislik projesi değil: doğru n8n düğümleri + bir LLM + basit şema doğrulama = çalışan bir boru hattı. En zor kısım genellikle altyapı (API anahtarı bulma, sunucu kurma, SSL ayarlama) olur — AgentRoost bunu ortadan kaldırır ve sizi iş mantığına odaklanmanızı sağlar.
