İçeriğe geç
API v1

Efespay API ile ödeme alın.

Tek bir REST API ile ödeme oturumu açın, sonucu imzalı webhook ile alın, iade ve iptali aynı kayıt üzerinden yapın. Bu sayfa entegrasyon için ihtiyacınız olanı tek yerde toplar.

API ve test ortamı pilot öncesi hazırlık aşamasındadır. Canlı mod, işletme başvurusu onaylanınca açılır.

Hızlı başlangıç

Üç adımda ilk test ödemesi: anahtar alın, oturum açın, sonucu doğrulayın.

API tabanı: https://api.efespay.com/v1

  1. 1. Test anahtarı alın

    Panelde Geliştirici → API anahtarları ekranından gizli test anahtarı oluşturun. Anahtar efp_test_sk_ ile başlar ve yalnız bir kez gösterilir; sunucunuzda ortam değişkeni olarak saklayın.

  2. 2. Ödeme oturumu açın

    Tutarı kuruş olarak (amount_minor: 125000 = 1.250,00 TL) ve sipariş referansınızla gönderin. Yanıttaki url adresine müşteriyi yönlendirin.

    Ödeme oturumu oluştur
    curl https://api.efespay.com/v1/payment-sessions \
      -H "Authorization: Bearer $EFESPAY_SECRET_KEY" \
      -H "Idempotency-Key: order-1001" \
      -H "Content-Type: application/json" \
      -d '{
        "order_reference": "ORDER-1001",
        "amount_minor": 125000,
        "currency": "TRY",
        "installment_options": [1, 3, 6],
        "return_url": "https://shop.example.com/order/1001"
      }'
  3. 3. Sonucu doğrulayın

    Müşterinin sitenize dönmesi ödeme kanıtı değildir. Siparişi teslim etmeden önce GET /v1/payments/{id} ile ya da webhook ile doğrulanmış durumu okuyun.

    Ödemeyi sorgula
    curl https://api.efespay.com/v1/payments/pay_… \
      -H "Authorization: Bearer $EFESPAY_SECRET_KEY"

Kimlik doğrulama

Her istek Authorization başlığında bir API anahtarı taşır. İşletme ve mod anahtardan gelir.

Anahtarı doğrula
curl https://api.efespay.com/v1 \
  -H "Authorization: Bearer $EFESPAY_SECRET_KEY"
API anahtarı türleri
ÖnekAnlamı
efp_test_sk_…Test modu, gizli anahtar: bütün kapsamlar
efp_live_sk_…Canlı mod, gizli anahtar: bütün kapsamlar (başvuru onayından sonra)
efp_test_rk_…Test modu, kısıtlı anahtar: yalnız seçilen kapsamlar
efp_live_rk_…Canlı mod, kısıtlı anahtar: yalnız seçilen kapsamlar
  • Anahtar yalnız sunucuda kullanılır; tarayıcıya ya da mobil uygulamaya konmaz.
  • İstek başka bir işletme belirtemez: işletme ve mod (test | live) anahtardan gelir.
  • Anahtar başına dakikada 600 istek; aşılırsa 429 rate_limited ve Retry-After başlığı.
  • Her yanıt Efespay-Request-Id: req_… taşır; destek talebinde bu kimliği paylaşın.
  • Hata mesajları Accept-Language başlığına göre Türkçe ya da İngilizce döner.
Kısıtlı anahtar kapsamları
KapsamAnlamı
payment_sessions:writeÖdeme oturumu oluşturma
payment_sessions:readÖdeme oturumunu okuma
payments:readÖdemeleri, denemeleri ve iadeleri okuma
payments:refundİade başlatma
payments:cancelİptal
payment_links:readÖdeme linklerini ve QR'ı okuma
payment_links:writeÖdeme linki oluşturma ve kapatma
provider_connections:readBağlantıları okuma (kimlik bilgisi olmadan)
webhook_endpoints:readWebhook uç noktalarını okuma
webhook_endpoints:writeWebhook uç noktası oluşturma, değiştirme, test olayı
refund_requests:writeİade talebi açma ve izleme (MCP); iade yapma yetkisi değildir
payments:chargeKayıtlı karttan tahsilat (müşteri yokken; Idempotency-Key zorunlu)
payment_methods:readKayıtlı kartları görüntüleme (token yok; yalnız son 4 ve son kullanma)
payment_methods:writeKayıtlı kart silme
subscriptions:readAbonelikleri görüntüleme
subscriptions:writeAbonelik açma, kart değiştirme, duraklatma ve iptal
sub_merchants:readAlt üye işyerlerini okuma (IBAN ve kimlik numaraları maskeli)
sub_merchants:writeAlt üye işyeri ekleme ve güncelleme (sağlayıcıya kayıt dahil)

