Geliştiriciler/Entegrasyon

Mobil hat yükleme

Mobil hat yükleme, ön ödemeli bir telefon numarasına doğrudan yükleme yapar. Müşteriniz hattına konuşma kredisi (kontör) veya internet paketi alır. Teslim edilecek bir kod yoktur. Ödeme, diğer siparişlerde olduğu gibi CardV cüzdanınızdan yapılır.

İlgili: Kimlik doğrulama · Genel kurallar · Webhook'lar

#Nasıl çalışır

Text
GET  /recharge/countries            yükleme yapılabilen ülkeler
GET  /recharge/operators?country=US  operatörler, yükleme türleri ve tutarlar
POST /recharge/quote                fiyatınız ve 300 sn geçerli bir quote_token
POST /recharge/orders               cüzdanınızdan ödenen siparişi verin
GET  /recharge/orders/{order_id}    durumu sorgulayın veya Webhook bekleyin
  • Tüm yollar /api/v1 ile başlar. Her istekte gönderdiğiniz başlıkları gönderin.
  • İki POST isteği imzalı olmalıdır. Onları POST/orders ile aynı şekilde imzalayın, ancak kendi yollarını kullanın, örneğin /api/v1/recharge/quote.
  • Yükleme siparişleri hediye kartı siparişlerinden ayrıdır. Onları okumak için /recharge uç noktalarını kullanın.
  • Yalnızca doğrudan yükleme sunulur. PIN ürünleri (müşterinin kendisinin girdiği bir kod) sunulmaz.

#Ülkeler

GET/api/v1/recharge/countries, şu anda yükleme yapabileceğiniz ülkeleri listeler.

JSON
{
  "count": 2,
  "results": [
    {"code": "MX", "name": "Mexico", "currency_codes": ["MXN"], "operator_count": 4, "offer_count": 37},
    {"code": "US", "name": "United States", "currency_codes": ["USD"], "operator_count": 6, "offer_count": 52}
  ]
}
  • code, ISO 3166-1 alpha-2 ülke kodudur. Sonraki isteklerde bunu country olarak gönderin.
  • currency_codes, bu ülkedeki operatörlerin satış yaptığı yerel para birimleridir.
  • Liste, operatörler eklendikçe veya kullanılamaz hale geldikçe değişir. Birkaç saatte bir yeniden yükleyin.

#Operatörler

GET/api/v1/recharge/operators?country=US, bir ülkedeki operatörleri listeler. Operatör adına göre filtrelemek için search=att ekleyin.

JSON
{
  "count": 1,
  "results": [
    {
      "operator_key": "us-att",
      "name": "AT&T",
      "country": "US",
      "country_name": "United States",
      "logo_url": "https://b2b.cardv.net/api/v1/catalog-assets/3f5c...a1.png",
      "subtypes": ["airtime", "data"],
      "amount_model": "range",
      "currency_codes": ["USD"],
      "amounts": [
        {"min": "5.0000", "max": "100.0000", "currency": "USD", "subtype": "airtime", "label": "5.0000-100.0000 USD"},
        {"min": "15.0000", "max": "15.0000", "currency": "USD", "subtype": "data", "label": "15.0000 USD"}
      ],
      "offer_count": 3
    }
  ]
}
AlanAnlamı
operator_keyFiyat sorgusunda ve siparişte gönderdiğiniz numara, örneğin us-att. Metin olarak saklayın.
subtypesSatın alabilecekleriniz: airtime (konuşma kredisi), data veya bundle (konuşma ve internet).
amount_modelTüm tutarlar sabitse fixed, herhangi bir tutar aralıksa range.
amounts[]Her bir seçenek. min ile max eşitse sabit tutardır. Değilse aradaki herhangi bir tutar olabilir.
amounts[].currencyO seçeneğin yerel para birimi. Bunu local_currency olarak gönderin.
logo_urlCardV'de barındırılan görsel ya da "".
  • Tutarlar yerel tutarlardır: telefon hattına yerel para biriminde yüklenecek miktar.
  • Bilinmeyen veya hatalı biçimli bir country HTTP 400 döner.

