← Ana Sayfa | Dashboard

API Dokümantasyonu

AuroraSky Payments REST API referansı. Tüm endpoint'ler, istek/yanıt şemaları, hata kodları ve webhook olayları.

Giriş

AuroraSky Payments API'si, Türkiye'den yurt dışına dijital ürün satan geliştiricilerin ödeme altyapısına erişmesini sağlar. API, REST mimarisine uygun tasarlanmıştır ve JSON formatında veri alıp verir.

Base URL

https://anch-payments-worker.aurorasky.workers.dev

Aşağıdaki örneklerde okunabilirlik için https://api.auroraskypayments.com kullanılmıştır. Bu alan adı henüz bağlanmadı — örnekleri denerken yukarıdaki gerçek adresle değiştirin.

⚠️ Geliştirme Aşaması

API henüz beta aşamasındadır. Endpoint'ler ve yanıt formatları lansmana kadar değişebilir. Canlı ödeme işlemi yapılmaz — şu an yalnızca test modunda çalışır.

Hızlı Başlangıç

  1. Hesap oluşturun — Dashboard üzerinden kayıt olun ve KYC doğrulamasını tamamlayın.
  2. API anahtarınızı alın — Dashboard → Ayarlar → API Anahtarları.
  3. İlk sipariş oluşturun — POST /orders ile Stripe Checkout oturumu başlatın.
  4. Webhook dinleyin — payment_intent.succeeded olayını işleyin.

Kimlik Doğrulama

Tüm sipariş endpoint'leri Authorization başlığında bir API anahtarı bekler. Anahtarı Dashboard → Ayarlar → API Anahtarları bölümünden oluşturursunuz. Anahtar yalnızca oluşturulduğu anda bir kez gösterilir; sunucumuzda yalnızca SHA-256 özeti saklanır, bu yüzden kaybedilen anahtar geri getirilemez — yenisini oluşturmanız gerekir.

Satıcı kimliği anahtardan çözülür. İsteklerinizde ayrıca merchant_id göndermenize gerek yoktur; gönderirseniz anahtarın sahibiyle eşleşmek zorundadır, aksi halde 403 alırsınız.

İstek Başlığı
Authorization: Bearer sk_live_••••••••mP7z
Content-Type: application/json

🔒 API Anahtarı Güvenliği

API anahtarınızı istemci tarafı kodunda (JavaScript, mobil uygulama) kullanmayın. Tüm API çağrıları sunucu tarafından yapılmalıdır. Anahtarınız sızarsa Dashboard'dan iptal edip yenisini oluşturabilirsiniz.

Idempotency

Para hareketi içeren tüm endpoint'ler Idempotency-Key başlığı zorunludur. Aynı key ile yapılan tekrar istekler aynı sonucu döner — ağ hatası nedeniyle çift ödeme oluşmaz.

Idempotency-Key Kullanımı
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
KuralAçıklama
FormatUUID v4 veya benzersiz herhangi bir string (maks. 255 karakter)
SüreAynı key ile 24 saat içinde tekrar istek yapılabilir
ÇakışmaFarklı parametrelerle aynı key gönderilirse 409 Conflict döner

POST /orders

Yeni bir sipariş başlatır ve Stripe Checkout oturumu oluşturur. Alıcıyı dönen checkout_url adresine yönlendirmeniz gerekir.

İstek Gövdesi

