Yurt dışına hizmet satan bir yazılım şirketi, dolar fiyatlı ürün satan bir e-ticaret sitesi ya da euro ile alım yapan bir ithalatçı için dövizli kayıtlar ön muhasebenin en hata yapılan kısmıdır. Yanlış para birimi kodu, eksik kur ya da yanlış hesaptan girilen tahsilat; cari bakiyeleri ve TL karşılıklarını bozar.

Bu yazıda Paraşüt API v4'te para birimi alanlarını, exchange_rate kullanımını, exchange_rates uç noktasından TCMB kurunu çekmeyi, dövizli tahsilat ve ödemeyi ve en sık yapılan hataları anlatıyoruz. Sonda çek ve senet kaydına da kısaca değiniyoruz. Temel kurulum için Paraşüt entegrasyonu genel rehberine bakabilirsiniz.

Para birimi kodları: TRL, USD, EUR, GBP

Paraşüt API para birimi için yalnızca dört değer kabul eder: TRL, USD, EUR ve GBP. Bu enum satış faturası, alış faturası, teklif, banka gideri, maaş, kasa/banka hesabı ve çek gibi kaynaklarda aynıdır.

typescript
// Dış sistemden gelen kodu Paraşüt enum'una çevir
const PARASUT_CURRENCIES = ['TRL', 'USD', 'EUR', 'GBP'] as const;
type ParasutCurrency = typeof PARASUT_CURRENCIES[number];

export function toParasutCurrency(code: string): ParasutCurrency {
  const c = code.trim().toUpperCase();
  const mapped = c === 'TRY' ? 'TRL' : c;
  if (!(PARASUT_CURRENCIES as readonly string[]).includes(mapped)) {
    throw new Error(`Paraşüt bu para birimini desteklemiyor: ${code}`);
  }
  return mapped as ParasutCurrency;
}

Bu dört kodun dışında bir para biriminde satış yapıyorsanız (ör. pazaryerinden gelen başka bir döviz), kaydı Paraşüt'e hangi para birimiyle aktaracağınızı mali müşavirinizle belirlemeniz gerekir; API başka kod kabul etmez. WooCommerce tarafındaki para birimi ayarları için WooCommerce Türkiye ayarları yazısına bakabilirsiniz.

exchange_rate alanı nerede, ne işe yarar?

exchange_rate alanı nerede, ne işe yarar? sales_invoices (satış faturası, proforma), purchase_bills (basic ve detaylı), sales_offers (teklif), bank_fees, salaries

Dövizli bir belgede currency ile birlikte exchange_rate (döviz kuru) gönderebilirsiniz. Paraşüt'ün fatura rehberi bu alanı "TRL dışı dövizler için kur" olarak tanımlar. Alanın bulunduğu başlıca gövdeler:

Kaynakcurrencyexchange_rate
sales_invoices (satış faturası, proforma)İsteğe bağlıİsteğe bağlı
purchase_bills (basic ve detaylı)Zorunluİsteğe bağlı
sales_offers (teklif)İsteğe bağlıİsteğe bağlı
bank_fees, salariesZorunluİsteğe bağlı
taxesAlan yokAlan yok
checks (çek / senet)ZorunluAlan yok

Belge, dövizli bir faturada exchange_rate gönderilmezse hangi kurun kullanılacağını açıklamaz. Bu yüzden dövizli belgelerde kuru kendiniz belirleyip açıkça göndermeniz, sonucu öngörülebilir kılar. Hangi kuru (alış veya satış, hangi tarih) kullanacağınız ise bir muhasebe kararıdır.

Teklifte ayrıca display_exchange_rate_in_pdf alanı vardır; kurun teklif PDF'inde gösterilip gösterilmeyeceğini belirler. Teklif akışının tamamı teklif ve proforma yazısında.

USD satış faturası örneği

bash
curl -X POST "https://api.parasut.com/v4/$COMPANY_ID/sales_invoices" \
  -H "Authorization: Bearer $PARASUT_TOKEN" \
  -H "Content-Type: application/vnd.api+json" \
  -H "Accept: application/json" \
  -d '{
    "data": {
      "type": "sales_invoices",
      "attributes": {
        "item_type": "invoice",
        "issue_date": "2026-11-03",
        "due_date": "2026-12-03",
        "currency": "USD",
        "exchange_rate": 41.25
      },
      "relationships": {
        "contact": { "data": { "type": "contacts", "id": "CONTACT_ID" } },
        "details": { "data": [ {
          "type": "sales_invoice_details",
          "attributes": { "quantity": 1, "unit_price": 1000, "vat_rate": 20 },
          "relationships": { "product": { "data": { "type": "products", "id": "PRODUCT_ID" } } }
        } ] }
      }
    }
  }'

Örnekteki 41.25 yalnızca yer tutucudur; gerçek değeri aşağıdaki exchange_rates ucundan alın. item_type seçimi (ör. invoice ya da export), vat_rate değeri ve faturanın e-Fatura mı e-Arşiv mi olacağı vergi mevzuatına bağlıdır; bunlar API belgesinin konusu değildir. Faturanın genel yapısı için fatura kesme yazısına, resmileştirme için e-Fatura ve e-Arşiv yazısına bakın.