#Fiyat sorgusu

POST/api/v1/recharge/quote, tek bir yükleme için fiyatınızı verir. Bu istek imzalı olmalıdır.

JSON
{
  "country": "US",
  "operator_key": "us-att",
  "amount": "10.00",
  "local_currency": "USD",
  "subtype": "airtime"
}
AlanZorunluAnlamı
countryEvetÜlke listesindeki ülke kodu.
operator_keyEvetOperatör listesinden.
amountEvetMetin olarak yerel tutar. Sabit: listelenen değerlerden biri. Aralık: min ile max arasında.
local_currencyÖneriliramount için amounts[].currency içindeki ISO 4217 kodu. Operatör birden fazla para birimi listeliyorsa gönderin.
subtypeHayırairtime (varsayılan), data veya bundle.

Yanıt:

JSON
{
  "country": "US",
  "country_name": "United States",
  "operator": {"operator_key": "us-att", "name": "AT&T", "logo_url": ""},
  "subtype": "airtime",
  "local_amount": "10.0000",
  "local_currency": "USD",
  "merchant_price": "9.6200",
  "merchant_currency": "USD",
  "expires_at": "2026-09-30T08:20:30.123456+00:00",
  "quote_token": "eyJ2ZXJzaW9uIjox...:1uXyZa:8c1f..."
}
  • merchant_price, cüzdanınızdan merchant_currency para biriminde ödenecek tutardır.
  • quote_token, bu fiyatı expires_at zamanına kadar, yani 300 saniye boyunca sabitler. Siparişle birlikte değiştirmeden gönderin.
  • Token hesabınıza ve bu ülke, operatör, tür ve tutara bağlıdır.
  • Sipariş vermeden önce local_currency değerinin beklediğiniz para birimi olduğunu kontrol edin.
  • Fiyat sorgusu para ayırmaz. İstediğiniz zaman yeni bir fiyat sorgulayabilirsiniz.

#Yükleme siparişi verme

POST/api/v1/recharge/orders, telefona yükleme yapar ve ödemeyi cüzdanınızdan alır. Bu istek imzalı olmalıdır.

JSON
{
  "external_order_id": "SHOP-RC-20260930-0001",
  "country": "US",
  "operator_key": "us-att",
  "amount": "10.00",
  "local_currency": "USD",
  "subtype": "airtime",
  "account": "12125550100",
  "quote_token": "eyJ2ZXJzaW9uIjox...:1uXyZa:8c1f..."
}
AlanZorunluAnlamı
external_order_idEvetKendi sipariş numaranız. Hediye kartı siparişleri dahil tüm siparişleriniz arasında benzersizdir.
country, operator_key, amount, local_currency, subtypeEvetFiyat sorgusunda gönderdiğiniz değerlerin aynısı.
accountEvetYükleme yapılacak telefon numarası: yalnızca rakamlar, ülke koduyla birlikte, + veya boşluk olmadan.
quote_tokenEvetFiyat sorgusundan, süresi dolmadan.

Telefon numarası örnekleri: 12125550100 (ABD), 525512345678 (Meksika). Numaranın seçilen operatöre ait olduğunu kontrol edin. Yanlış numaraya yapılan yükleme geri alınamaz.

CardV fiyat sorgusunu kontrol eder, merchant_price tutarını hemen cüzdanınızdan alır ve yüklemeyi arka planda başlatır. Yeni bir sipariş HTTP 201 döner:

JSON
{
  "idempotent_replay": false,
  "order": {
    "order_id": "O-00005678",
    "external_order_id": "SHOP-RC-20260930-0001",
    "status": "accepted",
    "status_title": "Recharge accepted",
    "poll_after_seconds": 12,
    "account": "12***00",
    "local_amount": "10.0000",
    "local_currency": "USD",
    "merchant_price": "9.6200",
    "merchant_currency": "USD",
    "...": "more fields"
  }
}
  • order.order_id değerini saklayın.
  • Telefon numarası maskelenmiş olarak döner, hiçbir zaman tamamı gösterilmez.

#Güvenli yeniden deneme

external_order_id, iki kez yükleme yapmanızı önler.

GönderdiğinizAldığınız
Yeni bir sipariş numarasıHTTP 201. Yeni bir sipariş. Cüzdanınızdan ödeme alınır.
Aynı sipariş numarası ve aynı yüklemeHTTP 200 ve "idempotent_replay": true. Mevcut sipariş. Ücret alınmaz.
Aynı sipariş numarası ama farklı bir yüklemeexternal_order_id için HTTP 400. Hiçbir işlem yapılmaz.

"Aynı yükleme", aynı ülke, operatör, tür, tutar ve telefon numarası demektir. Tekrarlanan sipariş, fiyat sorgusu kontrolünden önce tanınır. Bu yüzden süresi dolmuş bir quote_token ile bile ilk sipariş döner.

  • Zaman aşımı, 5xx veya kopan bağlantıdan sonra aynı gövdeyi aynı sipariş numarasıyla gönderin. Yeni bir zaman damgası ve nonce ile yeniden imzalayın.
  • Yanıt kayboldu diye asla yeni sipariş numarası üretmeyin. Bu, telefona iki kez yükleme yapılmasına yol açabilir.

#Yükleme siparişlerini okuma

GET/api/v1/recharge/orders/{order_id} tek bir sipariş döner. CardV sipariş numarasını (O-00005678) kullanabilirsiniz.

JSON
{
  "order_id": "O-00005678",
  "external_order_id": "SHOP-RC-20260930-0001",
  "status": "processing",
  "order_status": "processing",
  "status_title": "Recharge processing",
  "status_message": "The recharge request is being processed. Delivery is not confirmed yet.",
  "next_step": "Keep this order open and wait for confirmation before placing another recharge.",
  "poll_after_seconds": 12,
  "country": "US",
  "operator": {"operator_key": "us-att", "name": "AT&T", "logo_url": ""},
  "subtype": "airtime",
  "account": "12***00",
  "local_amount": "10.0000",
  "local_currency": "USD",
  "merchant_price": "9.6200",
  "merchant_currency": "USD",
  "attempts": [{"attempt_no": 1, "status": "processing", "error_message": "", "submitted_at": "2026-09-30T08:16:02.511201Z", "completed_at": null}],
  "created_at": "2026-09-30T08:16:01.004211Z",
  "updated_at": "2026-09-30T08:16:02.611978Z",
  "...": "more fields"
}
  • Bilinmeyen bir sipariş numarası veya başka bir hesaba ait sipariş HTTP 404 döner.
  • status_title, status_message ve next_step, ekibinize gösterebileceğiniz İngilizce metinlerdir.
  • poll_after_seconds, bir sonraki kontrolden önce ne kadar bekleneceğidir. 0, siparişin tamamlandığı anlamına gelir.

#Yükleme siparişlerini listeleme

GET/api/v1/recharge/orders, yükleme siparişlerinizi en yeniden eskiye doğru listeler.

HTTP
GET /api/v1/recharge/orders?status=processing&limit=50&offset=0
JSON
{"count": 3, "limit": 50, "results": ["..."]}
  • Filtreler: status ve search (CardV sipariş numarası, kendi sipariş numaranız veya operatör adı).
  • limit varsayılan olarak 20'dir, en fazla 100 olabilir. Daha büyük değerler 100'e düşürülür.
  • Negatif ya da sayı olmayan bir limit veya offset HTTP 400 döner.

#Durum

Text
accepted ──► processing ──► succeeded
                  │
                  ├──► manual_review ──► succeeded veya refunded
                  │
                  └──► failed ──► refunded   (para cüzdanınıza iade edildi)