AlanTürZorunluAçıklama
merchant_id string — Opsiyonel. Satıcı kimliği API anahtarınızdan çözülür. Gönderirseniz anahtarın sahibiyle eşleşmelidir, aksi halde 403 döner.
amount_minor integer ✓ Satıcının belirlediği fiyat, minor unit cinsinden (kuruş/sent). Ör: $49,00 → 4900
currency string ✓ 3 harfli ISO 4217 kodu. Bkz. Desteklenen Para Birimleri
product_name string ✓ Ürün adı — checkout sayfasında alıcıya gösterilir
success_url string ✓ Ödeme başarılı olunca yönlendirilecek URL
cancel_url string ✓ Ödeme iptal edilince yönlendirilecek URL
merchant_order_ref string Satıcının kendi sipariş numarası (opsiyonel, webhook'ta geri döner)
buyer_country string Alıcının ülkesi — ISO 3166-1 alpha-2 (örn. DE). Opsiyonel: göndermezseniz ödeme sayfasında fatura adresinden alınır. Vergi oranı bu bilgiye göre belirlenir.

Başlıklar

BaşlıkZorunluAçıklama
Idempotency-Key ✓ Benzersiz istek anahtarı (UUID v4 önerilir)
Authorization ✓ Bearer sk_live_...
Content-Type ✓ application/json
POST Örnek İstek
curl -X POST https://api.auroraskypayments.com/orders \
  -H "Authorization: Bearer sk_live_••••mP7z" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "product_name": "Pro Lisans — Yıllık",
    "amount_minor": 4900,
    "currency": "USD",
    "success_url": "https://siteniz.com/odeme/tamamlandi",
    "cancel_url": "https://siteniz.com/odeme/iptal",
    "merchant_order_ref": "SIP-2026-0417"
  }'
201 Created — Yanıt
{
  "checkout_session_id": "cs_test_a1b2c3d4e5f6...",
  "checkout_url": "https://checkout.stripe.com/c/pay/cs_test_a1b2c3...",
  "pricing": {
    "seller_price_minor": 4900,
    "processing_fee_minor": 334,
    "buyer_total_minor": 5234,
    "platform_fee_minor": 295,
    "seller_payout_minor": 4605,
    "currency": "USD"
  }
}

Fiyatlandırma Alanları

AlanAçıklama
seller_price_minorSatıcının belirlediği fiyat
processing_fee_minorÖdeme altyapı ücreti (%6 + $0,40) — alıcıya yansıtılır
buyer_total_minorAlıcının ödeyeceği toplam tutar
platform_fee_minorAuroraSky komisyonu (%5 + $0,50) — satıcıdan kesilir
seller_payout_minorSatıcının alacağı net tutar

GET /orders/:id

Belirli bir siparişin detaylarını döner.

GET Örnek İstek
curl https://api.auroraskypayments.com/orders/d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a \
  -H "Authorization: Bearer sk_live_••••mP7z"
200 OK — Yanıt
{
  "id": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a",
  "merchant_id": "8f2ac41b-3e7d-4f12-9c8a-1b2d3e4f5a6b",
  "buyer_email": "alici@example.com",
  "amount_minor": 4900,
  "platform_fee_minor": 295,
  "processor_fee_minor": 177,
  "currency": "USD",
  "processor_type": "stripe",
  "status": "captured",
  "merchant_order_ref": "SIP-2026-0417",
  "payout_id": null,
  "created_at": "2026-09-03T14:22:00.000Z",
  "updated_at": "2026-09-03T14:22:01.000Z"
}

Sipariş Durumları

DurumAçıklama
capturedÖdeme alındı, işlem tamamlandı
refundedTam iade yapıldı
partially_refundedKısmi iade yapıldı
disputedChargeback/itiraz açıldı

GET /orders

API anahtarınızın sahibi olan satıcının siparişlerini listeler. Sayfalama ve durum filtreleme destekler. merchant_id query parametresi kabul edilmez — satıcı kimliği her zaman anahtardan çözülür, böylece başka bir satıcının siparişleri sorgulanamaz.

Query Parametreleri

