Faturalandırma
Aboneliğinizi yönetin, faturaları görüntüleyin ve kullanımı izleyin
MailLand, abonelik yönetimi ve faturalandırma için Stripe kullanır. Her çalışma alanının kullanım tabanlı veya plan tabanlı fiyatlandırmayla kendi aboneliği vardır. Herhangi bir üye faturalandırma durumunu okuyabilir; yalnızca çalışma alanı Sahibi bunu değiştirebilir (değiştiren çağrılar 403 INSUFFICIENT_PERMISSIONS döner ve API anahtarları bu uç noktalarda her zaman reddedilir).
Ödeme Durumları
paymentStatus, sayısal bir enum değil, snake_case bir dize olarak döner:
| Durum | Açıklama |
|---|---|
current | Abonelik etkin, ödeme güncel |
grace_period | Ödeme başarısız, tolerans süresi aktif |
overdue | Ödeme gecikmiş, özellikler kısıtlandı |
blocked | Ödenmeme nedeniyle hesap engellendi |
Abonelik Ayrıntılarını Alın
GET https://api.mail.land/v1/account/subscriptioncurl https://api.mail.land/v1/account/subscription \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"planName": "Pro",
"monthlyEmailLimit": 100000,
"rateLimitPerSecond": 10,
"pricePerMonth": 49.00,
"startDate": "2026-01-15T08:00:00Z",
"endDate": "2026-03-01T00:00:00Z",
"status": "Active",
"paymentStatus": "current",
"marketingPausedDueToPayment": false,
"sendingBlockedDueToPayment": false,
"transactionalDailyLimit": 5000,
"daysUntilBlocked": null,
"cancelAtPeriodEnd": false,
"planFamilyId": "fam_pro",
"planTierPublicId": "tier_pro_monthly",
"usage": {
"emailsSentThisMonth": 45000,
"monthlyLimit": 100000,
"percentageUsed": 45.0,
"transactionalCount": 30000,
"marketingCount": 12000,
"apiCount": 40000,
"smtpCount": 5000,
"campaignCount": 3000,
"automationCount": 2000,
"inboundForwardCount": 500
}
}Bu yanıtta id, planId, interval, currentPeriodStart/currentPeriodEnd veya iç içe sayısal paymentStatus/doğrulama/alan adı/ekip/otomasyon kullanım alanları yoktur, yukarıdaki alan adlarını kullanın. paymentStatus, "current", "grace_period", "overdue" veya "blocked" şeklinde snake_case bir dizedir. status, PascalCase'dir ("Active", "Suspended", "Cancelled"): tek istisna, küçük harfli "active" döndüren abonelik olmayan geri dönüş yanıtıdır.
Kullanım Alanları
| Alan | Açıklama |
|---|---|
emailsSentThisMonth | Mevcut faturalandırma döneminde gönderilen e-postalar |
monthlyLimit | Dönem başına maksimum e-posta sayısı |
percentageUsed | emailsSentThisMonth'ın monthlyLimit'e oranı (yüzde) |
transactionalCount | Gönderilen işlemsel e-postalar |
marketingCount | Gönderilen pazarlama e-postaları |
apiCount | API üzerinden gönderilen e-postalar |
smtpCount | SMTP relay üzerinden gönderilen e-postalar |
campaignCount | Kampanyalar tarafından gönderilen e-postalar |
automationCount | Otomasyonlar tarafından gönderilen e-postalar |
inboundForwardCount | Gelen yönlendirme kuralları tarafından gönderilen e-postalar |
Bu yanıtta doğrulama, alan adı, ekip üyesi veya otomasyon kullanım sayaçları yoktur, yalnızca e-posta gönderim sayaçları.
E-posta Kullanımı Ne Zaman Sayılır
Alıcılar, kabulün kalıcı olarak kaydedildiği anda kullanımınıza ve kotanıza (emailsSentThisMonth / monthlyLimit) karşı sayılır. Kabulden önce reddedilen veya bastırılan alıcılar hiçbir zaman sayılmaz. Kabulden sonra meydana gelen bir sekme (bounce), alt akış bastırması, teslimat hatası veya başka bir teslim edilememe durumu, kullanımı veya kotayı otomatik olarak geri yüklemez veya geri almaz, sayım geriye dönük olarak ayarlanmaz. Bu bölüm yalnızca kullanım muhasebesini açıklar; e-posta başına Stripe fiyatlandırmasını veya abonelik şartlarınızca ayrıca yönetilen herhangi bir iade hakkını belirtmez veya ima etmez.
Kota, Stripe üzerinden faturalandırılan planlar için her Stripe faturalandırma döneminde, Stripe üzerinden faturalandırılmayan planlar için (Free ve yönetici tarafından verilen planlar) her UTC takvim ayının 1'inde sıfırlanır: her zaman Stripe anlamında "döneme göre" değildir.
Planlar ve Saklama
Planlar Free, Pro ve Max'tır. Mesaj günlükleri Free'de 30 gün, Pro'da 90 gün ve Max'ta 180 gün saklanır.
İlke Özeti
Çalışma alanı doğrulama durumunu ve gönderme politikasını alın:
GET https://api.mail.land/v1/account/subscription/policy-summarycurl https://api.mail.land/v1/account/subscription/policy-summary \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Gerçek yanıt, düz değil iç içe bir nesnedir (SubscriptionController.cs:137-200):
{
"subscription": {
"planFamilyId": "fam_pro",
"planFamilyName": "Pro",
"planTierId": "tier_pro_monthly",
"monthlyQuota": 100000,
"pricePerMonth": 49.00
},
"usage": {
"usedThisMonth": 45000,
"remainingThisMonth": 55000,
"percentUsed": 45.0
},
"effectiveRates": {
"transactionalRatePerMin": 600,
"marketingRatePerMin": 300,
"isOverridden": false
},
"domainWarmup": [
{
"domainId": "h4k7m1n9w2p5x8",
"domainName": "example.com",
"currentStage": 2,
"totalStages": 5,
"todaySentCount": 350,
"dailyLimit": 500,
"progressPercent": 70.0,
"completed": false,
"bypassed": false
}
],
"alerts": [
{
"type": "warning",
"code": "QUOTA_WARNING",
"message": "You have used 80% of your monthly quota. Consider upgrading your plan.",
"actionUrl": "/billing"
}
],
"dailySendingLimit": {
"limit": 5000,
"usedToday": 1200,
"remainingToday": 3800,
"resetsAt": "2026-02-18T00:00:00Z"
},
"verification": {
"level": 2,
"levelName": "SenderVerified",
"limits": {},
"progress": {},
"nextSteps": []
}
}| Alan | Açıklama |
|---|---|
subscription | Plan ailesi, katman ve aylık kota/fiyat |
usage | Bu ay kullanılan, kalan e-posta sayısı ve kullanım yüzdesi |
effectiveRates | Dakika başına geçerli gönderim oranları ve geçersiz kılınıp kılınmadıkları |
domainWarmup | Alan adı başına ısınma ilerlemesi, ısınmadaki her alan adı için bir kayıt |
alerts | Bu çalışma alanı için etkin uyarılar (kota, günlük limit ve benzeri) |
dailySendingLimit | Uygunsa günlük gönderim limiti ve kalan pay |
verification | Mevcut doğrulama düzeyi, limitleri, ilerlemesi ve sonraki adımları |
Ödeme Oturumu Oluşturun
Abone olmak veya yükseltmek için bir Stripe Checkout oturumu başlatın:
POST https://api.mail.land/v1/account/billing/checkout{
"planTierId": "tier_pro_monthly",
"locale": "en",
"businessAttested": true,
"businessAttestationKey": "business-use-v3-button"
}| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
planTierId | string | Evet | Plan katmanının genel kimliği |
locale | string | Hayır | Barındırılan ödeme sayfası için dil |
businessAttested | boolean | Evet | true, MailLand'i ticari veya mesleki kullanım için satın aldığınızı (serbest çalışan, şahıs işletmesi veya kendi web siteniz için olması dahil) onaylar. Panel bunu ödeme düğmesiyle gönderir: düğmenin etiketi «Pay for business use» yazar ve altındaki tek satırlık not tıklamanın neyi onayladığını belirtir |
businessAttestationKey | string | Evet | Onayın atıfta bulunduğu ifade sürümü; şu anda business-use-v3-button (önceki ifade olan business-use-v1 hâlâ kabul edilir) |
businessAttested: true ve kabul edilen bir businessAttestationKey içermeyen istek, herhangi bir ücret alınmadan önce 400 BUSINESS_ATTESTATION_REQUIRED ile reddedilir. MailLand kimin, ne zaman, hangi ifadeyle (gönderdiğiniz anahtar) ve hangi dilde onayladığını saklar. Stripe Checkout'ta bir vergi numarası girebilirsiniz; bu isteğe bağlıdır. Fiyatlara KDV dahil değildir ve MailLand KDV tahsil etmez; Birleşik Krallık dışındaki doğrulanmış bir AB KDV numarası faturalarınıza ters ücret notunu ekler.
Bu istekte successUrl veya cancelUrl alanı yoktur, başarı/iptal URL'leri çağıran tarafından sağlanmaz.
curl -X POST https://api.mail.land/v1/account/billing/checkout \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "planTierId": "tier_pro_monthly", "locale": "en", "businessAttested": true, "businessAttestationKey": "business-use-v3-button" }'{
"upgraded": false,
"sessionId": "cs_live_abc123...",
"url": "https://checkout.stripe.com/c/pay/cs_live_abc123..."
}Stripe'ın barındırılan ödeme sayfasında ödemeyi tamamlamak için kullanıcıyı url adresine yönlendirin. Çalışma alanının zaten aktif bir aboneliği varsa, yeni bir ödeme açmak yerine plan yerinde değiştirilir: yanıt, sessionId/url olmadan { "upgraded": true } şeklindedir ve yönlendirme yoktur. Yalnızca url mevcut olduğunda yönlendirin.
Faturalandırma Portalı
Self servis yönetim için Stripe Müşteri Portalını açın (ödeme yöntemini güncelleyin, iptal edin, faturaları görüntüleyin):
POST https://api.mail.land/v1/account/billing/portal{
"locale": "en"
}locale isteğe bağlıdır.
curl -X POST https://api.mail.land/v1/account/billing/portal \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..." \
-H "Content-Type: application/json" \
-d '{ "locale": "en" }'{
"url": "https://billing.stripe.com/p/session/abc123..."
}Stripe portalına erişmek için kullanıcıyı url adresine yönlendirin.
Faturaları Listeleyin
GET https://api.mail.land/v1/account/billing/invoices| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
limit | int | 20 | Döndürülecek fatura sayısı |
cursor | string | - | Önceki bir yanıttaki nextCursor'dan gelen opak imleç |
curl https://api.mail.land/v1/account/billing/invoices \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."{
"items": [
{
"publicId": "inv_abc123",
"invoiceNumber": "INV-2026-0015",
"stripeInvoiceId": "in_1AbCdEfGhIjKlMn",
"status": "Paid",
"amountDue": 4900,
"amountPaid": 4900,
"currency": "eur",
"periodStart": "2026-01-01T00:00:00Z",
"periodEnd": "2026-02-01T00:00:00Z",
"paidAt": "2026-01-01T00:05:00Z",
"hostedInvoiceUrl": "https://pay.stripe.com/invoice/inv_abc123",
"invoicePdfUrl": "https://pay.stripe.com/invoice/inv_abc123/pdf",
"createdAt": "2026-01-01T00:00:00Z"
},
{
"publicId": "inv_def456",
"invoiceNumber": "INV-2026-0014",
"stripeInvoiceId": "in_2BcDeFgHiJkLmNo",
"status": "Paid",
"amountDue": 4900,
"amountPaid": 4900,
"currency": "eur",
"periodStart": "2025-12-01T00:00:00Z",
"periodEnd": "2026-01-01T00:00:00Z",
"paidAt": "2025-12-01T00:05:00Z",
"hostedInvoiceUrl": "https://pay.stripe.com/invoice/inv_def456",
"invoicePdfUrl": "https://pay.stripe.com/invoice/inv_def456/pdf",
"createdAt": "2025-12-01T00:00:00Z"
}
],
"nextCursor": null,
"hasMore": false
}Bu, { "invoices": [...] } değil, imleç (cursor) ile sayfalanmış bir yanıttır: bir sonraki sayfayı almak için nextCursor'ı cursor parametresi olarak geri gönderin ve hasMore false olduğunda durun. Varsayılan sayfa boyutu 10 değil 20'dir; alan adları number, amount, invoiceUrl, invoicePdf değil, invoiceNumber, amountDue, amountPaid, hostedInvoiceUrl ve invoicePdfUrl'dir.
Fatura tutarları, faturanın currency değerindeki en küçük birim cinsindedir (EUR için sent). Görüntülemek için 100'e bölün. Plan fiyatları euro (EUR) cinsindendir ve KDV hariçtir.
Hata Yanıtları
| Durum | Kod | Açıklama |
|---|---|---|
400 | VALIDATION_FAILED | Geçersiz istek gövdesi |
400 | INVALID_REQUEST | Plan katmanı var ancak Stripe ile senkronize değil |
403 | INSUFFICIENT_PERMISSIONS | Bu değişikliği yalnızca çalışma alanı Sahibi yapabilir (faturalandırma okuma herhangi bir üyeye açıktır) |
404 | RESOURCE_NOT_FOUND | Bilinmeyen veya etkin olmayan plan katmanı |
502 | STRIPE_ERROR | Stripe isteği başarısız oldu |
Diğer Faturalandırma Uç Noktaları
Ayrıca mevcut olan ve yukarıda ayrıntılı anlatılmayan: POST /v1/account/billing/cancel, POST /v1/account/billing/reactivate ve genel GET /public/plans/catalog uç noktası.
Sonraki Adımlar
- Çalışma Alanları: çalışma alanı ayarlarını yönetin
- Ekip Yönetimi: ekip üyelerini yönetin
- Hız Sınırları: API hız sınırlarını anlayın