Ana Sayfa / Blog / Tarım & Gıda
Tarım & Gıda

Tarımsal Ürün Fiyatları API Entegrasyonu: TÜRİB ELÜS, TMO Bülteni ve Hububat Maliyet Takibi

Yazar: apibir Geliştirici Ekibi 8 dk okuma süresi

Özet: Un, yağ ve yem maliyetleri Türkiye’de çoğu zaman Excel’de gecikmeli borsa notlarıyla güncellenir. Bu yazıda apibir Tarımsal Ürün Fiyatları API ile TÜRİB ELÜS ve TMO bülteni kaynaklı hububat / yağlı tohum fiyatlarını çekmeyi, borsa karşılaştırmasını, geçmiş seriyi ve gıda hammadde maliyet otomasyonunu Node.js ile Python örnekleriyle adım adım entegre ediyoruz.

İçindekiler

  1. Neden tarımsal ürün fiyatları API’si kullanmalısınız?
  2. Uç noktalar ve alanlar
  3. Günlük fiyat çekme (prices)
  4. Ürün sözlüğü ve borsa listesi
  5. Geçmiş fiyat serisi
  6. Pratik senaryolar: kooperatif, un/yağ maliyeti, alarm, kredi
  7. Hal Fiyatları ve Döviz ile birlikte kullanım
  8. Sık yapılan hatalar
  9. Sık sorulan sorular