ParametreTürZorunluAçıklama
status string Duruma göre filtre: captured, refunded, disputed
limit integer Sayfa başına kayıt (varsayılan: 50, maks: 100)
offset integer Atlama sayısı (sayfalama)
200 OK — Yanıt
{
  "orders": [
    {
      "id": "d4e5f6a7-...",
      "merchant_id": "8f2ac41b-...",
      "buyer_email": "alici@example.com",
      "amount_minor": 4900,
      "platform_fee_minor": 295,
      "processor_fee_minor": 177,
      "currency": "USD",
      "status": "captured",
      "merchant_order_ref": "SIP-2026-0417",
      "payout_id": null,
      "created_at": "2026-09-03T14:22:00.000Z"
    }
  ],
  "limit": 50,
  "offset": 0
}

POST /orders/:id/refund

Tahsil edilmiş bir siparişi iade eder. Tam veya kısmi iade desteklenir. Aynı sipariş için birden fazla kısmi iade yapılabilir; toplam iade tutarı sipariş tutarını aşamaz.

⚠️ Idempotency-Key zorunlu

İade bir para hareketidir. Idempotency-Key başlığı olmadan istek 400 ile reddedilir. Ağ hatası nedeniyle isteği tekrarlarsanız aynı anahtar ikinci bir iade oluşturmaz — ilk iadenin sonucu döner.

İstek Gövdesi

AlanTürZorunluAçıklama
amount_minor integer — Kısmi iade tutarı (minor unit). Gönderilmezse kalan tutarın tamamı iade edilir.
reason string — duplicate, fraudulent veya requested_by_customer. Başka bir değer 400 döner.
Kısmi iade örneği
curl -X POST https://api.auroraskypayments.com/orders/d4e5f6a7-.../refund \
  -H "Authorization: Bearer sk_live_..." \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "amount_minor": 2500,
    "reason": "requested_by_customer"
  }'
201 Created — Yanıt
{
  "refund_id": "8a2b1c4d-...",
  "processor_refund_id": "re_3Nk2...",
  "amount_minor": 2500,
  "currency": "USD",
  "platform_fee_refunded_minor": 137,
  "processor_fee_refunded_minor": 82,
  "order_refunded_total_minor": 2500,
  "order_status": "captured",
  "fully_refunded": false
}

Komisyon iadesi

Kısmi iadede komisyon da orantılı geri verilir. $100'lık siparişten $25 iade ederseniz komisyonun dörtte biri de iade edilir. Aksi halde tam iade sonrası platform kâr etmiş olurdu — bu muhasebeyi bozar. Yuvarlama farkı her zaman satıcı lehine çözülür.

Durum kodları

KodAnlamı
400Idempotency-Key eksik, tutar geçersiz veya sebep tanınmıyor
404Sipariş bulunamadı (başka satıcıya aitse de 404 döner)
409Sipariş zaten tamamen iade edilmiş
422Sipariş tahsil edilmemiş, ya da iade tutarı kalanı aşıyor
502Stripe iadeyi reddetti — detay detail alanında

Kısmi iade sonrası sipariş durumu

Sipariş captured kalır ve refunded_amount_minor artar. Yalnızca toplam iade sipariş tutarına ulaştığında durum refunded olur.

Hesap Endpoint'leri

Bu endpoint'ler Dashboard'un kullandığı hesap işlemleridir. Sipariş endpoint'lerinden farklı olarak API anahtarı değil, oturum token'ı beklerler (/auth/login yanıtındaki access_token).

EndpointKimlikAçıklama
POST /auth/register — Yeni satıcı hesabı açar. Gövde: name, email, password (min. 8 karakter)
POST /auth/login — Giriş yapar. access_token, refresh_token ve kullanıcı bilgisi döner
GET /auth/me Oturum token'ı Mevcut kullanıcı, KYC durumu, rezerv oranı ve sipariş özeti
POST /auth/logout Oturum token'ı Oturumu sonlandırır
POST /auth/login — Örnek
curl -X POST https://api.auroraskypayments.com/auth/login \
  -H "Content-Type: application/json" \
  -d '{
    "email": "siz@sirketiniz.com",
    "password": "***"
  }'
