İçeriğe geç

API Dokümantasyonu

Perfect Panel v2 uyumlu tek uç nokta. Mevcut entegrasyonunuzda yalnızca adres ve anahtar değişir.

Genel bakış

Perfect Panel v2

Tek uç nokta, tek istek biçimi. Bütün işlemler gövdedeki action parametresine göre dallanır. Sektörün standardı budur: başka bir panelden geliyorsanız istemcinizde yalnızca URL ve anahtar değişir, kodun kendisi değişmez.

HTTP Metodu
POST
Uç Nokta
https://dev.netcloud.net.tr/api/v2
Cevap Formatı
JSON (UTF-8)
İstek Sınırı
300 istek / dakika
Anahtarınız burada görünecek. Dokümantasyonun tamamı herkese açıktır; istek atabilmek için giriş yapmanız ya da ücretsiz hesap açmanız yeterli.

Bu API ile ne yapabilirsiniz

Sıfır efor geçiş Perfect Panel v2 sözleşmesine birebir uyar. Mevcut bot ya da üst panelinizde yalnızca uç nokta ve anahtar değişir.
Özel fiyatınız API'ye de yansır Servis listesi SİZİN ödeyeceğiniz fiyatı döner. Katalogla sipariş arasında fiyat farkı oluşmaz, marjınızı yanlış hesaplamazsınız.
Tek istekte 100 kayıt Durum, telafi ve iptal sorguları toplu çalışır. Döngü içinde 100 ayrı istek atmanıza gerek yok.
Sipariş açmakla bitmiyor Drip-feed, telafi talebi ve iptal aynı uç noktadan yönetilir; müşteri desteğini kendi panelinizden verirsiniz.

Hızlı başlangıç

3 adım
  1. Anahtarınızı alın Hesabım sayfasındaki API anahtarını kopyalayın. Anahtar hesabınızın kimliğidir; paylaşmayın, sızdırdığınızı düşünüyorsanız tek tıkla yenileyin.
  2. Bağlantıyı doğrulayın Aşağıdaki isteği çalıştırın. Bakiyeniz döndüyse entegrasyon hazır demektir.
  3. Servis listesini çekip sipariş açın services ile kataloğu alın, döndüğü service id'siyle add çağırın. Kataloğu her istekte değil, günde birkaç kez önbelleğe alarak çekin.
cURL · bağlantı testi
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=balance"

Sözleşme kuralları

önce bunu okuyun
Hata da HTTP 200 döner. Kimlik hatası, geçersiz servis, yetersiz bakiye — hepsi HTTP 200 ile ve gövdede {"error": "..."} olarak gelir. Perfect Panel standardı böyle davranır; 4xx dönmek istemcilerin yeniden deneme ve alarm mantığını tetikler, entegrasyonu kırar.
Yanlış
if ($http !== 200) {
    // Buraya ASLA girmezsiniz.
    // Hatalar sessizce "başarılı" sayılır.
}
Doğru
$veri = json_decode($cevap, true);

if (isset($veri['error'])) {
    throw new RuntimeException($veri['error']);
}

Diğer dört kural

  1. Toplu isteklerde cevap KARIŞIK gelir status, refill, refill_status ve cancel toplu çağrıldığında başarılı ve hatalı kayıtlar aynı gövdede döner. Üst seviyede error yoksa istek başarılıdır; her kaydı ayrı ayrı okuyun.
  2. Para değerleri STRING döner charge, rate ve balance metindir. Float'a çevirip toplarsanız kuruş kaybedersiniz; kendi tarafınızda da ondalık/desimal tipi kullanın. Para birimi: TRY.
  3. Yalnızca kendi kayıtlarınız Başka bir müşterinin siparişi "yetkiniz yok" bile demeden Incorrect order ID döner. Sahiplik sorgunun parçasıdır, sonradan yapılan bir kontrol değil.
  4. İstek sınırı dakikada 300 Sınır IP'ye değil hesaba uygulanır; aynı anahtarla kaç sunucudan bağlandığınız fark etmez. Aşıldığında yine HTTP 200 ve {"error": "Rate limit exceeded"} gelir. İstemcinizi artan bekleme (backoff) ile yazın.