Hububat ve yağlı tohum fiyatı, gıda sanayiinde “hammadde maliyeti”nin omurgasıdır. Konya’da ekmeklik buğday ile Edirne’de yağlık ayçiçeği aynı gün farklı seans ortalamaları verir; TMO müdahale/alım fiyatı varsa taban referansı da değişir. Manuel PDF bülteni veya dağınık ticaret borsası ekranları ile takipte tipik kırılma şudur: panonuz dünkü ortalamayı gösterir, maliyet motorunuz ise bir gün geriden çalışır. apibir’in /agriculture/* uçları lisans sonrası TÜRİB ELÜS gecikmeli verisi ve TMO bülteni göstergelerini tek JSON zarfta sunar; il ticaret borsası sitelerinden kazıma yapılmaz. Aşağıdaki rehber entegrasyonu uç nokta tablosu, örnek JSON ve kopyala-yapıştır kodlarla tamamlar.

Not: Bu API, sebze/meyve toptancı hali fiyatlarını kapsayan Hal Fiyatları servisinden ayrıdır. Burada odak hububat, yağlı tohum ve ilgili ticaret borsası / ELÜS / TMO verisidir.

Neden Tarımsal Ürün Fiyatları API’si Kullanmalısınız?

Tarımsal fiyat tek bir “buğday kuru” değildir. Ürününüzün ihtiyacına göre şu katmanlar ayrı ayrı gelir:

  • Günlük seans fiyatı — min / max / ağırlıklı ortalama; birim genelde TL/kg.
  • Borsa ve şehir boyutu — aynı ürün Konya TB ile başka borsada farklı işlem görür.
  • TMO referansı — varsa tmoPrice ile müdahale/alım fiyatı.
  • HacimvolumeKg ile seans derinliği.
  • Geçmiş seri — maliyet trendi, alarm eşiği ve sigorta/kredi modeli için.

Manuel veya kazıma tabanlı kurulumda tipik kırılmalar:

  • Gecikme: Bülten PDF’i öğleden sonra iner; panonuz hala önceki seansı gösterir.
  • Karışıklık: Hal fiyatı (domates, patates) ile hububat borsa fiyatı aynı “tarım” etiketi altında karışır.
  • Tarihçe yok: “Son 30 günde ayçiçeği kaç TL/kg oynadı?” sorusuna yanıt veremezsiniz.
  • Kazıma kırılganlığı: İl ticaret borsası HTML’i değişince scraper düşer; lisanslı API bunu hedeflemez.

API tabanlı kurgu üçünü birden çözer: borsa seansı sonrası günlük güncelleme, alanlar ayrı tutulur ve /agriculture/history ile geçmiş seri sorgulanabilir. Kod yazmadan günlük özet isteyen ekipler için apibir WhatsApp / e-posta raporları da aynı veri ailesini kullanır.

Uç Noktalar ve Alanlar

Temel adres: https://api.apibir.com/v1

Ne döner
GET /agriculture/prices Günlük tarımsal ürün fiyatları (TÜRİB ELÜS / TMO bülteni göstergeleri)
GET /agriculture/products Ürün ve kalite sınıfı sözlüğü
GET /agriculture/exchanges Ticaret borsası listesi
GET /agriculture/history Ürün bazında geçmiş fiyat serisi

Kimlik doğrulama tüm apibir uçlarında aynıdır:

Authorization: apikey APIBIR-8f2c...9d41
Accept: application/json

Yanıt zarfı diğer servislerle ortaktır: success, data, creditsUsed, creditsRemaining. /agriculture/prices yanıtında ayrıca seans gününü gösteren date alanı bulunur. Her başarılı istek tipik olarak 1 kredi harcar; 4xx hataları kredi düşürmez. Ücretsiz plan yaklaşık 100 kredi/ay ile geliştirme ve deneme için yeterlidir. Güncelleme sıklığı: günlük (borsa seansı sonrası); lisans paketi açıldıktan sonra uçlar veri döner.

/agriculture/prices sorgu parametreleri:

Parametre Örnek Açıklama
product bugday-ekmeklik Ürün kodu veya adı (opsiyonel)
exchange konya-tb Ticaret borsası kodu (opsiyonel)
city Konya / plaka Şehir adı veya plaka kodu
date 2026-09-15 YYYY-MM-DD; varsayılan son işlem günü
group hububat hububat | yagli-tohum | meyve | hayvancilik

Sık görülen alanlar:

Alan Örnek Açıklama
product Ekmeklik Buğday Görünen ürün adı
productCode bugday-ekmeklik Sabit ürün anahtarı
group hububat Ürün grubu
exchange / city Konya Ticaret Borsası / Konya Fiyatın oluştuğu borsa ve şehir
unit TL/kg Fiyat birimi
min / max / average 11.15 / 12.40 / 11.78 Seans içi en düşük, en yüksek, ağırlıklı ortalama
previousAverage / changePercent 11.62 / 1.38 Önceki ortalama ve yüzde değişim
volumeKg 4128500 İşlem gören miktar (kg)
tmoPrice 11.90 Varsa TMO müdahale/alım fiyatı

1. Adım: Günlük Fiyat Çekme

En sık kullanılan uç GET /agriculture/prices’tır. Ürün, grup veya borsa ile daraltın; tarih vermezseniz son işlem günü döner.

cURL — hububat grubu

curl --request GET \
  --url "https://api.apibir.com/v1/agriculture/prices?group=hububat" \
  --header "authorization: apikey APIBIR-8f2c...9d41" \
  --header "accept: application/json"

cURL — ekmeklik buğday, Konya

curl --request GET \
  --url "https://api.apibir.com/v1/agriculture/prices?product=bugday-ekmeklik&exchange=konya-tb" \
  --header "authorization: apikey APIBIR-8f2c...9d41" \
  --header "accept: application/json"

Node.js (fetch)

async function tarimFiyatlari(params = {}) {
  const url = new URL("https://api.apibir.com/v1/agriculture/prices");
  for (const [k, v] of Object.entries(params)) {
    if (v != null && v !== "") url.searchParams.set(k, String(v));
  }
  const res = await fetch(url, {
    headers: { authorization: `apikey ${process.env.APIBIR_KEY}` }
  });
  if (!res.ok) throw new Error(`apibir ${res.status}`);
  const body = await res.json();
  return { date: body.date, rows: body.data, creditsRemaining: body.creditsRemaining };
}

const hububat = await tarimFiyatlari({ group: "hububat" });
const bugday = await tarimFiyatlari({
  product: "bugday-ekmeklik",
  exchange: "konya-tb",
});
console.log(hububat.date, hububat.rows?.length);
console.log(bugday.rows?.[0]?.average, bugday.rows?.[0]?.tmoPrice);

Python

import os, requests

HEADERS = {"authorization": f"apikey {os.environ['APIBIR_KEY']}"}
BASE = "https://api.apibir.com/v1"

def agriculture_prices(**params):
    r = requests.get(
        f"{BASE}/agriculture/prices",
        params={k: v for k, v in params.items() if v is not None},
        headers=HEADERS,
        timeout=15,
    )
    r.raise_for_status()
    body = r.json()
    return body.get("date"), body["data"]

date, rows = agriculture_prices(group="hububat")
print(date, len(rows))

date, bugday = agriculture_prices(product="bugday-ekmeklik", exchange="konya-tb")
if bugday:
    print(bugday[0]["average"], bugday[0].get("tmoPrice"), bugday[0]["changePercent"])

Örnek yanıt (ürün sayfasındaki şemaya uygun, illüstratif):

{
  "success": true,
  "creditsUsed": 1,
  "date": "2026-08-06",
  "data": [
    {
      "product": "Ekmeklik Buğday",
      "productCode": "bugday-ekmeklik",
      "group": "hububat",
      "exchange": "Konya Ticaret Borsası",
      "city": "Konya",
      "unit": "TL/kg",
      "min": 11.15,
      "max": 12.40,
      "average": 11.78,
      "previousAverage": 11.62,
      "changePercent": 1.38,
      "volumeKg": 4128500,
      "tmoPrice": 11.90
    },
    {
      "product": "Ayçiçeği (Yağlık)",
      "productCode": "aycicegi-yaglik",
      "group": "yagli-tohum",
      "exchange": "Edirne Ticaret Borsası",
      "city": "Edirne",
      "unit": "TL/kg",
      "min": 19.80,
      "max": 22.10,
      "average": 20.95,
      "previousAverage": 21.30,
      "changePercent": -1.64,
      "volumeKg": 962300
    }
  ]
}

Maliyet motorunda genelde average kullanılır; TMO tabanı veya üst bant senaryosu için tmoPrice / max ile çapraz kontrol edin. Hacim (volumeKg) düşükse “ince seans” uyarısı göstermek panoyu daha güvenilir kılar.

2. Adım: Ürün Sözlüğü ve Borsa Listesi

UI’de sabit string tutmak yerine önce sözlükleri çekin; productCode ve borsa kodunu kendi veritabanınızda anahtar olarak saklayın.

curl --request GET \
  --url "https://api.apibir.com/v1/agriculture/products" \
  --header "authorization: apikey APIBIR-8f2c...9d41"

curl --request GET \
  --url "https://api.apibir.com/v1/agriculture/exchanges" \
  --header "authorization: apikey APIBIR-8f2c...9d41"
async function urunSozlugu() {
  const res = await fetch("https://api.apibir.com/v1/agriculture/products", {
    headers: { authorization: `apikey ${process.env.APIBIR_KEY}` }
  });
  if (!res.ok) throw new Error(`apibir ${res.status}`);
  const { data } = await res.json();
  return data; // productCode, name, group, qualityClass ...
}

async function borsaListesi() {
  const res = await fetch("https://api.apibir.com/v1/agriculture/exchanges", {
    headers: { authorization: `apikey ${process.env.APIBIR_KEY}` }
  });
  if (!res.ok) throw new Error(`apibir ${res.status}`);
  const { data } = await res.json();
  return data; // code, name, city ...
}

const products = await urunSozlugu();
const exchanges = await borsaListesi();
console.log(products.length, exchanges.length);
def products():
    r = requests.get(f"{BASE}/agriculture/products", headers=HEADERS, timeout=15)
    r.raise_for_status()
    return r.json()["data"]

def exchanges():
    r = requests.get(f"{BASE}/agriculture/exchanges", headers=HEADERS, timeout=15)
    r.raise_for_status()
    return r.json()["data"]

print(len(products()), len(exchanges()))

Sözlükleri günde bir kez (veya sürüm hash’i değişince) önbelleğe alın; her kullanıcı isteğinde tekrar çekmek gereksiz kredi tüketir. Fiyat poll’unda yalnızca /agriculture/prices çağırın.

3. Adım: Geçmiş Fiyat Serisi

Trend, volatilite ve alarm eşiği için GET /agriculture/history kullanılır. Ürün kodu zorunlu düşünün; tarih aralığını dokümantasyondaki parametrelerle daraltın.

curl --request GET \
  --url "https://api.apibir.com/v1/agriculture/history?product=bugday-ekmeklik&exchange=konya-tb" \
  --header "authorization: apikey APIBIR-8f2c...9d41"
async function fiyatGecmisi(product, extra = {}) {
  const url = new URL("https://api.apibir.com/v1/agriculture/history");
  url.searchParams.set("product", product);
  for (const [k, v] of Object.entries(extra)) {
    if (v != null) url.searchParams.set(k, String(v));
  }
  const res = await fetch(url, {
    headers: { authorization: `apikey ${process.env.APIBIR_KEY}` }
  });
  if (!res.ok) throw new Error(`apibir ${res.status}`);
  const { data } = await res.json();
  return data; // [{ date, average, min, max, volumeKg, ... }, ...]
}

const seri = await fiyatGecmisi("bugday-ekmeklik", { exchange: "konya-tb" });
const son = seri?.[seri.length - 1];
console.log(son?.date, son?.average);
def agriculture_history(product, **params):
    q = {"product": product, **params}
    r = requests.get(
        f"{BASE}/agriculture/history",
        params=q,
        headers=HEADERS,
        timeout=15,
    )
    r.raise_for_status()
    return r.json()["data"]

seri = agriculture_history("aycicegi-yaglik", exchange="edirne-tb")
print(seri[-1] if seri else None)

Maliyet bütçesinde “son 20 işlem günü ortalaması + %X tampon” kuralını history üzerinden hesaplayın; tek günlük spike’ı doğrudan satış fiyatına yansıtmayın.

4. Adım: Pratik Senaryolar

Tarım kooperatifi panosu

Üyelere aynı ürünün bölgesel borsa karşılaştırmasını gösterin; en yüksek ortalama + yeterli hacimli borsayı “önerilen satış” olarak işaretleyin.

async function borsaKarsilastir(productCode) {
  const { date, rows } = await tarimFiyatlari({ product: productCode });
  const sorted = [...(rows || [])].sort((a, b) => (b.average || 0) - (a.average || 0));
  return {
    date,
    product: productCode,
    best: sorted[0],
    table: sorted.map((r) => ({
      exchange: r.exchange,
      city: r.city,
      average: r.average,
      volumeKg: r.volumeKg,
      changePercent: r.changePercent,
      tmoPrice: r.tmoPrice ?? null,
    })),
  };
}

Un / yağ hammadde maliyet motoru

def un_maliyet_kg(bugday_ortalama_tl_kg, randiman=0.75, ek_maliyet=0.40):
    """Basit un maliyeti: 1 kg un için gereken buğday + sabit ek."""
    # randiman: 1 kg buğdaydan çıkan un oranı (örnek)
    bugday_girdi = 1.0 / randiman
    return bugday_girdi * bugday_ortalama_tl_kg + ek_maliyet

def yag_maliyet_senaryo(aycicegi_ortalama, randiman=0.40):
    return (1.0 / randiman) * aycicegi_ortalama

_, bugday = agriculture_prices(product="bugday-ekmeklik", exchange="konya-tb")
_, aycicegi = agriculture_prices(product="aycicegi-yaglik", group="yagli-tohum")
if bugday:
    print("Un maliyet (örnek):", round(un_maliyet_kg(bugday[0]["average"]), 4))
if aycicegi:
    print("Yağ maliyet (örnek):", round(yag_maliyet_senaryo(aycicegi[0]["average"]), 4))

Üretim reçetenizdeki randıman ve fire katsayılarını kendi ERP’nizden okuyun; API yalnızca hammadde birim fiyatını sağlar.

Çiftçi mobil alarmı

async function fiyatAlarmKur(productCode, minAverage, exchange) {
  const { date, rows } = await tarimFiyatlari({ product: productCode, exchange });
  const row = rows?.[0];
  if (!row) return { triggered: false, reason: "no_data", date };
  const triggered = Number(row.average) >= Number(minAverage);
  return {
    triggered,
    date,
    average: row.average,
    threshold: minAverage,
    changePercent: row.changePercent,
    message: triggered
      ? `${row.product} ${row.average} TL/kg — eşik aşıldı`
      : `${row.product} ${row.average} TL/kg — eşik altında`,
  };
}

Tarımsal kredi ve sigorta

Rekolte varsayımı × beklenen satış fiyatı ile teminat değeri güncelleyin; changePercent ve history volatilitesi prim/teminat buffer’ına girdi olsun. TMO fiyatı varsa “taban senaryo”, borsa ortalaması “piyasa senaryosu” olarak iki kolon tutun.

5. Adım: Hal Fiyatları ve Döviz ile Birlikte Kullanım

Gıda e-ticaret veya entegre gıda üreticisi panosunda üç katman sık bir arada durur:

  • Tarımsal Ürün Fiyatları API — hububat / yağlı tohum / ELÜS–TMO (bu yazı).
  • Hal Fiyatları API — sebze/meyve toptancı hali; taze ürün alış maliyeti.
  • Döviz Kurları / Geçmiş Kur API — ithal yağlı tohum veya ambalaj USD/EUR maliyeti; fatura günü kuru.
def gida_maliyet_karti(bugday_fn, hal_fn, fx_fn, vade_tarihi):
    """Hububat + hali taze ürün + kur katmanı (şema örneği)."""
    bugday = bugday_fn()  # /agriculture/prices
    domates = hal_fn("domates")  # Hal Fiyatları — ayrı servis
    kur = fx_fn(vade_tarihi)  # geçmiş döviz
    return {
        "hububatAverage": bugday["average"],
        "tmoPrice": bugday.get("tmoPrice"),
        "halDomates": domates.get("average"),
        "usdTry": kur.get("selling"),
    }

Ürün kuralınızı “ELÜS/TMO hububat + hali taze + kur” üçlüsü olarak yazın; tek kaynağa güvenmek yerine çapraz kontrol operasyon ve denetimde işe yarar. İnce kart seviyesindeki Tarımsal Ürün Fiyatları özetinin entegrasyon derinliği bu rehberdedir — ürün sayfası: apibir.com/apis/tarimsal-urun-fiyatlari.

Sık Yapılan Entegrasyon Hataları

Hata Sonucu Doğrusu
Hal fiyatı ile hububat fiyatını aynı uçta aramak Yanlış ürün / boş sonuç. Hububat–ELÜS–TMO için /agriculture/*; sebze/meyve için Hal Fiyatları.
İl ticaret borsası sitesini kazımak HTML kırılınca üretim düşer. Lisanslı API kullanın; kazıma bu ürünün kapsamı değildir.
Görünen adı (product) anahtar yapmak İsim değişince join bozulur. productCode ve borsa kodunu saklayın.
Her UI tıklamasında sözlük çekmek Gereksiz kredi tüketimi. /products ve /exchanges önbelleğe alın; poll’da yalnızca /prices.
Seans bitmeden “canlı” varsaymak Eksik veya önceki gün verisi. Güncelleme günlük (borsa seansı sonrası); date alanını panoda gösterin.
Tek günlük spike’ı doğrudan maliyete yazmak Fiyat şoku / yanlış marj. /history ile kayan ortalama + tampon kullanın.
tmoPrice yokken hata saymak Gereksiz alarm. Alan opsiyoneldir; yoksa yalnızca borsa ortalamasını kullanın.

Sık Sorulan Sorular

Veriler nereden geliyor?

TÜRİB ELÜS piyasası gecikmeli verisi ve TMO’nun yayımladığı bülten fiyatları. İl ticaret borsası sitelerinden kazıma yapılmaz. Lisans paketi açıldıktan sonra uçlar JSON döner.

Hal Fiyatları ile farkı nedir?

Hal Fiyatları sebze/meyve toptancı hali odaklıdır. Tarımsal Ürün Fiyatları hububat, yağlı tohum ve ticaret borsası / ELÜS / TMO göstergelerine odaklanır. Gıda panosunda ikisini ayrı katman tutun.

Ne sıklıkla güncellenir?

Günlük — tipik olarak borsa seansı sonrası. date alanı hangi işlem gününe ait olduğunu gösterir; panoda “son seans: …” etiketi kullanın.

Ücretsiz planda yeterli mi?

Ücretsiz plan yaklaşık 100 kredi/ay ile geliştirme, staging ve düşük frekanslı cron’lar için uygundur. Yoğun panolarda sözlükleri önbelleğe alıp yalnızca fiyat uçlarını poll edin. Başarılı istek 1 kredi; 4xx kredi düşürmez.

Kod yazmadan takip edebilir miyim?

Evet. apibir’in WhatsApp veya e-posta günlük raporları hububat / yağlı tohum özetini kodsuz iletebilir. Kapsam için hizmetler sayfasına bakın.

Hata kodları kredi düşürür mü?

4xx istemci hataları tipik olarak kredi düşürmez; başarılı 2xx yanıtlar creditsUsed ile düşer. Anahtarınızı APIBIR-8f2c...9d41 biçiminde maskeleyin; üretimde process.env.APIBIR_KEY / os.environ['APIBIR_KEY'] kullanın. Sık kodlar: invalid_api_key (401), insufficient_credits (402), invalid_parameter (422), no_data (404), rate_limited (429).

Başlamak için: Ücretsiz API anahtarı ile /agriculture/prices?group=hububat ve /agriculture/history uçlarını deneyin. Kooperatif panosu, un/yağ hammadde maliyeti, çiftçi alarmı ve kredi/sigorta senaryoları aynı entegrasyon deseniyle çözülür. Uç noktaların tamamı Tarımsal Ürün Fiyatları API kapsamında; kimlik doğrulama ve hata kodları dokümantasyonda yer alır. Ücretsiz plan ~100 kredi/ay ile deneme için yeterlidir — apibir.com üzerinden anahtar alın ve ilk hububat fiyat sorgunuzu bugün çalıştırın.

← Tüm Blog Yazılarına Dön Ücretsiz API Anahtarı Al