200 OK — Yanıt
{
  "access_token": "eyJhbGciOiJIUzI1NiIs...",
  "refresh_token": "v1.MRq...",
  "expires_in": 3600,
  "user": {
    "id": "8f2ac41b-3e7d-4f12-9c8a-1b2d3e4f5a6b",
    "email": "siz@sirketiniz.com",
    "name": "Acme Ltd.",
    "kyc_status": "verified",
    "reserve_percentage": 10
  }
}

API Anahtarları

Sipariş endpoint'lerinde kullanacağınız anahtarları bu endpoint'lerle yönetirsiniz. Hepsi oturum token'ı ister.

🔒 Anahtar bir kez gösterilir

Sunucuda anahtarın yalnızca SHA-256 özeti saklanır — ham değeri biz de göremiyoruz. POST /auth/api-keys yanıtındaki api_key alanını kaydetmezseniz anahtar kaybolur; tek çözüm eskisini iptal edip yenisini oluşturmaktır.

EndpointAçıklama
GET /auth/api-keys Anahtarlarınızı listeler. Ham anahtar dönmez — yalnızca ön ek, ortam, son kullanım ve iptal durumu
POST /auth/api-keys Yeni anahtar oluşturur. Gövde: name, environment (live | test)
DELETE /auth/api-keys/:id Anahtarı iptal eder. Kayıt silinmez, revoked_at doldurulur — denetim izi korunur
Yeni anahtar oluşturma
curl -X POST https://api.auroraskypayments.com/auth/api-keys \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Üretim sunucusu", "environment": "live" }'
201 Created — Yanıt
{
  "id": "3f1c8e2a-...",
  "name": "Üretim sunucusu",
  "key_prefix": "sk_live_a1b2",
  "environment": "live",
  "created_at": "2026-09-03T19:00:00Z",
  "api_key": "sk_live_a1b2C3d4E5f6G7h8I9j0K1l2M3n4O5p6",
  "warning": "Bu anahtar yalnızca bir kez gösterilir. Güvenli bir yere kaydedin."
}

KYC Belgeleri

Sipariş oluşturabilmeniz için kimlik doğrulamasının tamamlanmış olması gerekir. Bu, Merchant of Record modelinin yasal zorunluluğudur — sizin adınıza tahsilat yapabilmemiz için kim olduğunuzu doğrulamamız gerekiyor.

EndpointAçıklama
POST /kyc/documents/upload Belge dosyasını yükler (multipart/form-data)
GET /kyc/documents Yüklediğiniz belgeleri ve onay durumlarını listeler
GET /kyc/documents/:id/download Belgeyi indirir. Yalnızca kendi belgenize erişebilirsiniz
GET /kyc/status Genel doğrulama durumu ve eksik belgeler

Belge türleri

DeğerBelge
government_idKimlik kartı veya pasaport
proof_of_addressAdres kanıtı (fatura, banka ekstresi)
w8benW-8BEN formu (ABD vergi beyanı)
otherDiğer

Dosya kuralları

  • İzinli türler: PDF, JPEG, PNG, WebP
  • Boyut sınırı: 10 MB
  • Dosyanın gerçek türü içeriğinden doğrulanır. Uzantısı veya Content-Type başlığı yanlış olan dosya reddedilir.
POST /kyc/documents/upload — Örnek
curl -X POST https://api.auroraskypayments.com/kyc/documents/upload \
  -H "Authorization: Bearer sk_live_..." \
  -F "document_type=government_id" \
  -F "file=@kimlik.pdf"
Yanıt — 201 Created
{
  "id": "doc_01HXYZ...",
  "document_type": "government_id",
  "status": "pending",
  "size_bytes": 284736,
  "content_type": "application/pdf",
  "created_at": "2026-09-06T02:14:00Z"
}

Belgeleriniz gizlidir. Yüklenen dosyalar herkese açık bir adreste tutulmaz; yalnızca sizin oturumunuzla ve onay ekibimiz tarafından erişilebilir. Başka bir satıcı, belge kimliğinizi bilse bile dosyanıza ulaşamaz.