İstekleri her zaman HTTPS üzerinden gönderin ve anahtarı sunucu tarafında tutun. Anahtar tarayıcı koduna, mobil uygulama paketine ya da genel bir depoya konursa hesabınızın tamamı ele geçirilebilir.

Servis listesi

action=services

Satıştaki tüm servisler, SİZİN gördüğünüz fiyatlarla. Özel fiyatlandırmanız varsa liste de o fiyatı döner; katalogla sipariş arasında fiyat farkı oluşmaz.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: services

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=services"

Cevap

JSON · HTTP 200
[
    {
        "service": 1,
        "name": "Instagram Takipci [Turk] [Gercek]",
        "type": "Default",
        "category": "Instagram",
        "rate": "12.50",
        "min": "50",
        "max": "10000",
        "refill": true,
        "cancel": true
    },
    {
        "service": 2,
        "name": "Instagram Ozel Yorum",
        "type": "Custom Comments",
        "category": "Instagram",
        "rate": "84.00",
        "min": "10",
        "max": "1500",
        "refill": false,
        "cancel": false
    }
]
rate değeri 1000 adet başına fiyattır ve TRY cinsindendir. refill / cancel alanları o servis için telafi ve iptal desteğinin açık olup olmadığını söyler; kapalıysa ilgili aksiyon hata döner.

Sipariş oluştur

action=add

Tek uç nokta, servis tipine göre değişen alanlar. Bakiye sipariş kaydıyla AYNI işlemde düşer; yetersizse sipariş hiç oluşmaz.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: add
service integer Evet Servis ID (services aksiyonundan)
link string Evet Siparişin işleyeceği bağlantı
quantity integer Evet Adet. Servisin min/max aralığında olmalı

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=add" \
  -d "service=1" \
  -d "link=https://instagram.com/hesabiniz" \
  -d "quantity=1000"

Cevap

JSON · HTTP 200
{
    "order": 23501
}
Cevaptaki order değeri INTEGER döner; status ve refill aksiyonlarında bu id kullanılır.

Sipariş durumu

action=status

Tek sipariş ya da tek istekte 100 siparişe kadar toplu sorgu.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: status
order integer Evet Sipariş ID

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=status" \
  -d "order=23501"

Cevap

JSON · HTTP 200
{
    "charge": "12.50",
    "start_count": "3572",
    "status": "Partial",
    "remains": "157",
    "currency": "TRY"
}
charge ve currency sipariş anındaki değerlerdir; sonradan kur ya da fiyat değişse bile sabit kalır.

Telafi (refill) talebi

action=refill

Tamamlanmış bir siparişte düşüş yaşandıysa telafi talebi açar.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: refill
order integer Evet Sipariş ID

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=refill" \
  -d "order=23501"

Cevap

JSON · HTTP 200
{
    "refill": "1"
}
Tekil cevapta refill değeri STRING döner (sözleşme böyle), çoklu cevapta INTEGER. Talep yalnızca durumu Completed olan, servisinde telafi açık olan ve halihazırda açık talebi bulunmayan siparişler için açılır.

Telafi durumu

action=refill_status

Açılmış telafi taleplerinin ne olduğunu sorgular.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: refill_status
refill integer Evet Telafi ID (refill aksiyonunun dönüşü)

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=refill_status" \
  -d "refill=1"

Cevap

JSON · HTTP 200
{
    "status": "Completed"
}

Sipariş iptali

action=cancel

İptal talebi web panelindekiyle AYNI kurallardan geçer — iki kapı aynı kararı verir.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: cancel
orders string Evet Virgülle ayrılmış sipariş ID listesi (en fazla 100). Tekil `order` da kabul edilir

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=cancel" \
  -d "orders=23501,23502"

Cevap

