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.
Bu API ile ne yapabilirsiniz
Hızlı başlangıç
3 adım
- 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.
- Bağlantıyı doğrulayın Aşağıdaki isteği çalıştırın. Bakiyeniz döndüyse entegrasyon hazır demektir.
-
Servis listesini çekip sipariş açın
servicesile kataloğu alın, döndüğüserviceid'siyleaddçağırın. Kataloğu her istekte değil, günde birkaç kez önbelleğe alarak çekin.
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
{"error": "..."} olarak gelir. Perfect Panel standardı böyle davranır; 4xx dönmek istemcilerin yeniden deneme ve alarm mantığını tetikler, entegrasyonu kırar.
if ($http !== 200) {
// Buraya ASLA girmezsiniz.
// Hatalar sessizce "başarılı" sayılır.
}
$veri = json_decode($cevap, true);
if (isset($veri['error'])) {
throw new RuntimeException($veri['error']);
}
Diğer dört kural
- 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.
-
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. -
Yalnızca kendi kayıtlarınız
Başka bir müşterinin siparişi "yetkiniz yok" bile demeden
Incorrect order IDdöner. Sahiplik sorgunun parçasıdır, sonradan yapılan bir kontrol değil. -
İ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.
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=services"
Cevap
[
{
"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
}
]
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 -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
{
"order": 23501
}
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 |
link |
string | Evet | Siparişin işleyeceği bağlantı |
quantity |
integer | Evet | HER tekrarda gönderilecek adet |
runs |
integer | Evet | Tekrar sayısı (1 - 1000) |
interval |
integer | Evet | Tekrarlar arası dakika (0 - 10080) |
İstek
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=100" \ -d "runs=10" \ -d "interval=60"
Cevap
{
"order": 23502
}
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 (type alanı Custom Comments / Custom List / Mentions Custom List) |
link |
string | Evet | Siparişin işleyeceği bağlantı |
quantity |
integer | Evet | Adet. Yorum satırı sayısıyla AYNI olmalı |
comments |
string | Evet | Satır başına bir yorum. Gövde URL kodlu gönderildiği için satır sonu %0A olur (\n ve \r\n kabul edilir) |
İstek
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=add" \ -d "service=2" \ -d "link=https://instagram.com/p/XXXXXXX" \ -d "quantity=3" \ -d "comments=Harika%0AÇok güzel%0ATebrikler"
Cevap
{
"order": 23503
}
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=status" \ -d "order=23501"
Cevap
{
"charge": "12.50",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "TRY"
}
Parametreler
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
key |
string | Evet | API anahtarınız |
action |
string | Evet | Sabit değer: status |
orders |
string | Evet | Virgülle ayrılmış sipariş ID listesi (en fazla 100) |
İstek
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=status" \ -d "orders=23501,23502,99999"
Cevap
{
"23501": {
"charge": "12.50",
"start_count": "3572",
"status": "Partial",
"remains": "157",
"currency": "TRY"
},
"23502": {
"charge": "8.40",
"start_count": "234",
"status": "In progress",
"remains": "10",
"currency": "TRY"
},
"99999": {
"error": "Incorrect order ID"
}
}
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=refill" \ -d "order=23501"
Cevap
{
"refill": "1"
}
Parametreler
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
key |
string | Evet | API anahtarınız |
action |
string | Evet | Sabit değer: refill |
orders |
string | Evet | Virgülle ayrılmış sipariş ID listesi (en fazla 100) |
İstek
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=refill" \ -d "orders=23501,23502"
Cevap
[
{
"order": 23501,
"refill": 1
},
{
"order": 23502,
"refill": {
"error": "Incorrect order status"
}
}
]
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=refill_status" \ -d "refill=1"
Cevap
{
"status": "Completed"
}
Parametreler
| Parametre | Tip | Zorunlu | Açıklama |
|---|---|---|---|
key |
string | Evet | API anahtarınız |
action |
string | Evet | Sabit değer: refill_status |
refills |
string | Evet | Virgülle ayrılmış telafi ID listesi (en fazla 100) |
İstek
curl -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=refill_status" \ -d "refills=1,2"
Cevap
[
{
"refill": 1,
"status": "Completed"
},
{
"refill": 2,
"status": {
"error": "Refill not found"
}
}
]
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=cancel" \ -d "orders=23501,23502"
Cevap
[
{
"order": 23501,
"cancel": 1
},
{
"order": 23502,
"cancel": {
"error": "Cancel is not available for this service"
}
}
]
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 -s -X POST https://dev.netcloud.net.tr/api/v2 \ -d "key=API_ANAHTARINIZ" \ -d "action=balance"
Cevap
{
"balance": "1250.84292",
"currency": "TRY"
}
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
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]));
import requests
ENDPOINT = "https://dev.netcloud.net.tr/api/v2"
KEY = "API_ANAHTARINIZ"
def istek(**govde):
govde["key"] = KEY
cevap = requests.post(ENDPOINT, data=govde, timeout=30)
# raise_for_status() bu API'de iş görmez: hata da 200 döner.
veri = cevap.json()
if "error" in veri:
raise RuntimeError(veri["error"])
return veri
print(istek(action="balance"))
print(istek(action="status", orders="23501,23502"))
siparis = istek(
action="add",
service=1,
link="https://instagram.com/hesabiniz",
quantity=1000,
)
print(siparis["order"])
// Node 18+. Üst düzey await kullanıldığı için dosya bir ES
// modülü olmalı: uzantıyı .mjs yapın ya da package.json'a
// "type": "module" ekleyin.
const ENDPOINT = 'https://dev.netcloud.net.tr/api/v2';
const KEY = 'API_ANAHTARINIZ';
async function istek(govde) {
const cevap = await fetch(ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({ ...govde, key: KEY }),
});
// cevap.ok her zaman true olur; hata gövdededir.
const veri = await cevap.json();
if (veri.error) {
throw new Error(veri.error);
}
return veri;
}
const bakiye = await istek({ action: 'balance' });
console.log(bakiye.balance, bakiye.currency);
const siparis = await istek({
action: 'add',
service: 1,
link: 'https://instagram.com/kullanici',
quantity: 1000,
});
console.log(siparis.order);
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.