exchange_rates: TCMB kurunu API'den çekmek

exchange_rates: TCMB kurunu API'den çekmek: Yanıt sayfalanmaz ve meta içermez., Henüz kur kaydı yoksa id boş ve kurlar 0 gelir; bu durumda kuru faturaya..., Geçersiz tarih...

GET /{company_id}/exchange_rates verilen tarih için USD, EUR ve GBP kurlarını döner. Tarih filter[date] parametresiyle YYYY-MM-DD biçiminde verilir; verilmezse bugün kullanılır. Her para birimi için istenen tarihe eşit ya da ondan önceki en son TCMB kuru gelir.

AlanAçıklama
dateKurun tarihi; istenen tarihten önce olabilir
currencyUSD, EUR veya GBP
buying_rateDöviz alış (string olarak döner)
selling_rateDöviz satış (string olarak döner)
created_at, updated_atKayıt zamanları
bash
curl "https://api.parasut.com/v4/$COMPANY_ID/exchange_rates?filter[date]=2026-11-03" \
  -H "Authorization: Bearer $PARASUT_TOKEN" -H "Accept: application/json"
  • Yanıt sayfalanmaz ve meta içermez.
  • Henüz kur kaydı yoksa id boş ve kurlar 0 gelir; bu durumda kuru faturaya yazmayın.
  • Geçersiz tarih biçiminde gövdesiz 400, 2000 yılından önceki tarihlerde 404 döner.
  • TRL için kayıt dönmez; enum yalnızca USD, EUR ve GBP içerir.
  • date alanı istenen tarihten önce olabilir (ör. hafta sonu). Hangi kurun kullanıldığını loglamak için bu alanı saklayın.
typescript
type Rate = { attributes: { date: string; currency: 'USD' | 'EUR' | 'GBP'; buying_rate: string; selling_rate: string } };

export async function getRate(token: string, date: string, currency: 'USD' | 'EUR' | 'GBP') {
  const url = `https://api.parasut.com/v4/${process.env.PARASUT_COMPANY_ID}/exchange_rates?filter[date]=${date}`;
  const res = await fetch(url, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/json' } });
  if (!res.ok) throw new Error(`exchange_rates ${res.status}`);
  const body = (await res.json()) as { data: Rate[] };
  const row = body.data.find((r) => r.attributes.currency === currency);
  const selling = Number(row?.attributes.selling_rate);   // string gelir, sayıya çevir
  if (!row || !Number.isFinite(selling) || selling === 0) throw new Error('Kur henüz yok');
  return { rate: selling, rateDate: row.attributes.date };
}

Dövizli tahsilat ve ödeme

Fatura tahsilatı (POST /sales_invoices/{id}/payments) ve alış faturası ödemesi (POST /purchase_bills/{id}/payments) aynı PaymentFormAttributes gövdesini kullanır. Döviz açısından iki alan önemlidir:

AlanBelgedeki tanım
account_idKasa veya banka. Bu parametre ödemenin veya tahsilatın hangi döviz kuru ile yapılacağını da belirler.
exchange_rateÖdeme veya tahsilat faturadan farklı bir döviz kuru ile yapılacaksa döviz kurunun TL karşılığı. Fatura ile aynı döviz kuru ile yapılacaksa 1.0 ya da boş.

Yani tahsilatın para birimini gövdede ayrı bir alanla değil, seçtiğiniz kasa veya banka hesabıyla belirlersiniz. Hesapların para birimi accounts kaydındaki currency alanındadır ve hesap listesi filter[currency] ile süzülebilir. Örneğin USD faturayı USD hesabına tahsil ediyorsanız exchange_rate göndermeyebilirsiniz; farklı bir kurla tahsil ediyorsanız kurun TL karşılığını yazarsınız. Bu tanımı kendi senaryolarınızda staging hesabında doğrulayın.

json
{
  "data": {
    "type": "payments",
    "attributes": {
      "account_id": 789,
      "date": "2026-12-03",
      "amount": 1200,
      "description": "SWIFT tahsilatı"
    }
  }
}

Çalışana ödeme ucunda (employee_debit_transactions) kural daha açıktır: TL dışı hesaplarda exchange_rate ya da target_amount zorunludur, aksi hâlde 422 "Döviz kuru doldurulmalı" döner. Kasa veya banka hesapları arasında farklı para birimiyle transfer için POST /accounts/money_transfers uç noktası source_amount (kaynak hesabın para biriminde) ve target_amount (hedef hesabın para biriminde) alanlarını ister; aynı para birimindeki hesaplarda iki tutar eşit olmalıdır. Tahsilat ve ödemenin genel akışı tahsilat ve ödeme kaydı yazısında.

TL karşılıkları ve dövizli bakiyeler

TL karşılıkları ve dövizli bakiyeler: Satış ve alış faturasında remaining_in_trl; her iki listede de..., Teklif listesinde sıralama için net_total_in_trl., Caride ve çalışanda...

API dövizli kayıtlarda TL karşılıklarını hazır hesaplanmış alanlarla döner. Bunlar salt okunurdur; göndermeyin, yalnızca okuyun:

  • Satış ve alış faturasında remaining_in_trl; her iki listede de sort=remaining_in_trl kullanılabilir.
  • Teklif listesinde sıralama için net_total_in_trl.
  • Caride ve çalışanda para birimi bazında trl_balance, usd_balance, eur_balance, gbp_balance.
  • İşlem (transactions) kaydında amount_in_trl, debit_currency ve credit_currency.
  • Üründe list_price_in_trl ve buying_price_in_trl; satış ve alış dövizi currency ve buying_currency alanlarındadır.

Ürün ve stok tarafı için ürün, stok ve depo yönetimi yazısına, cari bakiyeleri için cari hesap yazısına bakabilirsiniz.

Sık yapılan hatalar

HataDoğrusu
currency: "TRY" göndermekcurrency: "TRL" gönderin
exchange_rates yanıtındaki string kuru olduğu gibi göndermekNumber tipine çevirip gönderin
Kur 0 döndüğünde faturaya 0 yazmakKur yoksa işlemi durdurun veya önceki günün kurunu bilinçli seçin
remaining_in_trl, net_total gibi salt okunur alanları göndermekBu alanları yalnızca yanıttan okuyun
Tahsilatta para birimi alanı aramakPara birimini account_id ile seçilen hesap belirler
Çek ödemesinde amount göndermekÇek ödemesinde amount gönderilmez, tutar çekin tamamıdır
Vergi kaydına currency eklemektaxes gövdesinde currency alanı tanımlı değildir

Hata yanıtlarını errors[].source.pointer ile ayırt etmek ve 422 ile 429'u doğru ele almak için hata kodları ve rate limit yazısına bakın.

Kısaca çek ve senet kaydı

Paraşüt'te çek ve senetler aynı kaynakta tutulur: /{company_id}/checks. Oluşturma gövdesinde net_total (0'dan büyük), currency, issue_date ve due_date zorunludur; description, serial_number, bank_identifier ve yalnızca bank_identifier: OTHER ile birlikte bank_name isteğe bağlıdır.

  • Alınan çek için issued_by, verilen çek için given_to ilişkisinden tam olarak biri gönderilir (ikisi birden ya da hiçbiri 400 döner).
  • İsteğe bağlı payable ilişkisi çeki bir satış faturasına (sales_invoices) ya da fişe (purchase_bills) öncelikli eşleştirir.
  • Alınan çeki tedarikçiye ciro etmek için PATCH /checks/{id}/transfer kullanılır; date ve given_to zorunludur.
  • Çeki tahsil etmek veya ödemek için POST /checks/{id}/payments yalnızca date ve account_id alır. Hesabın para birimi çekin para birimiyle aynı olmalı ve hesapta banka entegrasyonu olmamalıdır.
  • Liste filter[currency], filter[item_type] ve operatörlü tarih filtrelerini (filter[due_date][lteq]=2026-11-30 gibi) destekler; page[size] en fazla 10000'dir.