JSON · HTTP 200
[
    {
        "order": 23501,
        "cancel": 1
    },
    {
        "order": 23502,
        "cancel": {
            "error": "Cancel is not available for this service"
        }
    }
]
cancel: 1 "talep KABUL EDİLDİ" demektir; "iptal tamamlandı" ya da "para iade edildi" DEMEK DEĞİLDİR. İncelemeye alınan talep de kabul edilmiş sayılır. Kesin durumu status aksiyonundan takip edin.

Bakiye

action=balance

Hesabınızın anlık bakiyesi ve para birimi.

Parametreler

Parametre Tip Zorunlu Açıklama
key string Evet API anahtarınız
action string Evet Sabit değer: balance

İstek

cURL
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \
  -d "key=API_ANAHTARINIZ" \
  -d "action=balance"

Cevap

JSON · HTTP 200
{
    "balance": "1250.84292",
    "currency": "TRY"
}
Bakiye STRING döner. Para değerini asla float olarak okumayın; 0.1 + 0.2 dünyasında kuruş kaybolur.

Hata kodları

{"error": "..."}

Aşağıdaki metinler sözleşmenin parçasıdır ve değişmez; istemciler onlara göre dallanır. Buradaki açıklamalar yalnızca sizin için, cevapta yer almaz.

error Ne demek
Kimlik
Invalid API key Anahtar yok, yanlış, hesap pasif ya da hesabın API erişimi kapalı.
API is disabled Panel genelinde API kapatılmış. Geçici bir durumdur, tekrar deneyin.
Rate limit exceeded Dakikalık istek sınırı aşıldı. İstemciyi geri çekilme (backoff) ile yazın.
İstek
Invalid action action parametresi boş ya da desteklenmeyen bir değer.
Sipariş
Incorrect service ID Servis yok, pasif ya da kategorisi kapatılmış. Vitrinde görünmeyen servis id ile de sipariş edilemez.
Incorrect link link boş ya da 2048 karakteri aşıyor.
Incorrect quantity quantity sayı değil ya da 1'den küçük.
The quantity is less than the minimum (50) Adet servisin alt sınırının altında. Parantez içindeki değer servise göre değişir.
The quantity is greater than the maximum (10000) Adet servisin üst sınırının üstünde.
Not enough funds on balance Bakiye yetersiz. Sipariş kaydı oluşturulmadı, yetim satır kalmaz.
Drip-feed
Incorrect runs runs sayı değil ya da 1-1000 aralığının dışında.
Incorrect interval interval sayı değil ya da 0-10080 (7 gün) aralığının dışında.
Both runs and interval parameters are required İkisinden yalnızca biri gönderildi. Yarım drip-feed diye bir şey yoktur.
Drip-feed is not available for this service Servisin drip-feed desteği kapalı.
Özel yorum
Incorrect comments comments metin değil ya da 65535 karakteri aşıyor.
Comments are required for this service Servis tipi yorum listesi istiyor ama comments boş geldi.
The number of comments must be equal to the quantity Yorum satırı sayısı quantity ile eşit değil.
Sorgu
Incorrect order ID Sipariş yok ya da SİZE ait değil. Başkasının siparişi "yetkin yok" bile demeden yok sayılır.
You can request up to 100 orders at once Toplu istekte 100'den fazla sipariş id gönderildi.
You can request up to 100 refills at once Toplu istekte 100'den fazla telafi id gönderildi.
Telafi
Refill not found Telafi kaydı yok ya da size ait değil.
Refill is not available for this service Servisin telafi desteği kapalı (services cevabındaki refill alanı false).
Refill already requested Bu sipariş için sonuçlanmamış bir telafi talebi zaten var.
Telafi / İptal
Incorrect order status Siparişin durumu bu işleme uygun değil (telafi için Completed olmalı; iptal için işlenmeye başlamamış olmalı).
İptal
Cancel is not available for this service Servisin iptal desteği kapalı (services cevabındaki cancel alanı false).

