Dokümantasyon

Actions

Onay hattının noktalarında kendi kodunuz: ülkeye, yerel saate, role ya da tutara göre alarm, step-up ve ret; adminler için passkey. Kodsuz bir şablonla ya da birkaç satır JavaScript ile başlayın (sunucu diliniz ne olursa olsun), son gerçek kararlarınıza karşı oynatın, sonra deploy edin, izleyin ve geri alın.

Tetikleyiciler
TetikleyiciNe zamanKararlar
login.requestPush gönderilmeden önce (POST /login/request), risk motoru ve kurallarınızdan sonradeny, stepUp, requirePasskey · skipNumberMatch*, overrideBlock*
risk.checkSessiz giriş kararı (POST /risk/check)prompt · allowSilent*
agent.approvalBir AI ajanının isteği telefona gitmeden önce (POST /agents/approvals): event.agent, event.request.authorizationDetails, tutarlar, alıcılardeny, stepUp, requirePasskey (only tightening)
approval.decidedOnaylandı ya da reddedildi (telefon, passkey, çevrimdışı QR, kurtarma kodu)—
shield.decisionVishing Shield arama sırasında verilen bir onayı değiştirdi; yeniden onaylandı ya da geri alındı—
fraud.reportedSunucunuz bir isteği sahtekârlık olarak bildirdi—
device.linked · device.keys_lost · user.unlinkedTelefon bağlandı; anahtarları silindi; 2FA telefondan kapatıldı—
passkey.added · passkey.removed · recovery.updatedPasskey'ler; Never Locked Out kurtarma adımları—
identity.pre_user_registrationTouchque Login: müşteri kaydolmadan önce (adres ve ad kontrol edilir, henüz bir şey oluşmaz)deny
identity.post_loginTouchque Login: müşterinin ilk adımından sonra, ikinci adımdan ve uygulamanın kodundan öncedeny, requireMfa · idToken.setCustomClaim, accessToken.setCustomClaim, user.setAppMetadata, user.setUserMetadata
identity.post_user_registrationTouchque Login: bir müşteri kaydoldu—

Her Action ayrıca bildirim gönderebilir (api.notify.slack | teams | webhook | email), izinli host'larını çağırabilir (api.fetch) ve kullanıcıyı dondurabilir (api.freezeUser). * yetki ister.