json
{
  "data": {
    "type": "checks",
    "attributes": {
      "net_total": 5000,
      "currency": "USD",
      "issue_date": "2026-11-03",
      "due_date": "2027-01-15",
      "bank_identifier": "OTHER",
      "bank_name": "Örnek Bank",
      "serial_number": "123456"
    },
    "relationships": {
      "issued_by": { "data": { "type": "contacts", "id": "CONTACT_ID" } },
      "payable": { "data": { "type": "sales_invoices", "id": "INVOICE_ID" } }
    }
  }
}

Belgeye göre çek oluşturulduğunda remaining_in_trl o günkü kurla hesaplanır. Dövizli bir çeki tahsil ederken çekle aynı para biriminde bir hesap seçmeniz gerektiğini unutmayın.

Sık Sorulan Sorular

Paraşüt API TRY kabul ediyor mu?

Hayır. Türk lirası için TRL kullanılır; enum değerleri TRL, USD, EUR ve GBP'dir.

exchange_rates ucu hangi kuru döner?

USD, EUR ve GBP için TCMB kurunu döner: istenen tarihe eşit ya da ondan önceki en son kur. Hem buying_rate hem selling_rate string olarak gelir; hangisini kullanacağınız muhasebe tercihinizdir.

Dövizli faturaya TL hesabından tahsilat girebilir miyim?

Tahsilatın hangi para birimiyle yapılacağını account_id ile seçtiğiniz hesap belirler. Faturadan farklı bir kurla tahsilatta exchange_rate alanına kurun TL karşılığı yazılır. Senaryonuzu canlıya almadan önce staging hesabında deneyin.

exchange_rate göndermezsem ne olur?

Belge bu durumda hangi kurun uygulanacağını açıklamaz. Öngörülebilir sonuç için dövizli belgelerde kuru kendiniz belirleyip gönderin.

Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.

İlgili içerikler: Paraşüt entegrasyonu genel rehberi · Paraşüt API ile fatura kesme · Paraşüt API tahsilat ve ödeme · Paraşüt API alış faturası ve gider kaydı · E-ticaret siparişini Paraşüt'e aktarma · Pazaryeri entegrasyonu rehberi