PWF Auth PWF Auth
Özellikler Nasıl çalışır Fiyatlandırma
Getting started API referansı SDKs & tools
SSS Blog Değişiklik günlüğü İletişim
English English العربية العربية Deutsch Deutsch Nederlands Nederlands Português Português Русский Русский Türkçe Türkçe 简体中文 简体中文
Müşteri Portalı Giriş yap Ücretsiz kaydol ··
Geliştiriciler · API

API Referansı

Her şey HTTPS üzerinden düz bir JSON isteği. Lisansları doğrulayın, oturumları yürütün, güncelleme gönderin ve HTTP konuşan her dilden anahtar üretin.

REST · JSON 0 uç nokta Yalnızca TLS 1.3 Güncellendi August 20, 2026
/
Referans
Giriş Kimlik doğrulama Şifreli zarf Yanıtlar ve hatalar Hızlı başlangıç Lisanslar ve oturumlar Denemeler ve HWID Kullanıcı hesapları Uygulama içeriği ve uzaktan yönetim OTA güncellemeleri Webhooks Admin API SDK'lar

Eşleşen uç nokta yok

Şununla eşleşen bir şey yok:

30 saniyelik özet

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.
Temel URL https://pwfauth.com

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.

bash
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.

bash
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.

json · envelope
{
  "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:

envelope · pseudocode
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 modelEndpoints
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:

json · error
{
  "success": false,
  "message": "This license key has been banned.",
  "error_code": "BANNED"
}
Yaygın hata kodları
error_codeAnlamı
MISSING_FIELDSZorunlu bir gövde alanı eksik.
INVALID_KEYBu uygulama için lisans anahtarı mevcut değil.
INVALID_CREDENTIALSKullanıcı adı/şifre çifti reddedildi (kullanıcı hesapları + admin girişi).
HWID_MISMATCHAnahtar başka bir cihaza bağlı.
EXPIREDLisansın süresi dolmuş.
BANNED / PAUSEDAnahtar, sahibi tarafından yasaklanmış veya duraklatılmış.
MAINTENANCEUygulama bakım modunda.
SESSION_EXPIRED / SESSION_MISMATCHHeartbeat oturumu geçersiz.
TOO_MANY_ATTEMPTSLogin brute-force lockout — the account is locked temporarily; retry_after in the response says for how many seconds.
TRIAL_DISABLED / TRIAL_USED / TRIAL_LIMITDeneme oluşturma reddedildi — bu uygulamada kapalı, bu cihazda zaten kullanılmış veya IP başına sınıra ulaşılmış.

HTTP durum kodları

error_codeAnlamı
200Başarılı — sonuç JSON gövdesinde.
400Doğrulama başarısız — eksik ya da hatalı alanlar (error_code'a bakın).
401Eksik veya geçersiz X-App-Secret / Bearer token.
403Kimlik doğrulandı ama izin yok (yanlış uygulama, iptal edilmiş token…).
404Kaynak bulunamadı.
405Bu uç nokta için yanlış HTTP yöntemi.
429Rate limited — wait for the Retry-After header before retrying.
500Sunucu 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_LIMIT dö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.

bash
# 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

POST/api/auth/login.php App secret + şifreli zarf#

İ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_keyzorunluEtkinleştirilecek / doğrulanacak lisans anahtarı.
hwidzorunluCihazın kararlı donanım parmak izi.
Yanıt
json
{
  "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
}
POST/api/auth/heartbeat.php App secret + şifreli zarf#

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_idzorunlulogin'in döndürdüğü oturum.
license_keyisteğe bağlıGönderilirse oturum bu anahtara ait olmalıdır.
Yanıt
json
{ "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
POST/api/auth/logout.php App secret + şifreli zarf#

Oturumu hemen kapatır (ör. uygulama çıkışında). Gövde: session_id zorunlu, license_key isteğe bağlı.

POST/api/auth/check-key.php App secret · düz veya zarf#

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_keyzorunluİ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);
Yanıt
json
{
  "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
  }
}
POST/api/update/validate.php App Secret#

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_keyzorunluİncelenecek anahtar.
POST/api/auth/request-hwid-reset.php App Secret#

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 usernamezorunluKimin bağlantısının sıfırlanacağını belirtir.
reasonisteğe bağlıSahibine gösterilen not.

Ücretsiz Denemeler

POST/api/auth/trial.php App Secret#

İ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
hwidzorunluDenemeyi isteyen cihazın parmak izi.
Yanıt
json
{
  "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.

POST/api/auth/account-register.php App Secret#

Son kullanıcı hesabı oluşturur. Gövde: username, password zorunlu, email isteğe bağlı.

Gövde alanıZor.Açıklama
usernamezorunluİstenen kullanıcı adı (uygulama başına benzersiz).
passwordzorunluŞifre (sunucuda karma olarak saklanır).
emailisteğe bağlıHesabın iletişim e-postası.
POST/api/auth/account-login.php App Secret#

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
usernamezorunluHesap kullanıcı adı.
passwordzorunluHesap şifresi.
hwidzorunluOturumun bağlanacağı cihaz parmak izi.
POST/api/auth/change-password.php App Secret#

Kullanıcının şifresini değiştirir. Gövde: username, current_password, new_password zorunlu.

Gövde alanıZor.Açıklama
usernamezorunluHesap kullanıcı adı.
current_passwordzorunluMevcut şifre (değişiklikten önce doğrulanır).
new_passwordzorunluYeni ş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.

GET/api/app/text.php App secret + şifreli zarf#

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 (veya ?key=) içinde taşınır. Yanıt zarflıdır.

Gövde alanıZor.Açıklama
?nameisteğe bağlıGetirilecek metin anahtarı (tümü için boş bırakın).
POST/api/app/slides.php App secret + şifreli zarf#

Uygulamanın aktif duyuru slaytlarını döndürür. Zarf gövdesi {"action":"get_slides"} gönderin; yanıt şifrelidir.

GET/api/app/info.php App secret + şifreli zarf#

Uygulama meta verisi + sosyal bağlantılar (ad, marka, URL'ler). Zarflı yanıt.

POST/api/app/social-click.php App secret + şifreli zarf#

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_idzorunluSosyal bağlantının sayısal id'si.
GET/api/app/changelog.php Herkese açık#

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_idzorunluDeğişiklik günlüğü okunacak uygulama.
?limitisteğe bağlı1–50, varsayılan 20.
?sinceisteğe bağlıISO tarihi — yalnızca bu tarihte/sonrasında yayımlananlar.
?categoryisteğe bağlıFiltre: new / improved / fixed / removed / security / deprecated.
GET/api/app/pricing.php Herkese açık#

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_idzorunluFiyatlandırması okunacak uygulama.
?typeisteğe bağlılevels veya plans (ikisi için boş bırakın).
POST/api/app/fulfill.php Fulfillment secret#

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_idzorunluTamamlanacak sipariş (ORD-…).
secretzorunluorder_fulfill_secret değeriniz.
payment_refisteğe bağlıİsteğe bağlı ağ geçidi ödeme referansı.

OTA güncellemeleri

POST/api/update/check.php App secret + şifreli zarf#

Ç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
vzorunluÇağıranın mevcut sürümü (semver).
channelisteğe bağlıstable (varsayılan), beta veya alpha.
os / archisteğe bağlıwindows·macos·linux / x64·x86·arm64.
hwid / license_keyisteğe bağlıKararlı dağıtım kovalaması için kullanılır.
Yanıt
json
{
  "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"
  }
}
GET/api/update/download.php?v=<version> App Secret#

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

json · POST body
{
  "event": "key.activated",
  "timestamp": "2026-08-20T14:07:02Z",
  "data": {
    "app_id": "01af6643-…",
    "license_key": "XXXXX-XXXXX-XXXXX-XXXXX",
    "hwid": "A1B2C3…"
  }
}

Delivery headers

HeaderAçıklama
X-Webhook-IdUnique delivery id (whd_…). Stays the same across retries of one event — use it to deduplicate.
X-Webhook-TimestampUnix timestamp of the delivery attempt.
X-Webhook-Attempt1-based attempt counter.
X-Webhook-SignatureLegacy signature: hex(HMAC-SHA256(body, secret)).
X-Webhook-Signature-V2Preferred 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/3xx answered within 5 seconds.
  • Failures retry up to 5 attempts with widening gaps: 1 m → 5 m → 30 m → 2 h → 6 h.
  • X-Webhook-Id is minted once per event and reused on every retry — idempotency is one seen? lookup away.
  • A destination that fails 20 times in a row is paused automatically; re-enable it from the panel (a test event 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:

EventFires when
key.createdKeys are generated (panel or admin API).
key.activatedA key's first successful login binds it to a device.
key.banned / key.unbannedA key is banned / unbanned.
key.deletedA key is deleted.
key.rotatedA key string is rotated (the old string stops working).
key.suspected_leakLeak detection flags a key as suspected shared/leaked.
key_expiringA key approaches expiry (scheduled sweep).
key_expiredA key expires (scheduled sweep).
trial.createdA trial key is issued to a new device.
hwid_reset.requestedA client requests a device (HWID) reset.
new_orderA purchase order is created.
order.approvedAn order is approved and fulfilled.
subscription.*Subscription lifecycle: created / renewed / cancelled / renewal order created.
update.publishedA new application version is published.
changelog.publishedA changelog entry goes live.
app.revokedAn application is revoked / disabled.
suspicious_activityThe suspicious-activity heuristic fires.
testManual 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.

POST/api/admin/login.php Herkese açık#

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
usernamezorunluAdmin kullanıcı adı.
passwordzorunluAdmin şifresi.
POST/api/admin/keys.php Bearer#

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.

bash
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.

API anahtarınızı alın — ücretsiz
PWF Auth PWF Auth

Geliştiricilerin gerçekten kullanmak istediği lisans sunucusu ve kullanıcı doğrulama backend'i. Self servis, barındırılan, güvenli.

Ürün

  • Özellikler
  • Fiyatlandırma
  • Nasıl çalışır
  • SSS
  • KeyAuth alternatifi
  • Cryptolens alternative
  • Keygen alternative
  • License keys for .NET

Geliştiriciler

  • Getting started
  • API referansı
  • SDKs & tools
  • API durumu (JSON)
  • Değişiklik günlüğü
  • Panel
  • API anahtarı al

Şirket

  • About us
  • İletişim
  • Sistem durumu
  • Güvenlik açığı bildir

Yasal

  • Gizlilik politikası
  • Kullanım şartları
  • GDPR
  • Çerezler
© 2026 PWF Auth. Tüm hakları saklıdır.
Tüm sistemler çalışıyor