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ıç
- Hesap oluşturun — Dashboard üzerinden kayıt olun ve KYC doğrulamasını tamamlayın.
- API anahtarınızı alın — Dashboard → Ayarlar → API Anahtarları.
- İlk sipariş oluşturun —
POST /ordersile Stripe Checkout oturumu başlatın. - Webhook dinleyin —
payment_intent.succeededolayı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.
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: 550e8400-e29b-41d4-a716-446655440000
| Kural | Açıklama |
|---|---|
| Format | UUID v4 veya benzersiz herhangi bir string (maks. 255 karakter) |
| Süre | Aynı key ile 24 saat içinde tekrar istek yapılabilir |
| Çakışma | Farklı 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
| Alan | Tür | Zorunlu | Açı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ık | Zorunlu | Açıklama |
|---|---|---|
Idempotency-Key |
✓ | Benzersiz istek anahtarı (UUID v4 önerilir) |
Authorization |
✓ | Bearer sk_live_... |
Content-Type |
✓ | application/json |
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"
}'
{
"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ı
| Alan | Açıklama |
|---|---|
seller_price_minor | Satıcının belirlediği fiyat |
processing_fee_minor | Ödeme altyapı ücreti (%6 + $0,40) — alıcıya yansıtılır |
buyer_total_minor | Alıcının ödeyeceği toplam tutar |
platform_fee_minor | AuroraSky komisyonu (%5 + $0,50) — satıcıdan kesilir |
seller_payout_minor | Satıcının alacağı net tutar |
GET /orders/:id
Belirli bir siparişin detaylarını döner.
curl https://api.auroraskypayments.com/orders/d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a \
-H "Authorization: Bearer sk_live_••••mP7z"
{
"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ı
| Durum | Açıklama |
|---|---|
captured | Ödeme alındı, işlem tamamlandı |
refunded | Tam iade yapıldı |
partially_refunded | Kısmi iade yapıldı |
disputed | Chargeback/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
| Parametre | Tür | Zorunlu | Açı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) |
{
"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
| Alan | Tür | Zorunlu | Açı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.
|
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"
}'
{
"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ı
| Kod | Anlamı |
|---|---|
| 400 | Idempotency-Key eksik, tutar geçersiz veya sebep tanınmıyor |
| 404 | Sipariş bulunamadı (başka satıcıya aitse de 404 döner) |
| 409 | Sipariş zaten tamamen iade edilmiş |
| 422 | Sipariş tahsil edilmemiş, ya da iade tutarı kalanı aşıyor |
| 502 | Stripe 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).
| Endpoint | Kimlik | Açı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 |
curl -X POST https://api.auroraskypayments.com/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "siz@sirketiniz.com",
"password": "***"
}'
{
"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.
| Endpoint | Açı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 |
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" }'
{
"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.
| Endpoint | Açı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ğer | Belge |
|---|---|
government_id | Kimlik kartı veya pasaport |
proof_of_address | Adres kanıtı (fatura, banka ekstresi) |
w8ben | W-8BEN formu (ABD vergi beyanı) |
other | Diğ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-Typebaşlığı yanlış olan dosya reddedilir.
curl -X POST https://api.auroraskypayments.com/kyc/documents/upload \
-H "Authorization: Bearer sk_live_..." \
-F "document_type=government_id" \
-F "file=@kimlik.pdf"
{
"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.
- Dashboard → Ayarlar → Webhook URL alanına sunucunuzun adresini girin.
- Webhook Secret'ınızı not edin — gelen isteklerin imzasını doğrulamak için kullanacaksınız.
- 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.
Stripe-Signature: t=1614556800,v1=5257a869e7ecebeda3...
Doğrulama Adımları
tdeğerini (unix timestamp) vev1değerini (imza) ayırın{t}.{ham_gövde}string'ini webhook secret ile HMAC-SHA256 ile imzalayın- Hesapladığınız hex digest'i
v1değeriyle sabit zamanlı karşılaştırma ile kontrol edin - Timestamp'in 5 dakikadan (300 sn) eski olmadığını doğrulayın (replay koruması)
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
| Olay | Açıklama | Tetiklenme |
|---|---|---|
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.
| Kod | Para Birimi | Minimum (minor) | Sıfır Ondalık |
|---|---|---|---|
USD | ABD Doları | 50 ($0,50) | Hayır |
EUR | Euro | 50 (€0,50) | Hayır |
GBP | İngiliz Sterlini | 30 (£0,30) | Hayır |
TRY | Türk Lirası | 100 (₺1,00) | Hayır |
CAD | Kanada Doları | 50 (C$0,50) | Hayır |
AUD | Avustralya Doları | 50 (A$0,50) | Hayır |
JPY | Japon Yeni | 50 (¥50) | Evet |
PLN | Polonya Zlotisi | 200 (2,00 zł) | Hayır |
SEK | İsveç Kronu | 300 (3,00 kr) | Hayır |
NOK | Norveç Kronu | 300 (3,00 kr) | Hayır |
DKK | Danimarka Kronu | 250 (2,50 kr) | Hayır |
CHF | İsviçre Frangı | 50 (0,50 Fr.) | Hayır |
SGD | Singapur Doları | 50 (S$0,50) | Hayır |
HKD | Hong Kong Doları | 400 (HK$4,00) | Hayır |
BRL | Brezilya Reali | 50 (R$0,50) | Hayır |
MXN | Meksika Pesosu | 1000 ($10,00) | Hayır |
INR | Hindistan Rupisi | 50 (₹0,50) | Hayır |
Hata Kodları
API hataları standart HTTP durum kodları ile döner. Yanıt gövdesinde
error alanı her zaman bulunur.
{
"error": "Satıcı KYC doğrulaması tamamlanmamış",
"kyc_status": "pending"
}
| Kod | Durum | Açıklama |
|---|---|---|
| 400 | Bad Request | İstek gövdesi geçersiz, zorunlu alan eksik, veya para birimi desteklenmiyor |
| 401 | Unauthorized | API anahtarı eksik, geçersiz veya iptal edilmiş |
| 403 | Forbidden | KYC doğrulaması tamamlanmamış, veya merchant_id anahtarın sahibiyle eşleşmiyor |
| 404 | Not Found | Satıcı veya sipariş bulunamadı (başka satıcıya ait siparişler de 404 döner) |
| 409 | Conflict | Idempotency key çakışması — farklı parametrelerle aynı key |
| 422 | Unprocessable | İş kuralı gereği işlenemedi (desteklenmeyen para birimi, tutar sınırı vb.) |
| 429 | Rate Limited | Çok fazla istek — biraz bekleyip tekrar deneyin |
| 500 | Server Error | Sunucu hatası — isteği tekrar deneyin |
| 502 | Bad Gateway | Stripe API hatası — detay detail alanında |
| 503 | Unavailable | Kimlik 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:
{
"error": "Geçersiz istek",
"details": [
"amount_minor pozitif tam sayı olmalı (kuruş/sent cinsinden)",
"product_name zorunlu",
"success_url zorunlu"
]
}
Fiyatlandırma Modeli
| Kalem | Oran | Kim Öder |
|---|---|---|
| Ödeme altyapı ücreti | %6 + $0,40 | Alıcı (fiyata eklenir) |
| KDV / satış vergisi | Alıcının ülkesine göre | Alıcı (fiyata eklenir) |
| AuroraSky platform komisyonu | %5 + $0,50 | Satıcı (fiyattan kesilir) |
Rate Limits
API istekleri, kötüye kullanımı önlemek için sınırlandırılmıştır.
| Endpoint | Limit | Pencere |
|---|---|---|
POST /orders | 60 istek | Dakika başına |
GET /orders | 120 istek | Dakika başına |
| Genel | 1000 istek | Saat 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.