Webhook Kurulumu

Ödeme tamamlandığında, iade yapıldığında veya itiraz açıldığında AuroraSky belirlediğiniz URL'e HTTP POST isteği gönderir.

  1. Dashboard → Ayarlar → Webhook URL alanına sunucunuzun adresini girin.
  2. Webhook Secret'ınızı not edin — gelen isteklerin imzasını doğrulamak için kullanacaksınız.
  3. Sunucunuz 200 döndüğünde olay teslim edilmiş sayılır. Başka bir yanıt alınırsa exponential backoff ile tekrar denenir.

🔒 İmza Doğrulaması Zorunludur

İmza doğrulamadan webhook işlemeyin. Doğrulanmamış bir istek, bir saldırganın sahte ödeme bildirimi göndermesine olanak tanır.

İmza Doğrulama

Her webhook isteğinde Stripe-Signature başlığı bulunur. İmza HMAC-SHA256 ile hesaplanır.

İmza Formatı
Stripe-Signature: t=1614556800,v1=5257a869e7ecebeda3...

Doğrulama Adımları

  1. t değerini (unix timestamp) ve v1 değerini (imza) ayırın
  2. {t}.{ham_gövde} string'ini webhook secret ile HMAC-SHA256 ile imzalayın
  3. Hesapladığınız hex digest'i v1 değeriyle sabit zamanlı karşılaştırma ile kontrol edin
  4. Timestamp'in 5 dakikadan (300 sn) eski olmadığını doğrulayın (replay koruması)
Node.js — İmza Doğrulama Örneği
import crypto from 'crypto';