Ödeme oturumu

Ödeme oturumu, müşteriye ödeme sayfasını açan istektir. Sipariş başına bir ödeme kaydı oluşur.

Ödeme oturumu alanları
AlanZorunluAçıklama
order_referenceZorunluSipariş referansınız. Aynı referansla ikinci açık ya da başarılı ödeme açılmaz.
amount_minorZorunluTutar, kuruş cinsinden tamsayı (125000 = 1.250,00 TL).
currencyİsteğe bağlıPara birimi; bugün yalnız TRY (varsayılan).
descriptionİsteğe bağlıÖdeme sayfasında görünen açıklama.
installment_optionsİsteğe bağlıSunulan taksit sayıları, 1–12 (ör. [1, 3, 6]). Yanıtta her seçeneğin toplamı ve vade farkı döner.
customerİsteğe bağlıname, email, phone, external_reference. Dış referans müşteriyi panelde eşleştirir.
return_urlİsteğe bağlıÖdemeden sonra müşterinin döneceği adres; izinli adresler listesinde olmalı.
expires_in_minutesİsteğe bağlıOturumun süresi, 5–10080 dakika (varsayılan 60).
metadataİsteğe bağlıEn çok 20 anahtarlı serbest bilgi; ödemede ve olaylarda geri döner.
localeİsteğe bağlıÖdeme sayfasının dili: tr ya da en.
Yanıt: payment_session (201)
{
  "id": "ps_…",
  "object": "payment_session",
  "status": "open",
  "url": "https://efespay.com/pay/ps_…",
  "payment_id": "pay_…",
  "amount_minor": 125000,
  "installment_options": [
    { "installments": 1, "total_minor": 125000, "fee_minor": 0, "monthly_minor": 125000 },
    { "installments": 3, "total_minor": 129875, "fee_minor": 4875, "monthly_minor": 43292 }
  ],
  "expires_at": "2026-10-25T11:00:00.000Z"
}
  • Yazma isteklerine Idempotency-Key ekleyin (≤ 255 karakter). Aynı anahtar ve aynı gövde 24 saat içinde kayıtlı yanıtı döndürür (Idempotent-Replayed: true).
  • Aynı anahtarla farklı gövde 409 idempotency_conflict; ilk istek sürüyorsa 409 idempotency_in_progress.
  • 5xx yanıtı saklanmaz; aynı anahtarla yeniden deneyebilirsiniz.
  • Anahtar farklı olsa da aynı sipariş için ikinci açık oturum açılmaz (409 order_reference_in_use).

Ödeme durumları

Ödeme durumları
DurumAçıklama
pendingOturum açık, müşteri henüz ödemeye geçmedi.
processingMüşteri sağlayıcı sayfasında; sonuç bekleniyor.
uncertainSağlayıcıdan kesin sonuç alınamadı (ör. zaman aşımı). Başarısız sayılmaz; Efespay sağlayıcıyı sorgular.
failedDeneme başarısız. Müşteri aynı oturumda yeniden deneyebilir (hata kodu izin veriyorsa).
succeededÖdeme sağlayıcıdan doğrulandı. Siparişi teslim edebilirsiniz.
cancelledÖdeme iptal edildi (oturum kapatıldı ya da başarılı ödeme void edildi).
expiredOturumun süresi doldu; ödeme alınmadı.

Tarayıcı dönüşü (return_url) tek başına ödeme kanıtı değildir. Siparişi webhook ile ya da GET /v1/payments/{id} yanıtındaki doğrulanmış duruma göre güncelleyin.

Webhook doğrulama

Ödeme, iade ve link olayları sunucunuza imzalı POST isteğiyle gelir. Gövdeyi işlemeden önce imzayı doğrulayın.

İstek başlıkları
POST https://shop.example.com/webhooks/efespay
Content-Type: application/json
User-Agent: Efespay-Webhooks/1.0
Efespay-Event-Id: evt_…
Efespay-Event-Type: payment.succeeded
Efespay-Signature: t=1792922400,v1=5f2c…
Gövde
{
  "id": "evt_…",
  "object": "event",
  "type": "payment.succeeded",
  "created_at": "2026-10-25T10:00:00.000Z",
  "mode": "test",
  "data": {
    "object": {
      "id": "pay_…",
      "object": "payment",
      "status": "succeeded",
      "amount_minor": 125000,
      "order_reference": "ORDER-1001"
    }
  }
}