DurumTamamlandı mı?Ne yapmalı
acceptedHayırBekleyin. Ödeme cüzdandan alındı, yükleme henüz başlamadı.
processingHayırBekleyin. Birkaç dakika sürebilir. Siparişi tekrar vermeyin.
manual_reviewHayırCardV sonucu operatörle kontrol ediyor. Bekleyin.
succeededEvetTelefona yükleme yapıldı. Müşterinize bildirin.
failedHenüz değilYükleme gerçekleşmedi. refunded durumunu bekleyin.
refundedEvetPara cüzdanınıza geri döndü. Yeni bir sipariş verebilirsiniz.
  • poll_after_seconds sonra sorgulayın, ardından aralığı uzatın: 30 sn, 60 sn, sonra 5 dakikada bir. İstek limitini aşmayın.
  • Bilinmeyen bir durumu "henüz tamamlanmadı" olarak değerlendirin.
  • Bir sipariş tamamlanmadan aynı numaraya yeni bir sipariş numarasıyla başka bir yükleme göndermeyin. İlki de başarılı olursa telefona iki kez yükleme yapılır.

#Webhook'lar ve iadeler

Yükleme siparişleri, diğer siparişlerle aynı Webhook'ları gönderir: order.succeeded, order.failed ve order.refunded. Webhook'ta CardV sipariş numarası, kendi sipariş numaranız ve boş bir items listesi bulunur. Webhook geldikten sonra siparişi GET/api/v1/recharge/orders/{order_id} ile okuyun.

İadeler otomatiktir. Operatör başarısızlığı onayladığında CardV merchant_price tutarının tamamını cüzdanınıza iade eder ve sipariş refunded olur. İadeyi Portal'daki hesap hareketleri sayfasında görebilirsiniz. Başarılı bir yükleme iade veya iptal edilemez.

#Hatalar

Hatalar Genel kurallar sayfasındaki yapıyı izler. Reddedilen bir fiyat sorgusu veya sipariş HTTP 400 döner ve hiçbir ücret alınmaz.

AnahtarNeredeNe yapmalı
detailFiyat sorgusu, siparişÜlke, operatör, tür veya tutar kullanılamıyor. Operatör listesini kontrol edin.
amountFiyat sorgusu, siparişSayı değil, sıfır veya aralık dışında.
local_currencyFiyat sorgusu, sipariş3 harfli bir ISO 4217 kodu değil.
accountSiparişTelefon numarası eksik.
quote_tokenSiparişEksik, süresi dolmuş, değiştirilmiş veya eşleşmiyor. code değerine bakın, sonra yeniden fiyat sorgulayın.
balanceSiparişPortal'dan bakiye yükleyin.
riskSiparişBir sipariş limitine takıldınız. CardV ile iletişime geçin.
external_order_idSiparişBaşka bir sipariş için kullanılmış. Bkz. Güvenli yeniden deneme.
walletSiparişAktif cüzdan yok. CardV ile iletişime geçin.

quote_token hataları bir code ile gelir:

JSON
{"code": "quote_expired", "quote_token": "This quote expired. Refresh the price and confirm again."}
codeAnlamı
quote_requiredquote_token gönderilmedi.
quote_expired300 saniyeden eski. Yeniden fiyat sorgulayın.
quote_invalidDeğiştirilmiş veya farklı bir yükleme için alınmış. Yeniden fiyat sorgulayın.
price_changedFiyat sorgusundan sonra fiyatınız değişti. Yeniden sorgulayıp yeni fiyatı onaylayın.

HTTP 403, kimlik bilgileri, imza, IP veya onay sorunu demektir. Bkz. Kimlik doğrulama.

Entegrasyonla ilgili sorunuz mu var? Merchant ID’nizi ve sipariş ya da istek kimliğini ekleyerek [email protected] adresine yazın.