function verifyWebhook(rawBody, signatureHeader, secret) {
  const parts = signatureHeader.split(',');
  const timestamp = parts.find(p => p.startsWith('t=')).slice(2);
  const signature = parts.find(p => p.startsWith('v1=')).slice(3);

  // Replay koruması: 5 dakikadan eski olayları reddet
  const age = Math.abs(Date.now() / 1000 - Number(timestamp));
  if (age > 300) return false;

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${timestamp}.${rawBody}`)
    .digest('hex');

  return crypto.timingSafeEqual(
    Buffer.from(signature, 'hex'),
    Buffer.from(expected, 'hex')
  );
}

Webhook Olay Türleri

OlayAçıklamaTetiklenme
payment_intent.succeeded Ödeme başarıyla tamamlandı. Sipariş orders tablosuna yazılır. Alıcı ödeme yaptığında
charge.refunded Tam veya kısmi iade yapıldı. Satıcı veya AuroraSky iade başlattığında
charge.dispute.created Alıcı chargeback/itiraz açtı. Sipariş disputed olarak işaretlenir ve payout'a dahil edilmez. Kart sahibi bankasına itiraz ettiğinde
charge.dispute.closed İtiraz sonuçlandı. Kazanıldıysa sipariş tekrar captured olur ve ödemeye dahil edilir; kaybedildiyse tutar ve itiraz ücreti muhasebeye kalıcı olarak yazılır. Banka itirazı karara bağladığında

💡 İpucu

Tanımadığınız olay türlerine 200 döndürün. Yeni olay türleri eklenebilir; bilinmeyen türlere hata dönmek gereksiz tekrar denemelerine yol açar.

Desteklenen Para Birimleri

Tüm tutarlar minor unit (kuruş/sent) cinsinden tam sayı olarak gönderilir. Sıfır ondalıklı para birimlerinde (JPY) tutar doğrudan birim cinsindendir.

KodPara BirimiMinimum (minor)Sıfır Ondalık
USDABD Doları50 ($0,50)Hayır
EUREuro50 (€0,50)Hayır
GBPİngiliz Sterlini30 (£0,30)Hayır
TRYTürk Lirası100 (₺1,00)Hayır
CADKanada Doları50 (C$0,50)Hayır
AUDAvustralya Doları50 (A$0,50)Hayır
JPYJapon Yeni50 (¥50)Evet
PLNPolonya Zlotisi200 (2,00 zł)Hayır
SEKİsveç Kronu300 (3,00 kr)Hayır
NOKNorveç Kronu300 (3,00 kr)Hayır
DKKDanimarka Kronu250 (2,50 kr)Hayır
CHFİsviçre Frangı50 (0,50 Fr.)Hayır
SGDSingapur Doları50 (S$0,50)Hayır
HKDHong Kong Doları400 (HK$4,00)Hayır
BRLBrezilya Reali50 (R$0,50)Hayır
MXNMeksika Pesosu1000 ($10,00)Hayır
INRHindistan Rupisi50 (₹0,50)Hayır

Hata Kodları

API hataları standart HTTP durum kodları ile döner. Yanıt gövdesinde error alanı her zaman bulunur.

Hata Yanıtı Formatı
{
  "error": "Satıcı KYC doğrulaması tamamlanmamış",
  "kyc_status": "pending"
}
KodDurumAçıklama
400Bad Requestİstek gövdesi geçersiz, zorunlu alan eksik, veya para birimi desteklenmiyor
401UnauthorizedAPI anahtarı eksik, geçersiz veya iptal edilmiş
403ForbiddenKYC doğrulaması tamamlanmamış, veya merchant_id anahtarın sahibiyle eşleşmiyor
404Not FoundSatıcı veya sipariş bulunamadı (başka satıcıya ait siparişler de 404 döner)
409ConflictIdempotency key çakışması — farklı parametrelerle aynı key
422Unprocessableİş kuralı gereği işlenemedi (desteklenmeyen para birimi, tutar sınırı vb.)
429Rate LimitedÇok fazla istek — biraz bekleyip tekrar deneyin
500Server ErrorSunucu hatası — isteği tekrar deneyin
502Bad GatewayStripe API hatası — detay detail alanında
503UnavailableKimlik doğrulama servisi geçici olarak sorgulanamıyor — tekrar deneyin

Doğrulama Hataları (400)

Birden fazla alan geçersizse tüm hatalar details dizisinde döner:

400 — Çoklu Doğrulama Hatası
{
  "error": "Geçersiz istek",
  "details": [
    "amount_minor pozitif tam sayı olmalı (kuruş/sent cinsinden)",
    "product_name zorunlu",
    "success_url zorunlu"
  ]
}

Fiyatlandırma Modeli

Satıcı fiyatı $49,00
+ İşlem ücreti (%6 + $0,40) $3,34 Alıcıya yansıtılır
Alıcı öder $52,34
− AuroraSky komisyonu (%5 + $0,50) $2,95 Satıcı fiyatından kesilir
Satıcı alır $46,05
KalemOranKim Öder
Ödeme altyapı ücreti%6 + $0,40Alıcı (fiyata eklenir)
KDV / satış vergisiAlıcının ülkesine göreAlıcı (fiyata eklenir)
AuroraSky platform komisyonu%5 + $0,50Satıcı (fiyattan kesilir)

Rate Limits

API istekleri, kötüye kullanımı önlemek için sınırlandırılmıştır.

EndpointLimitPencere
POST /orders60 istekDakika başına
GET /orders120 istekDakika başına
Genel1000 istekSaat başına

Limit aşıldığında 429 Too Many Requests döner. Retry-After başlığında kaç saniye beklemeniz gerektiği belirtilir.

Limitler API anahtarı başına uygulanır; kimliksiz isteklerde IP esas alınır. Sayaç sabit pencere (fixed window) yöntemiyle tutulur. Her yanıtta RateLimit-Limit, RateLimit-Remaining ve RateLimit-Reset başlıkları bulunur — kotanızı istek göndermeden takip edebilirsiniz.