Durum değerleri

status

Panel içi durumlarımız daha ayrıntılıdır; API'ye çıkarken standardın tanıdığı değerlerde birleştirilir. Kuyruk ayrıntımızı bilmek zorunda değilsiniz.

Sipariş durumu

Değer Anlamı
Pending Sipariş alındı, sağlayıcıya henüz iletilmedi ya da iletiliyor. (Panelde: Bekliyor, Gönderiliyor)
In progress Sağlayıcı işlemeye başladı, teslimat sürüyor. (Panelde: Devam Ediyor)
Processing Ara durum: sipariş inceleme ya da hazırlık aşamasında. (Panelde: İşleniyor, İnceleme Gerekli)
Completed Teslimat tamamlandı. Telafi talebi ancak bu durumda açılır. (Panelde: Tamamlandı)
Partial Kısmen teslim edildi; teslim edilmeyen kısım iade edildi. remains alanı kalanı gösterir. (Panelde: Kısmi)
Canceled Sipariş iptal edildi ya da başarısız oldu; ücret iade edildi. (Panelde: İptal Edildi, Başarısız)
Refunded Ücret tamamen iade edildi. (Panelde: İade Edildi)

Telafi durumu

Değer Anlamı
Pending Talep alındı, sağlayıcıya iletilmeyi bekliyor. (Panelde: Bekliyor)
In progress Telafi sürüyor. (Panelde: Devam Ediyor)
Completed Telafi tamamlandı. (Panelde: Tamamlandı)
Rejected Sağlayıcı talebi reddetti. (Panelde: Reddedildi)
Error Telafi sırasında hata oluştu; destek talebi açabilirsiniz. (Panelde: Hata)

Kod örnekleri

çalışır halde

Üç örnek de aynı sözleşmeyi uygular: HTTP kodu okunmaz, hata error alanından yakalanır.

PHP
<?php

final class PikoApi
{
    public function __construct(
        private string $endpoint = 'https://dev.netcloud.net.tr/api/v2',
        private string $key = 'API_ANAHTARINIZ',
    ) {}

    /** @return array<string, mixed> */
    public function istek(array $govde): array
    {
        $ch = curl_init($this->endpoint);

        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST           => true,
            CURLOPT_POSTFIELDS     => http_build_query($govde + ['key' => $this->key]),
            CURLOPT_TIMEOUT        => 30,
            CURLOPT_SSL_VERIFYPEER => true,
        ]);

        $cevap = curl_exec($ch);
        $hata  = curl_error($ch);
        curl_close($ch);

        if ($cevap === false) {
            throw new RuntimeException('Bağlantı hatası: '.$hata);
        }

        $veri = json_decode($cevap, true, 512, JSON_THROW_ON_ERROR);

        // ÖNEMLİ: HTTP kodu her zaman 200'dür, hata GÖVDEDE gelir.
        if (isset($veri['error'])) {
            throw new RuntimeException($veri['error']);
        }

        return $veri;
    }

    public function servisler(): array
    {
        return $this->istek(['action' => 'services']);
    }

    public function bakiye(): array
    {
        return $this->istek(['action' => 'balance']);
    }

    public function siparisVer(int $servis, string $link, int $adet): array
    {
        return $this->istek([
            'action'   => 'add',
            'service'  => $servis,
            'link'     => $link,
            'quantity' => $adet,
        ]);
    }

    /** Toplu durum: tek istekte en fazla 100 sipariş. */
    public function durum(array $siparisler): array
    {
        return $this->istek([
            'action' => 'status',
            'orders' => implode(',', $siparisler),
        ]);
    }
}

$api = new PikoApi();

print_r($api->bakiye());
print_r($api->durum([23501, 23502]));

Takıldığınız bir yer mi var

Entegrasyon sırasında beklemediğiniz bir cevap alırsanız gönderdiğiniz isteği ve aldığınız gövdeyi birlikte iletin; anahtarı göndermeyin, hesabınızı zaten tanıyoruz.