Efespay-Signature başlığındaki t ve v1 değerlerini okuyun. HMAC_SHA256(secret, t + "." + ham_gövde) değerini hex olarak hesaplayıp v1 ile sabit zamanlı karşılaştırın. t 5 dakikadan eskiyse isteği reddedin. Gövdeyi ayrıştırmadan önce ham hâliyle doğrulayın.

İmza doğrulama (Node.js)
import crypto from "node:crypto";

export function verifyEfespaySignature(rawBody, header, secret) {
  const parts = Object.fromEntries(header.split(",").map((p) => p.split("=")));
  const expected = crypto.createHmac("sha256", secret).update(`${parts.t}.${rawBody}`).digest("hex");
  const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300;
  const a = Buffer.from(expected);
  const b = Buffer.from(parts.v1 || "");
  return fresh && a.length === b.length && crypto.timingSafeEqual(a, b);
}

// Express: app.post("/webhooks/efespay", express.raw({ type: "application/json" }), (req, res) => {
//   if (!verifyEfespaySignature(req.body.toString("utf8"), req.get("Efespay-Signature"), process.env.EFESPAY_WEBHOOK_SECRET)) return res.sendStatus(400);
//   const event = JSON.parse(req.body); // deduplicate by event.id
//   res.sendStatus(200);
// });
  • Uç noktanız 10 saniye içinde 2xx dönmelidir; yönlendirmeler (3xx) izlenmez.
  • Başarısız teslimat 1 dk, 5 dk, 30 dk, 2 sa, 6 sa, 12 sa, 24 sa sonra yeniden denenir (toplam 8 deneme).
  • 3 gün boyunca hiç başarılı teslim olmazsa uç noktası kapanır; işletme sahibine e-posta gider.
  • Aynı olay birden çok kez gelebilir: Efespay-Event-Id ile tekilleştirin, eski bir olayla durumu geri almayın.
  • İmza sırrı (whsec_…) yalnız uç noktası oluşturulurken ve yenilenirken bir kez gösterilir.
Olay türleri
OlayNe zaman
payment.authorizedÖn provizyon onaylandı: tutar kartta ayrıldı, tahsil edilmedi.
payment.capturedProvizyon tahsil edildi (tamamı ya da kısmi).
payment.succeededÖdeme sağlayıcıdan doğrulandı.
payment.failedDeneme başarısız oldu.
payment.uncertainSonuç kesinleşmedi; doğrulama sürüyor.
payment.cancelledÖdeme iptal edildi.
payment.expiredOturumun süresi doldu.
refund.succeededİade tamamlandı.
refund.failedİade başarısız oldu.
refund.uncertainİade sonucu kesinleşmedi.
payment_link.completedÖdeme linki kullanım sınırına ulaştı.
refund_request.createdAI ajanı iade talebi açtı (onay bekliyor).
refund_request.approvedİade talebi onaylandı; iade başlatıldı.
refund_request.rejectedİade talebi reddedildi.
refund_request.expiredİade talebi 7 gün içinde karara bağlanmadı.
payment_method.createdMüşteri onayıyla kart kaydedildi.
payment_method.expiredKayıtlı kartın süresi doldu ya da sağlayıcı anahtarı geçersiz.
payment_method.deletedKayıtlı kart silindi.
subscription.createdAbonelik açıldı.
subscription.past_dueDönem tahsilatı başarısız; yeniden denenecek.
subscription.pausedAbonelik duraklatıldı.
subscription.resumedAbonelik devam ettirildi.
subscription.cancelledAbonelik iptal edildi (işletme ya da son deneme).
subscription.endedAbonelik tüm tahsilatlarını tamamladı.
payment_item.approvedPazaryeri kalemi onaylandı; satıcı payı sağlayıcının takviminde satıcıya ödenir.
payment_item.disapprovedPazaryeri kalemi onaylanmadı ya da onay geri çekildi; satıcı payı tutuluyor.
pingPanelden ya da API'den gönderilen test olayı (yalnız o uç noktasına).

Hata kodları

API hataları tek biçimde döner; ödeme sonucu hataları ayrı bir sözlükle bildirilir.