Sıkılaştırmak serbest, gevşetmek yalnız telefonla. deny, stepUp, requirePasskey, prompt, bildirimler ve freezeUser her zaman geçerlidir. Gevşeten bir çağrı yalnız sürüm yetkiyi beyan ettiyse ve bir sahip ya da yönetici o sürümü telefonunda onayladıysa geçerlidir (dashboard → Actions); o zamana kadar pending_approval kalır, önceki sürüm çalışmaya devam eder.
YetkiNeye izin verir
skip_number_matchÇalışma alanının kendi istediği numarayı kaldırır: always-challenge ayarı ya da bir erişim kuralının step-up'ı. Risk motorunun istekleri, kritik işlem, push yorgunluğu, işaretli telefon ya da motor kesintisinde asla.
override_blockRisk motorunun reddini numara eşleşmeli push'a çevirir (asla düz push'a; ülke engeli, erişim kuralı reddi ya da dondurulmuş hesapta asla).
allow_silentŞu an bağlı telefonla onaylanmış, cihaza bağlı tanınan bir tarayıcının, yalnız yeni bir ağ/ülke ya da daha eski bir onay (en çok 30 gün, maxAgeSeconds'ı asla aşmadan) yüzünden sorulduğunda telefonu atlamasına izin verir. Kritik işlem, Vishing Shield sinyali, çalışma alanı kapısı, motor kesintisi ya da ALLOW dışında bir kararda asla.
Sandbox içinde: WebAssembly'de QuickJS, her çalıştırmada yeni bir çalışma ortamı, dosya sistemi ya da süreç yok; ağ yalnız api.fetch ile sürümün allowedHosts listesine. 50 ms CPU, 16 MB, bir ön tetikleyicinin tüm Action'ları için 300 ms. onFailure step_up ya da deny olmadıkça hatalar girişi asla engellemez. Gizli değerler şifrelidir, yalnız yazılır ve yalnız onları beyan eden sürümlere ulaşır.
Geliştirici döngüsü
EndpointNe yapar
POST /actions/testKayıtlı bir olayda, kendi olayınızda ya da örnekte tek çalıştırma: kararlar, bildirimler (gönderilmez), konsol çıktısı ve kararın ne olacağı.
POST /actions/dry-runTaslağı son (en çok 1000) gerçek karara karşı oynatır: kaç tanesi nasıl değişirdi (push→number_match, push→deny…), göndereceği bildirimler, hatalar, p95.
PUT /actions/{slug}Deploy (oluştur ya da yeni sürüm, idempotent). POST …/rollback tek çağrıdır.
GET /actions/{slug}/logs · /metricsHer canlı çalıştırma; pencere başına çalıştırma, hata, p95, kararlar.

Bir Action'ın gerekçesi kararın açıklamasının parçasıdır: risk.check nedenlerinde ve step-up'larda { code: "action", text, action }; ret ise 403 { code: "blocked", reason: "action", action, error } döner. Yalnız sunucunuzun bildiğini login isteğinde ya da guard'da context olarak gönderin (telefonda asla gösterilmez).

Kodsuz şablonlar
idTetikleyiciNe yapar
alertanyOlay eşleşince Slack, Teams, webhook ya da e-posta (Resend, Postmark, SendGrid)
block_or_step_uplogin.requestÜlke, yerel saat, rol, tutar, işlem ya da riske göre deny, stepUp ya da requirePasskey
require_passkey_for_rolelogin.requestBu roller için yalnız passkey onaylar (context.roles)
always_ask_whenrisk.checkEşleşen girişte asla sessiz değil

when: countries, notCountries, hours { from, to, timeZone }, roles, actions, criticalOnly, riskAbove, amount { path, over }, status. Sunucu SDK'ları 5.2.0 (işlem türleri 4.0'da tq.actionTypes'a taşındı).

Deploy, deneme, geri alma
// Hazır şablon: gece Türkiye'den gelen onaylar için Slack
await tq.actions.secrets.set('SLACK_WEBHOOK_URL', ({}).SLACK_WEBHOOK_URL);
await tq.actions.deploy('night-alert', {
  trigger: 'approval.decided',
  template: { id: 'alert', params: { channel: 'slack',
    when: { countries: ['TR'], hours: { from: 0, to: 6, timeZone: 'Europe/Istanbul' }, status: 'approved' } } },
});

// Kendi kodunuz, tipli; deploy etmeden önce son 500 gerçek karara karşı deneyin
const handler = async (event, api) => {
  if (event.context?.roles?.includes('admin')) api.requirePasskey('Admins approve with a passkey');
};
const report = await tq.actions.dryRun({ trigger: 'login.request', handler });
// report.transitions → { 'push→passkey': 12 }
await tq.actions.deploy('admins-use-passkeys', { trigger: 'login.request', handler });

// İzle, geri al
await tq.actions.logs('admins-use-passkeys');
await tq.actions.rollback('admins-use-passkeys');
Bir Action
// login.request
exports.onExecute = async (event, api) => {
  const t = api.time.local(event.client.timeZone || 'Europe/Istanbul');
  if (event.client.country === 'TR' && t.hour < 6) {
    api.stepUp('Night sign-in from Turkey');
    api.notify.slack(`${event.user.id} is signing in from ${event.client.location}`);
  }
};
Kuru çalıştırma 200
{
  "trigger": "login.request",
  "evaluated": 500,
  "matched": 41,
  "changed": 38,
  "transitions": { "push→number_match": 35, "number_match→deny": 3 },
  "notifications": { "slack": 41 },
  "errors": 0,
  "timeouts": 0,
  "p50Ms": 2,
  "p95Ms": 6
}