Eşleşen uç nokta yok
Şununla eşleşen bir şey yok:
Uygulamanızın X-App-Secret başlığını gönderin ve anahtarları doğrulamak ile oturum yürütmek için /api/auth/* adresine JSON POST'layın. Anahtarları /api/admin/* üzerinden Bearer token ile üretin. Yanıtlar her zaman { "success": true|false, … } biçimindedir.
Giriş
PWF Auth API'si REST etrafında düzenlenmiştir. Tüm istekler ve yanıtlar HTTPS üzerinden JSON'dur. Üç uç nokta ailesi vardır:
- İstemci API (
/api/auth/*,/api/update/*) — dağıttığınız uygulamadan, uygulamanızın secret'ıyla çağrılır. - Admin API (
/api/admin/*) — anahtar ve uygulama yönetimi, Bearer token ile doğrulanır. - Müşteri / bayi API (
/api/customer/*,/api/reseller/*) — self servis portallar.
Aşağıdaki tüm yollar bu temel URL'ye görelidir. Her uç nokta HTTPS gerektirir; düz HTTP istekleri yönlendirilir.
Prefer machines? The whole surface is described in openapi.json (OpenAPI 3.1) — import it into Postman, Insomnia, or a code generator.
API and platform changes are announced in the changelog — breaking changes are always flagged there first.
Kimlik doğrulama
İstemci uç noktaları — App Secret
Uygulamanızın secret'ını X-App-Secret başlığında gönderin. Panel → uygulamanız içinde bulabilirsiniz. Secret, isteğin hangi uygulamaya ait olduğunu belirler.
curl https://pwfauth.com/api/auth/check-key.php \
-H "X-App-Secret: 9f02532d9c60… # 64-char hex, from your dashboard" \
-H "Content-Type: application/json" \
-d '{"license_key":"XXXXX-XXXXX-XXXXX-XXXXX"}'
Admin uç noktaları — Bearer token
JWT almak için /api/admin/login.php ile kimlik doğrulayın, sonra her admin çağrısında Authorization: Bearer <token> olarak gönderin.
TOKEN=$(curl -s https://pwfauth.com/api/admin/login.php \
-d '{"username":"admin","password":"…"}' | jq -r .token)
curl https://pwfauth.com/api/admin/keys.php \
-H "Authorization: Bearer $TOKEN"
Şifreli zarf
SDK düzeyindeki uç noktalar düz JSON yerine AES-256-CBC + HMAC-SHA256 zarfı kullanır. Hat biçimi: {"p": base64(IV || ciphertext), "t": unix_timestamp, "s": hmac_sha256_hex(p + t)} — şifreleme ve MAC anahtarlarının ikisi de app secret'ınızdan türetilir, ekstra anahtar değişimi gerekmez.
{
"p": "aXYxNmJ5dGVzY2lwaGVydGV4dA…", // base64( IV || AES-256-CBC ciphertext )
"t": 1785671000, // unix timestamp (±300s accepted)
"s": "b7fd09…" // hmac_sha256_hex( p + t, mac_key )
}
App secret + şifreli zarf işaretli uç noktalar bunu istek için zorunlu tutar ve yanıtı da şifreli döndürür. check-key.php otomatik algılar: düz JSON gönderirseniz düz JSON alırsınız (bu sayfadaki curl örnekleri bu yüzden çalışır); zarf gönderirseniz yanıt şifrelenir.
±300 saniyeden eski zarflar reddedilir; istemci saatini makul ölçüde doğru tutun. Bunu elle yazmanız asla gerekmez: açık kaynak örnek istemciler (VB.NET, C#, Python) hazır bir CryptoEnvelope uygulamasıyla gelir.
How the envelope is built
Both directions use the same recipe. Two keys are derived from your app secret, so every app gets distinct encryption and signing keys:
enc_key = SHA256("enc:" + app_secret) # 32 bytes
mac_key = SHA256("mac:" + app_secret) # 32 bytes
# client → server (and server → client — same recipe)
iv = random_bytes(16)
ct = AES-256-CBC(enc_key, iv, json_body) # PKCS#7 padding
p = base64(iv || ct)
t = unix_time() # ±300 s accepted
s = hex(HMAC-SHA256(p + str(t), mac_key))
send { "p": p, "t": t, "s": s }
# receiving: verify s FIRST (constant-time), check |now - t| ≤ 300,
# then base64-decode p, split off the 16-byte IV, decrypt the rest.
Which endpoints require it
Each endpoint card carries a colour-coded auth pill; this table is the same information at a glance:
| Auth model | Endpoints |
|---|---|
| Herkese açık | app/changelog · app/pricing · admin/login |
| App secret · düz veya zarf | auth/check-key |
| App Secret | auth/trial · auth/request-hwid-reset · auth/account-register · auth/account-login · auth/change-password · update/validate · update/download |
| App secret + şifreli zarf | auth/login · auth/heartbeat · auth/logout · app/text · app/slides · app/info · app/social-click · update/check |
| Bearer | admin/* |
| Fulfillment secret | app/fulfill |
Yanıtlar ve hatalar
Her yanıt bir boolean success taşır. Hatalar; insan için bir message ve makine için kararlı bir error_code ekler:
{
"success": false,
"message": "This license key has been banned.",
"error_code": "BANNED"
}
| error_code | Anlamı |
|---|---|
MISSING_FIELDS | Zorunlu bir gövde alanı eksik. |
INVALID_KEY | Bu uygulama için lisans anahtarı mevcut değil. |
INVALID_CREDENTIALS | Kullanıcı adı/şifre çifti reddedildi (kullanıcı hesapları + admin girişi). |
HWID_MISMATCH | Anahtar başka bir cihaza bağlı. |
EXPIRED | Lisansın süresi dolmuş. |
BANNED / PAUSED | Anahtar, sahibi tarafından yasaklanmış veya duraklatılmış. |
MAINTENANCE | Uygulama bakım modunda. |
SESSION_EXPIRED / SESSION_MISMATCH | Heartbeat oturumu geçersiz. |
TOO_MANY_ATTEMPTS | Login brute-force lockout — the account is locked temporarily; retry_after in the response says for how many seconds. |
TRIAL_DISABLED / TRIAL_USED / TRIAL_LIMIT | Deneme oluşturma reddedildi — bu uygulamada kapalı, bu cihazda zaten kullanılmış veya IP başına sınıra ulaşılmış. |
HTTP durum kodları
| error_code | Anlamı |
|---|---|
200 | Başarılı — sonuç JSON gövdesinde. |
400 | Doğrulama başarısız — eksik ya da hatalı alanlar (error_code'a bakın). |
401 | Eksik veya geçersiz X-App-Secret / Bearer token. |
403 | Kimlik doğrulandı ama izin yok (yanlış uygulama, iptal edilmiş token…). |
404 | Kaynak bulunamadı. |
405 | Bu uç nokta için yanlış HTTP yöntemi. |
429 | Rate limited — wait for the Retry-After header before retrying. |
500 | Sunucu hatası — mesaj bilinçli olarak genel; sonra tekrar deneyin. |
Hız sınırları ve adil kullanım
Genel bir istek kotası yok, ancak birkaç kötüye kullanım koruması aktif:
- Admin girişi brute-force korumalıdır — tekrarlanan başarısızlıklar hesabı geçici kilitler.
- Denemeler cihaz (HWID) ve IP başına sınırlıdır; aşınca
TRIAL_LIMITdöner. - Secret yenileme, yanlışlıkla dönen rotasyon döngülerini durdurmak için uygulama başına hız sınırlıdır.
- Heartbeat'leri login yanıtının verdiği aralıkta tutun (varsayılan 30 sn) — daha sık göndermenin faydası yok.
Hızlı başlangıç
Minimum entegrasyon: uygulamanız açılırken anahtarı doğrulayın, sonra oturumu canlı tutmak için heartbeat gönderin.
# Validate a key from the terminal (plain JSON works here)
curl -X POST https://pwfauth.com/api/auth/check-key.php \
-H "X-App-Secret: $APP_SECRET" \
-d '{"license_key":"XXXXX-XXXXX-XXXXX-XXXXX"}'
# → { "success": true, "valid": true, "key": { "status": "active", … } }
Not: tam oturum akışı (login → heartbeat → logout) şifreli zarfı kullanır, dolayısıyla elle curl'lenemez. Panel içi Quick Start (gerçek kimlik bilgilerinizle 9 dilde çalışan parçacıklar üretir) veya açık kaynak örnek istemcilerle dakikalar içinde bağlayın.
The same flow with an official SDK
Login, heartbeat and the server-side kill switch in a few lines — the SDK handles the encrypted envelope for you:
// dotnet add package PWFAuth
using PWFAuth;
var client = new PwfClient(APP_SECRET);
client.SessionEnded += (s, e) => // ban / pause / expiry / revoke / offline
{
Console.WriteLine($"{e.ErrorCode}: {e.Message}");
Environment.Exit(0);
};
var login = await client.LoginAsync("XXXXX-XXXXX-XXXXX-XXXXX");
if (!login.Success) { Console.WriteLine(login.Message); return; }
client.StartHeartbeat(); // keeps the session alive AND enforces the kill switch
' dotnet add package PWFAuth
Dim client As New PwfClient(APP_SECRET)
AddHandler client.SessionEnded, Sub(s, e) ' ban / pause / expiry / revoke / offline
MessageBox.Show(e.Message)
Application.Exit()
End Sub
Dim login = Await client.LoginAsync("XXXXX-XXXXX-XXXXX-XXXXX")
If login.Success Then client.StartHeartbeat()
# pip install pwfauth
import sys
from pwfauth import PwfClient
client = PwfClient(APP_SECRET)
client.on_session_ended = lambda code, msg: sys.exit(msg) # kill switch
login = client.login("XXXXX-XXXXX-XXXXX-XXXXX")
if not login.success:
sys.exit(login.message)
client.start_heartbeat() # keeps the session alive AND enforces the kill switch
// npm install pwfauth
import { PwfClient } from 'pwfauth';
const client = new PwfClient(process.env.PWFAUTH_SECRET);
client.on('sessionEnded', ({ errorCode, message }) => { // kill switch
console.error(`${errorCode}: ${message}`);
process.exit(1);
});
const login = await client.login('XXXXX-XXXXX-XXXXX-XXXXX');
if (!login.success) { console.error(login.message); process.exit(1); }
client.startHeartbeat(); // keeps the session alive AND enforces the kill switch
Lisanslar ve oturumlar
İlk kullanımda anahtarı etkinleştirir, cihazın HWID'sine bağlar ve bir oturum açar. Sonraki girişlerde yeniden doğrular ve yeni oturum başlatır. En eski oturumu emekliye ayırarak max_devices sınırını uygular.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
license_key | zorunlu | Etkinleştirilecek / doğrulanacak lisans anahtarı. |
hwid | zorunlu | Cihazın kararlı donanım parmak izi. |
{
"success": true,
"session_id": "8f2c…",
"user": {
"license_key": "XXXXX-XXXXX-XXXXX-XXXXX",
"key_type": "days", "duration": 30,
"expires_at": "2026-09-01T12:00:00Z",
"days_remaining": 30, "status": "active"
},
"features": { "pro_tier": true },
"heartbeat_interval": 30
}
Oturumu aktif tutar. login'in döndürdüğü heartbeat_interval saniyede bir çağırın. Çağırmayı bırakırsanız oturum sunucu tarafında kapatılır.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
session_id | zorunlu | login'in döndürdüğü oturum. |
license_key | isteğe bağlı | Gönderilirse oturum bu anahtara ait olmalıdır. |
{ "success": true, "message": "Heartbeat received" }
// the moment the key is banned / paused / expired / reset, the SAME call answers:
{ "success": false, "error_code": "BANNED",
"message": "This license key has been banned." } // session is dropped — log the user out
Oturumu hemen kapatır (ör. uygulama çıkışında). Gövde: session_id zorunlu, license_key isteğe bağlı.
Hafif durum sorgusu — oturum açılmaz, HWID bağlanmaz. "Bu anahtar hâlâ geçerli mi?" kontrolü için idealdir.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
license_key | zorunlu | İncelenecek anahtar. |
curl -X POST https://pwfauth.com/api/auth/check-key.php \
-H "X-App-Secret: $APP_SECRET" \
-d '{"license_key":"XXXXX-XXXXX-XXXXX-XXXXX"}'
var http = new HttpClient();
http.DefaultRequestHeaders.Add("X-App-Secret", APP_SECRET);
var res = await http.PostAsync("https://pwfauth.com/api/auth/check-key.php",
new StringContent("{\"license_key\":\"XXXXX-XXXXX-XXXXX-XXXXX\"}"));
import urllib.request, json
req = urllib.request.Request("https://pwfauth.com/api/auth/check-key.php",
data=json.dumps({"license_key": "XXXXX-XXXXX-XXXXX-XXXXX"}).encode(),
headers={"X-App-Secret": APP_SECRET})
print(json.load(urllib.request.urlopen(req)))
const res = await fetch('https://pwfauth.com/api/auth/check-key.php', {
method: 'POST',
headers: { 'X-App-Secret': process.env.APP_SECRET },
body: JSON.stringify({ license_key: 'XXXXX-XXXXX-XXXXX-XXXXX' })
});
console.log(await res.json());
$ch = curl_init('https://pwfauth.com/api/auth/check-key.php');
curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-App-Secret: ' . $APP_SECRET],
CURLOPT_POSTFIELDS => '{"license_key":"XXXXX-XXXXX-XXXXX-XXXXX"}']);
$res = json_decode(curl_exec($ch), true);
{
"success": true, "valid": true,
"key": {
"status": "active", "key_type": "days", "duration": 30,
"activated_at": "2026-08-02T12:00:00Z",
"expires_at": "2026-09-01T12:00:00Z",
"days_remaining": 30, "max_devices": 1
}
}
HWID bağlamasız ve oturumsuz hafif lisans doğrulaması — tam login öncesi ön kontrol için idealdir. Düz JSON girer, düz JSON çıkar.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
license_key | zorunlu | İncelenecek anahtar. |
Kullanıcı makine değiştirdiğinde uygulama içi diyaloğunuzdan HWID sıfırlama talebi gönderir. Uygulama sahibi panelden onaylar.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
license_key or username | zorunlu | Kimin bağlantısının sıfırlanacağını belirtir. |
reason | isteğe bağlı | Sahibine gösterilen not. |
Ücretsiz Denemeler
İstek yapan cihaza bağlı, süreli bir deneme anahtarı üretir. Uygulama başına her HWID'ye bir deneme. Deneme süresini uygulama sahibi belirler.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
hwid | zorunlu | Denemeyi isteyen cihazın parmak izi. |
{
"success": true, "message": "Trial activated! You have 3 days.",
"trial_key": "TRIAL-1A2B3-C4D5E-F6A7B",
"session_id": "8f2c…",
"expires_at": "2026-08-23T12:00:00Z", "days_remaining": 3,
"user": { "key_type": "days", "status": "active", … },
"app": { "name": "…", "version": "…" }
}
Kullanıcı hesapları
Ham anahtarlar yerine kullanıcı adı/şifre girişini mi tercih ediyorsunuz? PWF Auth, bcrypt karma ve HWID bağlamalı eksiksiz bir hesap modeliyle gelir.
Son kullanıcı hesabı oluşturur. Gövde: username, password zorunlu, email isteğe bağlı.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
username | zorunlu | İstenen kullanıcı adı (uygulama başına benzersiz). |
password | zorunlu | Şifre (sunucuda karma olarak saklanır). |
email | isteğe bağlı | Hesabın iletişim e-postası. |
Kimlik doğrular ve cihaz bağlar. Gövde: username, password, hwid zorunlu. login ile aynı oturum biçimini döndürür.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
username | zorunlu | Hesap kullanıcı adı. |
password | zorunlu | Hesap şifresi. |
hwid | zorunlu | Oturumun bağlanacağı cihaz parmak izi. |
Kullanıcının şifresini değiştirir. Gövde: username, current_password, new_password zorunlu.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
username | zorunlu | Hesap kullanıcı adı. |
current_password | zorunlu | Mevcut şifre (değişiklikten önce doğrulanır). |
new_password | zorunlu | Yeni şifre. |
Uygulama İçeriği ve Uzaktan Yönetim
Bu uç noktalar, dağıttığınız uygulamanın panelde canlı düzenlediğiniz içeriği — metinler, slaytlar, fiyatlandırma, değişiklik günlüğü — güncelleme yayınlamadan çekmesini sağlar.
Uzak metin(ler)i getirir. ?name=… ile tek kayıt döner; onsuz uygulamanın tüm metinleri döner. Anahtar başına geçersiz kılmalar uygulama varsayılanlarını ezer. Lisans anahtarı Authorization: Bearer
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
?name | isteğe bağlı | Getirilecek metin anahtarı (tümü için boş bırakın). |
Uygulamanın aktif duyuru slaytlarını döndürür. Zarf gövdesi {"action":"get_slides"} gönderin; yanıt şifrelidir.
Uygulama meta verisi + sosyal bağlantılar (ad, marka, URL'ler). Zarflı yanıt.
Bir sosyal bağlantının tıklama sayacını artırır (paneldeki etkileşim istatistikleri için).
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
link_id | zorunlu | Sosyal bağlantının sayısal id'si. |
Tek uygulama için herkese açık, doğrulamasız değişiklik günlüğü akışı — istediğiniz yerde "Yenilikler" bileşeni oluşturun. Yalnızca yayımlanmış kayıtlar.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
?app_id | zorunlu | Değişiklik günlüğü okunacak uygulama. |
?limit | isteğe bağlı | 1–50, varsayılan 20. |
?since | isteğe bağlı | ISO tarihi — yalnızca bu tarihte/sonrasında yayımlananlar. |
?category | isteğe bağlı | Filtre: new / improved / fixed / removed / security / deprecated. |
Herkese açık fiyatlandırma yüzeyi: bir uygulamanın abonelik seviyeleri ve eski planları; POST satın alma siparişi oluşturur; ?action=check kullanıcının aktif aboneliğini okur.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
?app_id | zorunlu | Fiyatlandırması okunacak uygulama. |
?type | isteğe bağlı | levels veya plans (ikisi için boş bırakın). |
Otomatik ödeme ağ geçitleri için sunucudan sunucuya sipariş tamamlama — doğrulanmış bir IPN siparişi tamamlar, anahtar üretimini ve teslimatı tetikler. Panel ayarlarınızdaki fulfillment paylaşımlı secret'ıyla doğrulanır, asla kullanıcı oturumuyla değil.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
order_id | zorunlu | Tamamlanacak sipariş (ORD-…). |
secret | zorunlu | order_fulfill_secret değeriniz. |
payment_ref | isteğe bağlı | İsteğe bağlı ağ geçidi ödeme referansı. |
OTA güncellemeleri
Çağıran için daha yeni bir sürüm olup olmadığını sorar — kanal, OS/mimari filtreleri, minimum sürüm kapıları ve aşamalı dağıtımlar (aynı çağıran kararlı biçimde aynı kovaya düşer) dikkate alınır.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
v | zorunlu | Çağıranın mevcut sürümü (semver). |
channel | isteğe bağlı | stable (varsayılan), beta veya alpha. |
os / arch | isteğe bağlı | windows·macos·linux / x64·x86·arm64. |
hwid / license_key | isteğe bağlı | Kararlı dağıtım kovalaması için kullanılır. |
{
"success": true, "update_available": true,
"update": {
"version": "1.4.0", "channel": "stable",
"is_mandatory": false, "file_size": 5242880,
"sha256": "…", "changelog": "…",
"download_url": "api/update/download.php?v=1.4.0"
}
}
Belirli bir sürümün binary'sini akıtır. check.php'nin döndürdüğü download_url'u kullanın ve indirdikten sonra sha256'yı doğrulayın.
Webhooks
Turn events into HTTP calls to your server: key activations, bans, expiries, orders, new updates and more. Configure destinations per app (or for all apps) in the panel under Application → Webhooks, pick the events you care about, and PWF Auth POSTs a signed JSON body to your URL. Delivery is queue-based — expect it within a minute or two of the event, not in the same instant.
Delivery payload
{
"event": "key.activated",
"timestamp": "2026-08-20T14:07:02Z",
"data": {
"app_id": "01af6643-…",
"license_key": "XXXXX-XXXXX-XXXXX-XXXXX",
"hwid": "A1B2C3…"
}
}
Delivery headers
| Header | Açıklama |
|---|---|
X-Webhook-Id | Unique delivery id (whd_…). Stays the same across retries of one event — use it to deduplicate. |
X-Webhook-Timestamp | Unix timestamp of the delivery attempt. |
X-Webhook-Attempt | 1-based attempt counter. |
X-Webhook-Signature | Legacy signature: hex(HMAC-SHA256(body, secret)). |
X-Webhook-Signature-V2 | Preferred signature: t=<ts>,v1=hex(HMAC-SHA256(ts + "." + body, secret)) — the timestamp inside the MAC makes replays detectable. |
Verifying the signature
Always verify before trusting a delivery: compute the V2 MAC over timestamp + "." + raw body with your endpoint secret, compare in constant time, and reject stale timestamps (±5 minutes is plenty). Answer 2xx fast — heavy work belongs in your own queue.
// X-Webhook-Signature-V2: t=<ts>,v1=<hex>
[$t, $v1] = explode(',', $_SERVER['HTTP_X_WEBHOOK_SIGNATURE_V2'] ?? ',');
$t = substr($t, 2); $v1 = substr($v1, 3);
$raw = file_get_contents('php://input');
$ok = hash_equals(hash_hmac('sha256', $t . '.' . $raw, $secret), $v1)
&& abs(time() - (int)$t) < 300;
if (!$ok) { http_response_code(400); exit; }
http_response_code(200); // answer fast — queue heavy work
// X-Webhook-Signature-V2: t=<ts>,v1=<hex>
const [t, v1] = req.headers['x-webhook-signature-v2']
.split(',').map(kv => kv.split('=')[1]);
const mac = crypto.createHmac('sha256', secret)
.update(`${t}.${rawBody}`).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(v1))
&& Math.abs(Date.now() / 1000 - Number(t)) < 300;
res.sendStatus(ok ? 200 : 400); // answer fast — queue heavy work
# X-Webhook-Signature-V2: t=<ts>,v1=<hex>
import hmac, time
t, v1 = (kv.split("=", 1)[1]
for kv in request.headers["X-Webhook-Signature-V2"].split(","))
mac = hmac.new(secret, f"{t}.{raw_body}".encode(), "sha256").hexdigest()
ok = hmac.compare_digest(mac, v1) and abs(time.time() - int(t)) < 300
return ("", 200) if ok else ("", 400) # answer fast — queue heavy work
Retries & failure policy
- A delivery counts as successful on any
2xx/3xxanswered within 5 seconds. - Failures retry up to 5 attempts with widening gaps: 1 m → 5 m → 30 m → 2 h → 6 h.
X-Webhook-Idis minted once per event and reused on every retry — idempotency is oneseen?lookup away.- A destination that fails 20 times in a row is paused automatically; re-enable it from the panel (a
testevent button is right there).
Events
Subscribe to specific events or leave the filter empty to receive them all. event in the body tells you which one fired:
| Event | Fires when |
|---|---|
key.created | Keys are generated (panel or admin API). |
key.activated | A key's first successful login binds it to a device. |
key.banned / key.unbanned | A key is banned / unbanned. |
key.deleted | A key is deleted. |
key.rotated | A key string is rotated (the old string stops working). |
key.suspected_leak | Leak detection flags a key as suspected shared/leaked. |
key_expiring | A key approaches expiry (scheduled sweep). |
key_expired | A key expires (scheduled sweep). |
trial.created | A trial key is issued to a new device. |
hwid_reset.requested | A client requests a device (HWID) reset. |
new_order | A purchase order is created. |
order.approved | An order is approved and fulfilled. |
subscription.* | Subscription lifecycle: created / renewed / cancelled / renewal order created. |
update.published | A new application version is published. |
changelog.published | A changelog entry goes live. |
app.revoked | An application is revoked / disabled. |
suspicious_activity | The suspicious-activity heuristic fires. |
test | Manual test delivery from the panel. |
Admin API
Uygulama ve anahtar yönetimi için sunucu tarafı uç noktalar. Hepsi aşağıdaki login uç noktasından alınan Authorization: Bearer token'ı gerektirir.
Şifrenizi bir betikte saklamak istemiyor musunuz? Panel → Profil → API Token'ları bölümünden bir Personal Access Token üretin ve Bearer değeri olarak kullanın (pwf_…). Siz iptal edene kadar süresi dolmaz, her /api/admin/* uç noktasında çalışır ve tasarım gereği kimlik bilgisi yönetiminden (şifre, e-posta, 2FA, yeni token üretme) men edilmiştir.
Kimlik bilgilerini JWT ile takas eder. 2FA etkinse requires_2fa + /api/admin/totp.php ile tamamlanacak bir step1_token döndürür.
| Gövde alanı | Zor. | Açıklama |
|---|---|---|
username | zorunlu | Admin kullanıcı adı. |
password | zorunlu | Admin şifresi. |
Toplu lisans anahtarı üretir. Aynı uç nokta GET (listele), PUT (düzenle), DELETE ve ?action=ban|pause|extend|reset-hwid, ?action=export gibi eylem sorgularını da destekler.
curl -X POST https://pwfauth.com/api/admin/keys.php \
-H "Authorization: Bearer $TOKEN" \
-d '{"app_id":"01af6643-cf3a-4280-b9ce-cb5fa8ae987c",
"count":100,"key_type":"days","duration_value":30}'
Admin yüzeyi ayrıca apps, sessions, updates, feature-flags, webhooks, analytics, audit, resellers ve fazlasını kapsar — hepsi /api/admin/ altında, aynı Bearer doğrulamasıyla. Keşfetmek için panele giriş yapın.
SDK'lar
REST API, HTTP isteği gönderebilen her şeyden çalışır. VB.NET / C# için resmî tek dosyalık SDK'lar; Python ve PHP için birinci sınıf örnekler mevcut. Geri kalan her şey — Node, Go, Rust, Java, Swift — yukarıda belgelenen aynı JSON uç noktalarıyla konuşur.
- Açık kaynak örnek istemciler (VB.NET · C# · Python) — tam login/heartbeat/zarf akışları, kopyalamaya hazır
- Panel içi Quick Start — gerçek kimlik bilgilerinizle 9 dilde çalışan parçacıklar üreten 5 rehberli adım
- OpenAPI 3.1 spec (
openapi.json) — one-click import into Postman / Insomnia, or feed it to your code generator
Entegre etmeye hazır mısınız?
Ücretsiz hesap oluşturun, bir uygulama kaydedin ve X-App-Secret'ınızı panelden kopyalayın.