Hata yanıtı
{
  "error": {
    "code": "order_reference_in_use",
    "message": "Bu sipariş referansıyla açık bir ödeme var.",
    "request_id": "req_…",
    "param": "order_reference"
  }
}
API hata kodları
HTTPKodAnlamı
400invalid_order_referenceSipariş referansı eksik ya da geçersiz.
400invalid_amountTutar geçersiz (kuruş cinsinden pozitif tamsayı olmalı).
400unsupported_currencyPara birimi desteklenmiyor.
400return_url_not_allowedDönüş adresi izinli adresler listesinde değil.
400invalid_metadataMetadata geçersiz (en çok 20 anahtar, metin değerler).
400invalid_idempotency_keyIdempotency-Key geçersiz.
400invalid_cursorstarting_after imleci geçersiz.
400idempotency_key_requiredBu istek Idempotency-Key başlığı ister.
401authentication_requiredAuthorization başlığı yok.
401invalid_api_keyAPI anahtarı geçersiz.
401api_key_revokedAPI anahtarı iptal edilmiş.
403insufficient_scopeKısıtlı anahtar bu işlemin kapsamını taşımıyor (required_scope).
403merchant_suspendedİşletme hesabı askıya alınmış.
403live_mode_not_approvedCanlı mod için işletme başvurusu henüz onaylanmadı.
403risk_blockedİşletmenin risk kuralı oturumu engelledi.
404payment_not_foundÖdeme bulunamadı.
404session_not_foundÖdeme oturumu bulunamadı.
404payment_method_not_foundKayıtlı kart bulunamadı.
404subscription_not_foundAbonelik bulunamadı.
404api_not_foundBöyle bir uç yok.
409order_reference_in_useBu sipariş referansıyla açık ya da başarılı bir ödeme var.
409idempotency_conflictAynı Idempotency-Key farklı bir gövdeyle kullanıldı.
409idempotency_in_progressAynı anahtarlı ilk istek hâlâ işleniyor.
409payment_not_refundableÖdeme iade edilebilir durumda değil.
409refund_exceeds_availableİade tutarı iade edilebilir tutarı aşıyor.
409payment_in_progressÖdeme sürüyor; sonuç kesinleşmeden işlem yapılamaz.
409cancel_not_supportedSağlayıcı bu ödeme için iptali desteklemiyor; iade yapın.
409payment_method_inactiveKayıtlı kart kullanılamıyor (süresi dolmuş ya da silinmiş).
409payment_method_in_useKart etkin bir abonelikte kullanılıyor; önce aboneliğin kartını değiştirin.
429rate_limitedÇok fazla istek; Retry-After süresi kadar bekleyin.
500internal_errorBeklenmeyen hata. request_id ile destek talebi açın.

Ödeme sonucu hata kodları

Başarısız ödemede failure.code aşağıdaki kodlardan biridir; sağlayıcının ham kodu müşteriye gösterilmez, panelde işlem detayında yer alır. Teknik kodlar sağlayıcı kaynaklıdır ve kart reddinden ayrı sayılır.

Ödeme sonucu hata kodları
KodAnlamıYeniden denenebilirTeknik
card_declinedKart bankası işlemi reddetti.EvetHayır
insufficient_fundsKart limiti ya da bakiye yetersiz.EvetHayır
expired_cardKartın son kullanma tarihi geçmiş.EvetHayır
invalid_cardKart bilgisi geçersiz.EvetHayır
incorrect_cvcGüvenlik kodu hatalı.EvetHayır
three_ds_failed3D Secure doğrulaması başarısız.EvetHayır
fraud_suspectedBanka işlemi şüpheli buldu.HayırHayır
not_permittedKart bu işleme kapalı (ör. internet alışverişi).EvetHayır
limit_exceededİşlem limiti aşıldı.EvetHayır
installment_not_allowedBu karta seçilen taksit yapılamıyor.EvetHayır
foreign_card_not_allowedYabancı kartla işlem kabul edilmiyor.EvetHayır
cancelled_by_customerMüşteri ödemeden vazgeçti.EvetHayır
session_expiredOturumun süresi doldu.HayırHayır
provider_unavailableSağlayıcıya ulaşılamadı.EvetEvet
provider_timeoutSağlayıcı zamanında yanıt vermedi.EvetEvet
provider_rejectedSağlayıcı isteği reddetti.EvetEvet
authentication_failedBağlantının kimlik bilgileri geçersiz.HayırEvet
processing_errorSağlayıcıda işlem hatası.EvetEvet
risk_blockedİşletmenin risk kuralı ödemeyi sağlayıcıya göndermeden durdurdu.HayırHayır

Test kartları

Efespay test sağlayıcısı test modunda her hesapta hazırdır. Her kart bir senaryoyu tetikler; gerçek para hareketi olmaz.

Test kartları
Kart numarasıSenaryoKart
4242 4242 4242 4242Başarılı ödemeVisa · Kredi kartı
5555 5555 5555 4444Başarılı ödemeMastercard · Banka kartı
4000 0000 0000 0002Kart reddiVisa · Kredi kartı
4000 0000 0000 9995Yetersiz bakiyeVisa · Kredi kartı
4000 0000 0000 32203D Secure başarısızVisa · Kredi kartı
4000 0000 0000 0119Zaman aşımı, sonra başarılı (doğrulanıyor → başarılı)Visa · Kredi kartı
4000 0000 0000 0127Zaman aşımı, sonra red (doğrulanıyor → başarısız)Visa · Kredi kartı
  • Test kartları yalnız test modunda ve Efespay test sağlayıcısıyla çalışır.
  • Test sağlayıcısının sayfasında kart numarası girilmez; seçtiğiniz senaryo sunucuya gider.
  • Zaman aşımı senaryoları belirsiz sonucu ve uzlaştırmayı denemeniz içindir.
  • Test olayları da webhook olarak gelir; canlıya geçmeden doğrulama kodunuzu deneyin.

API referansı

Bütün uçlar, alanlar ve örnekler OpenAPI belgesinde. Referans backend'de yayımlanır ve API ile birlikte güncellenir.

Uçların özeti
UçKapsamİşlev
GET/v1Her anahtarAnahtarı ve modu doğrular.
POST/v1/payment-sessionspayment_sessions:writeÖdeme oturumu oluşturur.
GET/v1/payment-sessions/{id}payment_sessions:readOturumu okur.
GET/v1/paymentspayments:readÖdemeleri listeler (durum, sipariş referansı, tarih süzgeci).
GET/v1/payments/{id}payments:readDoğrulanmış ödeme durumunu döndürür.
GET/v1/payments/{id}/attemptspayments:readDenemeleri yönlendirme gerekçesiyle döndürür.
POST/v1/payments/{id}/refundspayments:refundTam ya da kısmi iade başlatır.
POST/v1/payments/{id}/cancelpayments:cancelÖdemeyi iptal eder (sağlayıcı destekliyorsa).
POST/v1/paymentspayments:chargeKayıtlı karttan tahsilat yapar (Idempotency-Key zorunlu).
GET/v1/payment-methodspayment_methods:readMüşterinin kayıtlı kartlarını listeler.
DELETE/v1/payment-methods/{id}payment_methods:writeKayıtlı kartı siler.
POST/v1/subscriptionssubscriptions:writeKayıtlı kartla tekrarlı ödeme aboneliği açar.
GET/v1/subscriptions/{id}subscriptions:readAboneliği ve sıradaki tahsilatı döndürür.
POST/v1/subscriptions/{id}/cancelsubscriptions:writeAboneliği iptal eder.
POST/v1/sub_merchantssub_merchants:writePazaryeri satıcısı (alt üye işyeri) ekler ve pazaryeri destekleyen bağlantılara kaydeder.
GET/v1/sub_merchantssub_merchants:readAlt üye işyerlerini listeler (IBAN ve kimlik numaraları maskeli).
POST/v1/payments/{id}/items/{item_id}/approvepayments:refundPazaryeri kalemini onaylar; satıcı payı serbest kalır.
POST/v1/payments/{id}/items/{item_id}/disapprovepayments:refundPazaryeri kalemini onaylamaz ya da onayı geri çeker; satıcı payı tutulur.
GET/v1/provider-connectionsprovider_connections:readBağlantıları listeler (kimlik bilgisi olmadan).
POST/v1/payment-linkspayment_links:writeÖdeme linki oluşturur.
GET/v1/payment-links/{id}/qrpayment_links:readLinkin QR kodunu SVG olarak döndürür.
POST/v1/webhook-endpointswebhook_endpoints:writeWebhook uç noktası oluşturur; imza sırrı bir kez döner.
POST/v1/webhook-endpoints/{id}/testwebhook_endpoints:writeUç noktasına ping olayı gönderir.
POST/v1/mcpHer anahtarAI ajanları için MCP sunucusu: ödeme sorgusu, link oluşturma, iade talebi (iade yapmaz).

Entegrasyonu birlikte planlayalım.

Mevcut ödeme akışınızı ve teknik yapınızı anlatın; test ortamına erişimi ve pilot kapsamını birlikte belirleyelim.