v1 Laadimine…

API teatmik

Lisa registreerumisele, sisselogimisele või maksmisele võrgu- ja seadmekontrollid. Sinu server saab signaalid; sina otsustad, kuidas reageerida.

Viimati uuendatud 19. oktoobril 2026 ·iga API muudatus jõuab muudatuste logisse · ainult lisavate muudatuste stabiilsuspoliitika

Rünnakupõhised mängukavad: konto ülevõtmine, kaarditestimine, boonuste kuritarvitamine, ja veel →

★

Kiirstart

Kolm sammu esimese täieliku kontrollini: lisa skript vormiga lehele, saada kontroll oma serverist ja saada oma vorm üks kord. Loo tasuta võti aadressil /signup — tasuta paketis 10 000 külastajakontrolli kuus, ilma kaardita.

Node.js SDK npm install @sentinelsup/sdk npm ↗ · GitHub ↗
Pythoni SDK pip install sentinelsup PyPI ↗ · GitHub ↗
OpenAPI 3.1 https://maskbreak.com/openapi.json Spetsifikatsioon ↗ ·
Seadista AI abil Claude Code · Cursor · Copilot · Windsurf

Kasutad AI-koodiassistenti? Kleebi see prompt ja ta ühendab Maskbreaki sinu rakendusse otsast otsani — esiotsa skript, taustsüsteemi kontroll, keskkonnamuutuja ja test. Ta järgib masinloetavat juhendit aadressil maskbreak.com/integrate.md.

Fetch https://maskbreak.com/integrate.md and follow it to add Maskbreak fraud protection to this app — protect signup, login, and checkout. Start in watch mode (MASKBREAK_MODE). Read the API key from the server-only MASKBREAK_API_KEY environment variable; I will configure the secret separately. Never put it in client-side code. Then show me how to test it.
Sinu Maskbreaki API otspunkt
Laadimine…
Sinu taustsüsteem kutsub seda URL-i. Sinu API-võti autendib päringu.
Alusta jälgimisrežiimis

Näide alustab jälgimisrežiimis: see saadab Maskbreakile iga vormi, ka sellise, millel mõni väli puudub (töölaud ütleb siis, kumb pool kohale ei jõudnud), logib otsuse ja laseb igal külastajal jätkata. Kui töölaua sündmused näevad õiged välja, sea MASKBREAK_MODE=enforce ja juuruta uuesti: sama töötleja peatab siis block ja hoiab kinni review, puuduvad tõendid ja vead. Kui kuu kontrollid on otsas (HTTP 429 koodiga monthly_quota_exceeded), laseb see toimingu kuni kuu 1. kuupäevani kontrollimata läbi ja logib selle, nii et mahu lõppemine ei vii vormi kunagi rivist välja. Integratsioonijuhendis on sama töötleja ja Next.js App Routeri näide.

Integratsioonimuster — säilita oma olemasolev sisselogimiskäsitleja
// STEP 1 — HTML. The script on the page with your form, the class on the form itself.
// Your site sends a Content-Security-Policy (helmet's default does)? Add Maskbreak's
// hosts first, or the browser blocks the script: maskbreak.com/integrate.md#content-security-policy
<script async src="https://maskbreak.com/assets/sentinel.js"></script>
<form class="monocle-enriched" id="login-form">
  <input type="email" name="email" required>
  <button type="submit">Continue</button>
</form>

// STEP 2 — Your frontend script. It never holds the form on Maskbreak:
// a blocked or missing script only means the check gets less evidence.
document.getElementById('login-form').addEventListener('submit', async (event) => {
  event.preventDefault();
  const evidence = window.Sentinel ? await window.Sentinel.collect() : {};
  const response = await fetch('/your-login-endpoint', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    // evidence = { token, fingerprintEventId, tz }, already the API's names
    body: JSON.stringify({ email: event.target.email.value, ...evidence })
  });
  // Handle response.status and the next step in your existing login UI.
});

// STEP 3 — Node 18+ / Express backend.
// express, app and existingLoginHandler belong to your application.
// This check is NOT authentication and never creates a login session.
// MASKBREAK_MODE unset or 'watch' (start here): send every submission, also one
// with a missing field (the dashboard then says which half did not arrive),
// log the answer and always continue. 'enforce': stop block; hold review,
// missing evidence and errors (a used-up month continues, logged).
const MASKBREAK_MODE = process.env.MASKBREAK_MODE || 'watch';
app.use(express.json({ limit: '16kb' }));
app.use(express.urlencoded({ extended: false, limit: '16kb' }));
app.post('/your-login-endpoint', async (req, res, next) => {
  const body = req.body || {};
  // Form fields -> API names: monocle -> token, sentinel_fp -> fingerprintEventId,
  // sentinel_tz -> tz. Sentinel.collect() already returns the API names.
  const token = body.token || body.monocle;
  const fingerprintEventId = body.fingerprintEventId || body.sentinel_fp;
  const tz = body.tz || body.sentinel_tz;
  const missing = typeof token !== 'string' || !token ||
    typeof fingerprintEventId !== 'string' || !fingerprintEventId;
  let result = null, hold = null, monthUsedUp = false, status = null;
  if (!missing || MASKBREAK_MODE !== 'enforce') {
    try {
      const response = await fetch('https://maskbreak.com/v1/evaluate', {
        method: 'POST',
        signal: AbortSignal.timeout(5000), // example budget; measure your own
        headers: {
          'Authorization': 'Bearer ' + process.env.MASKBREAK_API_KEY,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ token, fingerprintEventId, tz, email: body.email })
      });
      status = response.status; // 401: MASKBREAK_API_KEY is empty or wrong
      if (!response.ok) {
        const refusal = await response.json().catch(() => null);
        // The month's checks are used up: let the action through unchecked
        // until the 1st (00:00 UTC) and log it, as watch mode does.
        if (response.status === 429 && refusal?.code === 'monthly_quota_exceeded') monthUsedUp = true;
        else throw new Error('Visitor check unavailable');
      } else {
        result = await response.json();
        // Production gate: never authorize from a fixture or personal test key.
        if (!result || result.test || result.sandbox || result.sample ||
            !['allow', 'review', 'block'].includes(result.decision)) {
          throw new Error('No production verdict');
        }
        if (result.decision === 'block') {
          hold = [403, { error: 'Action refused by policy' }];
        } else if (result.decision === 'review' || result.degraded || !result.device) {
          hold = [409, { next: 'step_up' }]; // implement a real step-up flow
        }
      }
    } catch {
      // Example temporary hold. Choose a fallback for each business action.
      hold = [503, { error: 'Check unavailable; try again shortly' }];
    }
  }
  if (missing) hold = [409, { next: 'step_up' }]; // enforce never trusts half a check
  // One line per check. Never log the key, browser tokens or form data.
  console.log('[maskbreak]', MASKBREAK_MODE, 'HTTP ' + (status ?? 'none'),
    result ? result.decision : monthUsedUp ? 'monthly_quota_exceeded' : 'no answer',
    hold ? 'enforce would return ' + hold[0] : 'enforce would continue');
  if (MASKBREAK_MODE === 'enforce' && hold) {
    return res.status(hold[0]).json(hold[1]); // never mint a session here
  }
  req.fraudCheck = result;
  return next(); // normal credential + authorization checks still run
}, existingLoginHandler);

Enne otsuse jõustamist

Testi eraldi tavapäraseid otsuseid, puuduvat teavet ja kliendi võimalusi pärast takistust jätkata. Need juhendid käsitlevad rakendusepoolseid valikuid, mida API vastus sinu eest teha ei saa.

▶

Proovi otse

Kutsu liivakasti otspunkti ühe klõpsuga. Ilma registreerumiseta, ilma API-võtmeta — ainult päris /v1/evaluate vastuse kujud, mida saad oma koodi kopeerida.

Päring
GET https://maskbreak.com/v1/evaluate/sample
   ?scenario=clean
Autentimist pole vaja · 30 päringut/min · tagastab näidisandmed
Vastus
ootab käivitamist…
{
  "klõpsa ▶ Käivita päring": "et näha reaalajas JSON-vastust"
}

Tootmispäringud kasutavad POST /v1/evaluate koos SDK-lt saadud token-iga ja päisega Authorization: Bearer sk_live_.... Näidisotspunkt tagastab sama vastuse kuju, nii et saad oma parsimisloogika enne registreerumist valmis ehitada.

Otsi päris IP-d
päris konveieri otsus · võtmeta · piiratud sagedusega — mõni katse minutis
Päring
POST https://maskbreak.com/api/lookup
{ "ip": "185.220.101.34" }
Päris otsus reaalajakonveierist (Tori väljund on ette täidetud). Rangelt piiratud sagedusega — mõni katse minutis; mahu jaoks kasuta võtmega GET /v1/lookup.
Vastus
ootab käivitamist…
{
  "klõpsa ▶ Käivita otsing": "et saada selle IP kohta reaalajas otsus"
}

Kuidas see töötab

Maskbreak kasutab kolmeastmelist voogu klient → sinu taustsüsteem → Maskbreaki API, et su salajane võti ei jõuaks kunagi brauserisse.

1
Kogumine brauseris

Maskbreaki SDK töötab sinu külastaja brauseris vormiga lehel ja lisab vormi kaks peidetud välja: krüpteeritud võrgutokeni (monocle) ja brauserikontrolli (sentinel_fp).

2
Token edastatakse

Sinu vorm saadab mõlemad koos ülejäänud vormiandmetega sinu enda taustsüsteemi serverisse.

3
API hindamine

Sinu taustsüsteem kutsub POST /v1/evaluate sinu salajase võtmega ja saadab need nimedega token ja fingerprintEventId. Maskbreak vastab allow, review või block, koos põhjustega.

Autentimine

Kõik päringud otspunktile /v1/evaluate peavad sisaldama sinu salajast API-võtit Bearer-tokenina. Oma võtme leiad töölaualt.

Authorization: Bearer sk_live_YOUR_SECRET_KEY
Hoia oma võti salajas
Ära pane sk_live_… kunagi oma HTML-i, JavaScripti ega muusse kliendipoolsesse koodi. Kasuta seda ainult oma taustsüsteemi serverikeskkonnas.

Võtme vahetamine

Vaheta võtit konsoolist (Integratsioon → Vaheta või Seaded → API võtmed; parooli küsitakse uuesti). Uus võti töötab kohe ja eelmine võti töötab veel 24 tundi, nii et juurutus saab üle minna ilma pausita. Kui võti on lekkinud, lõpetab Seadetes Tühista vana võti kohe selle armuaja otsekohe. Armuaja jooksul arvestatakse mõlema võtme päringud samast tunnilimiidist ja /v1/usage näitab mõlemale samu numbreid.

Igal kontol on isiklik sk_test_… võti. See käivitab reaalajas kontrolliahela ja salvestab testsündmused, kuid ei saada pärisliikluse veebihaagi teavitusi; selle kontrollid lähevad sinu kuulimiidi sisse, sellel on oma tunnilimiit ning sellele ei rakendata IP-lubamisnimekirja. Avalik sk_test_sandbox võti vastab ainult deterministlikele testtokenitele, ilma kontota ja sündmusi salvestamata. Tootmisvõtme IP-lubamisnimekiri piirab /v1/evaluate ja /v1/lookup kasutamist ning tokeni väljastamist otspunktilt /oauth/token (muult aadressilt 400 unauthorized_client), kuid mitte /v1/usage kasutamist.

OAuth 2.0 Client Credentials Uus

Vaheta oma konto e-post ja API-võti lühiajalise bearer-tokeni vastu standardse client_credentials grandiga. Token kannab sinu konto ID-d, mitte kunagi võtit ennast. See kehtib 60 minutit, autendib sinu parasjagu kehtiva sama tüüpi võtmena ning on seotud võtmega, millega see vermiti: pärast vahetamist töötab see edasi seni, kuni see võti kehtib (eelmise võtme 24-tunnine armuaeg); eelmise võtme tühistamine, teine vahetus või testvõtme vahetamine lõpetab selle kohe vastusega 401 — siis vermi uus. Sinu sk_test_ võtmega vermitud token jääb testtunnuseks. API-võtmed töötavad täpselt nagu varem; see on lisandus.

OAuthi tokeni otspunkt
POST /oauth/token
Vaheta e-post + API-võti bearer-tokeni vastu. Avastusmetaandmed aadressidel /.well-known/oauth-authorization-server ja /.well-known/oauth-protected-resource.
cURL
curl -X POST https://maskbreak.com/oauth/token \
  -H "Content-Type: application/json" \
  -d '{"grant_type":"client_credentials","client_id":"your@email.com","client_secret":"sk_live_..."}'

Kasuta tagastatud access_token-i Authorization: Bearer päises kõikjal, kus API-võtit aktsepteeritakse. Tokenid aeguvad; uuenda vahetust korrates. Võti ise ei lahku kunagi sinu serverist.

1

Lisa SDK

Lisa Maskbreaki SDK vormiga lehele. Üks skript laadib mõlemad tuvastuskihid — võrguanalüüs (VPN, proksi, andmekeskus) ja seadmeanalüüs (antidetect-brauserid, botid, võltsimine) — ning lisab mõlemad igasse vormi, millel on class="monocle-enriched" (vormil endal, mitte kunagi sisestusväljal).

HTML — vormiga leht
<!-- Maskbreak SDK — network + device, on the page with your form -->
<script async src="loading..."></script>

<!-- class="monocle-enriched" on the form itself, never on an input -->
<form class="monocle-enriched" id="my-form">
  <!-- The SDK fills these in by itself: -->
  <input type="hidden" name="monocle"    value="eyJ..." /> // network
  <input type="hidden" name="sentinel_fp" value="a1b2..." /> // device
  <input type="hidden" name="sentinel_tz" value="Europe/Tallinn" /> // time zone
</form>

Sinu sait saadab Content-Security-Policy päise? helmeti vaikepoliitika teeb seda ja blokeerib skripti, kuni lisad oma direktiividele SDK enda hostid: script-src https://maskbreak.com https://mcl.maskbreak.com https://*.mcl.maskbreak.com https://mesu.maskbreak.com 'wasm-unsafe-eval', connect-src https://mcl.maskbreak.com https://*.mcl.maskbreak.com wss://mcl.maskbreak.com wss://*.mcl.maskbreak.com https://mesu.maskbreak.com ja worker-src https://mesu.maskbreak.com blob:. Osa, mille poliitika blokeerib, jääb tühjaks ja kontroll jätkub ilma selleta. Integratsioonijuhendis on helmeti seadistus.

SDK laadimine ja tokenite genereerimine võtab ~1–2 sekundit. Kui seadmekiht ei saa töötada (nt karastatud brauser blokeerib selle), jätkub hindamine ainult võrgukihil.

2

Kogu tokenid

Vormi saatmisel kutsu Sentinel.collect() — see ootab, kuni seadmekiht on paigas (kõige rohkem 5 sekundit; collect({ timeout: ms }) muudab seda), ja tagastab { token, fingerprintEventId, tz }, juba API nimedega. Edasta need oma taustsüsteemi. Kontrolli enne, et window.Sentinel on olemas, ja ära kunagi hoia vormi kinni, kui skript puudub või on blokeeritud. (Tavaliselt saadetud vormis on selle asemel peidetud väljad monocle, sentinel_fp ja sentinel_tz: sinu server saadab need nimedega token, fingerprintEventId ja tz.) Kliendipoolselt renderdatud rakendus (React, Next.js, Vue)? Midagi lisada pole vaja: skript hoiab ise ühte peidetud vormi, nii et token on olemas ka vormidele, mille sinu rakendus renderdab pärast lehe laadimist.

JavaScript (esiots)
document.getElementById('my-form').addEventListener('submit', async (e) => {
  e.preventDefault();

  // Both layers (network token + device event id) and the time zone.
  // No script (blocked or still loading)? Send the form anyway.
  const evidence = window.Sentinel ? await window.Sentinel.collect() : {};

  // Forward them to your backend with the rest of the form data
  const res = await fetch('/your-backend-endpoint', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      email: e.target.email.value,
      ...evidence  // ← token, fingerprintEventId, tz: the API's own names
    })
  });
});
3

Kutsu evaluate-otspunkti

POST laadimine…

Kutsu seda oma taustsüsteemi serverist — mitte kunagi brauserist. Edasta kliendilt saadud token ja oma salajane API-võti.

Päringu keha

token string täielikuks võrgukontrolliks
Krüpteeritud võrgutoken, mille saad Sentinel.collect() abil või väljalt input[name="monocle"] (aktsepteeritakse ka välja enda nime monocle; kui saadad mõlemad, kehtib token). Saada see täieliku võrguteabe saamiseks. Otse HTTP kaudu tehtud päringus aktsepteeritakse puuduvat või tühja tokenit piiratud võrguteabega hindamisena; token, mis ei ole string või mille pakkuja tagasi lükkab, annab vastuseks 400. Praegused Node’i, Pythoni ja PHP serveri SDK-d nõuavad mittetühja tokenit juba kohalikul kontrollimisel, seega kasuta selle varulahenduse jaoks otse HTTP-päringuid. Saada päringu keha kujul application/json; muu või puuduva Content-Type’iga saadetud JSON-objekt või vormi keha (token=…&fingerprintEventId=…) loetakse samamoodi.
fingerprintEventId string
Seadmeanalüüsi sündmuse ID — SDK püüab selle ja lisab väljana sentinel_fp; edasta see siia (mõlemat nime aktsepteeritakse), et avada device.* signaalid (antidetect, automatiseerimine, emulaator, …). Jäta see ära ja saad ainult võrgupõhise otsuse.
accountId string
Valikuline: sinu enda konto/kasutaja ID selle seansi jaoks. Koos fingerprintEventId-ga loeb Maskbreak, mitme erineva kontoga on see seade sinu API-võtme all seotud olnud, ja tagastab device.linked_accounts / device.multi_account — mitmikkontode tuvastus ilma lisaintegratsioonita. Maskbreak hoiab sellest võtmega räsi ja krüpteeritud koopiat, mida näitab ainult sinu konsool; mõlemad kustutatakse 90 päeva pärast konto viimast kontrolli. Alates 18. oktoobrist 2026 täidab see ka objekti account.
email string
Valikuline: e-posti aadress, millega külastaja registreerub. Lisab vastusesse email.disposable — kontrollitakse pidevalt uuendatava tuhandete ühekordsete domeenide voo vastu. Tabamus lisab põhjuse disposable_email, tõstab risk_score-i ja tõstab allow tasemele review. Aadressi kontrollitakse ajutiselt ning seda ei salvestata ega logita kunagi.
tz string
Valikuline: külastaja IANA ajavöönd, nt Europe/Tallinn. Meie kliendi SDK saadab selle automaatselt väljana sentinel_tz, mida see otspunkt samuti aktsepteerib; ise saad selle lugeda käsuga Intl.DateTimeFormat().resolvedOptions().timeZone — ilma loaküsimuse ja geolokatsioonita. Lisab vastusesse timezone ploki. Kui ühendus näib tavaline, aga brauseri kell kuulub teise riiki, on see võrgukihist mööda pääsenud residentse proksi kuju: see lisab põhjuse timezone_mismatch, tõstab risk_score-i ja tõstab allow tasemele review. Sihilikult mitte rakendatud VPN-i, proksi, Tori ega andmekeskuse väljundi puhul — kellaga vastuollu minek ongi see, mida need teevad — ja mitte kunagi üksi piisav block-iks, sest reisijad ja välismaal elavad inimesed satuvad siia õigustatult. Edasta Sentinel.collect() tagastatud tz oma otse tehtavas HTTP-päringus. Praegused serveri SDK-de abifunktsioonid ei serialiseeri tz välja; kui vajad seda välja, kasuta otse HTTP-päringuid.

Testimine ilma brauserita: saada deterministlik testtoken — test_clean, test_vpn, test_proxy, test_datacenter või test_tor —, et oma allow / review / block käsitlust otsast otsani proovida. Testpäringud autenditakse ja piiratakse sagedusega nagu päris omad, aga neid ei arvestata, salvestata ega saadeta veebihaakidesse, ja vastus kannab "test": true.

CI & staging ilma kontota: avalik liivakastivõti sk_test_sandbox aktsepteerib samu test_* tokeneid ja tagastab samad deterministlikud kujud — ilma registreerumiseta, midagi ei arvestata, midagi ei salvestata, päris kvooti ei puudutata kunagi. See vastab ainult testtokenitele (reaalliiklus vajab ikka sinu päris võtit) ja on IP kohta piiratud sagedusega. curl -X POST https://maskbreak.com/v1/evaluate -H "Authorization: Bearer sk_test_sandbox" -H "Content-Type: application/json" -d '{"token":"test_vpn"}'

Sinu enda testvõti (täiskonveier): igal kontol on ka isiklik sk_test_… võti (Seaded → API võtmed), mis erinevalt liivakastist jooksutab kogu reaalajakonveierit — päris tokenid, päris seadmeanalüüs, sinu reeglid ja erandikinnitused kaasa arvatud. Selle loodud sündmused on konsoolis märgitud testina, statistikast välja jäetud, ei käivita kunagi veebihaake, ja vastus kannab "test": true. Selle kontrollid lähevad nagu konsooli enda kontrollidki sinu kuu mahu hulka; ülal toodud fikseeritud testtokenid mitte. Sellel on oma tunnilimiit ja see on sihilikult IP-lubamisnimekirjast vabastatud, et CI ja sülearvutid saaksid konveierit proovida ilma su tootmispiirangusse auke löömata.

// Your backend. Form fields -> API names: monocle -> token,
// sentinel_fp -> fingerprintEventId, sentinel_tz -> tz (collect() already uses them).
// Watch mode (start here) sends every submission, a missing field included.
const b = req.body || {};
let data = null;
try {
  const response = await fetch('https://maskbreak.com/v1/evaluate', {
    method: 'POST',
    signal: AbortSignal.timeout(5000),
    headers: {
      'Authorization': 'Bearer ' + process.env.MASKBREAK_API_KEY,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      token: b.token || b.monocle,
      fingerprintEventId: b.fingerprintEventId || b.sentinel_fp,
      tz: b.tz || b.sentinel_tz
    })
  });
  data = response.ok ? await response.json() : null;
} catch {
  data = null; // unavailable: watch mode continues
}

// data.decision → 'allow' | 'review' | 'block' (covers VPN, proxy,
// datacenter, Tor, antidetect, automation) — route on this
// data.reasons  → machine-readable why
console.log('[maskbreak]', data ? data.decision : 'no answer');

if (process.env.MASKBREAK_MODE === 'enforce' && data && data.decision === 'block') {
  return res.status(403).json({ error: 'Suspicious connection.' });
}
# Your backend (Flask shown): JSON from Sentinel.collect(), or a posted form.
# Form fields -> API names; watch mode (start here) sends every submission.
import os, requests

body = request.get_json(silent=True) or request.form
try:
    data = requests.post(
        "https://maskbreak.com/v1/evaluate",
        headers={"Authorization": "Bearer " + os.environ["MASKBREAK_API_KEY"]},
        json={
            "token": body.get("token") or body.get("monocle"),
            "fingerprintEventId": body.get("fingerprintEventId") or body.get("sentinel_fp"),
            "tz": body.get("tz") or body.get("sentinel_tz"),
        },
        timeout=5,
    ).json()
except (requests.RequestException, ValueError):
    data = None  # unavailable: watch mode continues

# data["decision"] → 'allow' | 'review' | 'block' — route on this
# data["reasons"]  → machine-readable why
print("[maskbreak]", (data or {}).get("decision", "no answer"))

if os.environ.get("MASKBREAK_MODE") == "enforce" and (data or {}).get("decision") == "block":
    return "403 Suspicious connection", 403
curl -X POST 'https://maskbreak.com/v1/evaluate' \
  -H 'Authorization: Bearer sk_live_YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"token": "YOUR_BROWSER_TOKEN", "fingerprintEventId": "YOUR_DEVICE_EVENT", "tz": "Europe/Tallinn"}'
// Your backend: JSON from Sentinel.collect(), or a posted form.
// Form fields -> API names; watch mode (start here) sends every submission.
$in = json_decode(file_get_contents('php://input'), true) ?: $_POST;
$ch = curl_init('https://maskbreak.com/v1/evaluate');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 5,
    CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('MASKBREAK_API_KEY'), 'Content-Type: application/json'],
    CURLOPT_POSTFIELDS => json_encode([
        'token' => $in['token'] ?? $in['monocle'] ?? null,
        'fingerprintEventId' => $in['fingerprintEventId'] ?? $in['sentinel_fp'] ?? null,
        'tz' => $in['tz'] ?? $in['sentinel_tz'] ?? null,
    ]),
]);
$data = json_decode((string) curl_exec($ch), true); // null when unavailable: watch mode continues

// $data['decision'] → 'allow' | 'review' | 'block' — route on this
// $data['reasons']  → machine-readable why
error_log('[maskbreak] ' . ($data['decision'] ?? 'no answer'));

if (getenv('MASKBREAK_MODE') === 'enforce' && ($data['decision'] ?? null) === 'block') {
    http_response_code(403);
    exit();
}

Korduvad seadmed ja kontoseosed

Saada värske päris brauserisündmus /v1/evaluate aadressile tootmisvõtmega. device.customer_history loendab ainult sinu kliendikonto viimase 90 päeva erinevaid kinnitatud sündmusi ning näitab esimest ja viimast külastust, korduvkülastuse olekut ja seotud kontode arvu. Töölaua Sündmused → Uuri kuvab 50 viimati nähtud seadet. Ajalugu koguneb pärast funktsiooni kasutuselevõttu; vanu sündmusi ei lisata tagantjärele. Sama sündmuse korduv saatmine läheb arvesse ühe korrana. Puuduv seadmetõend tähendab puuduvat ajalugu, mitte uut ega ohutut seadet.

Kontode seostamiseks peab sinu server määrama accountId enda autenditud kasutaja või seansi põhjal, mitte kopeerima brauseri väidetud kontotunnust. Kasuta pseudonüümset ID-d, mitte e-posti aadressi. Ühist seadet kasutavad kontod on taustainfo, mitte pettuse tõend. Testvõtme liiklust sellesse ajalukku ei lisata. Varasemad times_seen, returning ja first_seen väljad säilitavad jagatud loenduri tähenduse; oma külastajate jaoks kasuta customer_history välja.

// Your backend: accountId comes from YOUR authenticated session.
const response = await fetch('https://maskbreak.com/v1/evaluate', {
  method: 'POST',
  headers: {
    Authorization: 'Bearer ' + process.env.MASKBREAK_API_KEY,
    'Content-Type': 'application/json'
  },
  signal: AbortSignal.timeout(8000),
  body: JSON.stringify({
    token: req.body.token,
    fingerprintEventId: req.body.fingerprintEventId,
    accountId: req.user ? String(req.user.id) : undefined,
    gpuEvidence: req.body.gpuEvidence // optional beta; otherwise omit
  })
});
if (!response.ok) throw new Error('Visitor check unavailable');
const result = await response.json();
const history = result.device?.customer_history;
// history: {visits, returning, first_seen, last_seen, accounts, window_days:90}
// Use your existing decision/review policy. History is not authorization.
Valikuline WebGPU sarnasuse beetaversioon

Administraator saab beeta sisse lülitada seadetes, jaotises „Katsetuslik: GPU-sarnasus“. Sinu veebisait peab esmalt olema kinnitatud: esimene sellelt saabunud täielik kontroll kinnitab selle automaatselt. Kogu sellel saidil tavaline SDK sündmus ning küsi serveri kaudu ühekordne väljakutse. See nõuab kinnitatud saidilt pärit teenusepakkuja kinnitatud sündmust, mis on alla viie minuti vana. Väljakutse kehtib kaks minutit ning on seotud kliendi, seadme ja sündmusega. Tavalise SDK laadimine GPU mõõtmist ei käivita. Eraldi koguja nõuab HTTPS-i ja CSP-s worker-src blob: lubamist.

// 1. Your backend requests a challenge using its LIVE API key.
// Protect your own route with session/CSRF checks and rate limits.
const response = await fetch('https://maskbreak.com/v1/device-evidence/challenge', {
  method: 'POST',
  headers: { Authorization: 'Bearer ' + process.env.MASKBREAK_API_KEY,
    'Content-Type': 'application/json' },
  signal: AbortSignal.timeout(6000),
  body: JSON.stringify({ fingerprintEventId: req.body.fingerprintEventId })
});
if (!response.ok) return res.status(200).json({ status: 'unavailable' });
return res.json(await response.json()); // challenge, expires_at, protocol

// 2. Browser, after your required consent/notice flow:
// Load https://maskbreak.com/assets/device-evidence.js?v=1 separately.
// Pass the challenge from YOUR backend; never send your API key here.
const gpuEvidence = challenge
  ? await MaskbreakGPU.collect(challenge)
  : { status: 'unavailable' };
// Forward only successful evidence with the SAME fingerprintEventId:
// gpuEvidence: gpuEvidence.features ? gpuEvidence : undefined
// If unavailable or your challenge route fails, continue normal checks.

Kasuta beeta jaoks otse HTTP-päringuid; avaldatud serveri SDK-d võivad gpuEvidence-välja ära jätta. Piirid: 60 väljakutset tunnis kliendi kohta, 50 ootel, üks kinnitatud GPU-proov sündmuse kohta ja vähemalt 30 sekundit seadme proovide vahel. Kogumine lõpeb kuue sekundiga; toetamata või blokeeritud brauser tagastab unavailable. Salvestatakse kuni 200 seadme viimane krüpteeritud tunnusvektor, kuni 30 päeva viimasest vastuvõetud proovist. Beeta väljalülitamine kustutab proovid ja väljakutsed.

device.gpu_evidence tagastab tõendi töötlemisel recorded, disabled, invalid, expired_or_used, not_saved või unavailable. Lähim seade ja RMS-kaugus näitavad ainult katselist sarnasust: väiksem on lähem, kuid ükski lävi ei tõesta identiteeti. Sarnased GPU-d võivad anda sarnase tulemuse, seaded võivad seda muuta ja brauseriandmeid saab võltsida. GPU-tõend ei muuda skoori, blokeeri külastajaid ega seo kontosid. Administraatori luba ei ole külastaja nõusolek: määra õiguslik alus, selgita kogumist ja hangi vajalik nõusolek. Alusta lubatud katseseadmetest.

Eksperimentaalne brauseri kooskõlakontroll

Kasuta olemasolevat GPU-beeta luba ja sündmusega seotud kontrollväärtust valikulise diagnoosi jaoks ülevaatuse etapis. See võrdleb lehe ja taustatöötluse brauseri-/operatsioonisüsteemi perekondi, WebGL-/WebGPU-tootjaid, WebGL-aruannet väidetava süsteemiga ning kahe värske arvutuse tulemusi ja arvutab brauseris kolme väikese lõuendi räsi (brauserist lahkuvad ainult 8-märgilised tunnused). Edasta browserEvidence HTTP kaudu tootmisvõtmega; tavalise SDK laadimine ei käivita kontrolli.

// Browser: load /assets/browser-consistency.js?v=6 from maskbreak.com.
// Run only on an opted-in review step, after required notice/consent.
// Obtain the one-use challenge from YOUR authenticated backend route above.
const browserEvidence = challenge
  ? await MaskbreakBrowserConsistency.collect(challenge)
  : { status: 'unavailable' };
// Forward to YOUR backend with the same session-bound fingerprintEventId.
// Do not expose a Maskbreak API key in browser code.

// Backend: optional field in the existing POST /v1/evaluate JSON body:
// browserEvidence: browserEvidence.protocol ? browserEvidence : undefined
// Send either browserEvidence OR gpuEvidence for a device event, not both.
// Read result.device?.browser_consistency:
// {status:'inconsistent', experimental:true, source:'browser_reported',
//  affects_decision:false, findings:['browser_context'], checks:[...]}
// Keep the original decision/review policy. This report is not authorization.

API tagastab nimelised kontrollid ja oleku consistent, inconsistent või inconclusive või vea, keelu või korduskasutuse oleku. Leiud arvutatakse serveris uuesti, kuid need on endiselt võltsitavad brauseriandmed, mitte riistvara ehtsuse tõend. Erinevad GPU-tootjad, peidetud andmed, tarkvaraline renderdamine ja WebGPU puudumine ei ole riskitunnused. Kolm leidu tõstavad otsuse allow tasemele review, mitte kunagi block: iseendaga vastuolus WebGL-aruanne (gpu_inconsistent); üks konto, mis näitab samal seadmetüübil kahe brauseri kahte lõuendi sõrmejälge (antidetect_randomization, vajab accountId-d); ning viis või enam uut lõuendi sõrmejälge ühel seadmetüübil ööpäeva jooksul, igaüks eri brauserist (antidetect_profile_burst). Kahe viimase jaoks hoitakse 30 päeva ainult sinu konto jaoks lõuendi näitude, brauseri seadmetunnuse ja (kui see saadeti) kontotunnuse võtmega räsisid. Tooraruandeid ega kokkuvõtteid ei salvestata ja neid ei kuvata sündmuse detailides. Enne reeglites kasutamist testi lubatud seadmetega.

Vastuseobjekt

Õnnestunud päring tagastab 200 OK koos selle JSON-struktuuriga.

Väli Tüüp Kirjeldus
decision string Soovitatav tegevus: "allow", "review" või "block". Ainult nõuandev — poliitika määrad sina. reasons massiiv selgitab iga otsust, et saaksid selle logida või näidata oma lõppkasutajale keeldumise põhjust. Kui seadistad töölaual oma reeglid, tagastab see väli sobiva signaali puhul sinu tegevuse (rangeim reegel võidab).
engine_decision string decision_source tagastatakse alati, kui sinu poliitika sellele sündmusele sobis: "rules" (koos rule_matched-iga, mis loetleb reegli käivitanud signaalid) või "exception" (koos exception_matched-iga, mis nimetab IP/külastaja kinnituse sinu töölaua erandite loendist — otsesed kinnitused on signaalireeglitest tähtsamad). engine_decision ilmub lisaks siis, kui vaste otsust tegelikult muutis, säilitades mootori enda riskiskoori otsuse.
risk_score integer Koondriskiskoor 0–100 kõigi võrgu- ja seadmesignaalide põhjal. Oma reeglid seda ei muuda.
isSuspicious boolean Pärandmugavuslipp. true, kui VPN, proksi, Tor, brauseri manipuleerimine (antidetect), automatiseerimine, emulaator või virtuaalmasin rakendus. Andmekeskuse või anonüümse võrgu signaal üksi tõstab risk_score-i, kuid ei sea seda lippu — täieliku katvuse jaoks suuna decision-i järgi.
ip string Kasutaja paljastatud, päris IP-aadress. Peegeldatud väljal details.ip.
country string ISO 3166-1 riigikood (nt "US", "EE"). Peegeldatud väljal details.cc.
network.vpn boolean Tuvastatud kommertslik VPN (NordVPN, Proton, ExpressVPN jne). Peegeldatud väljal details.vpn.
network.proxy boolean Tuvastatud residentne või SOCKS/HTTP proksi. Samuti true Apple'i iCloud Private Relay puhul, mida nimetab network.privacy_relay. Peegeldatud väljal details.proxied.
network.privacy_relay boolean true, kui proksi on Apple'i iCloud Private Relay, nagu Maskbreaki võrguanalüüs selle ära tunneb (network.proxy on samuti true). Üksi annab see tulemuseks review, mitte kunagi block, põhjusekoodiga privacy_relay koodi proxy_detected asemel. Proksireegel olekuga „Luba“ lubab selle samuti; olekuga „Vaata üle“ või „Blokeeri“ see releele ei kehti ja tulemus jääb review. Igas hindamises alates 10. oktoobrist 2026.
network.datacenter boolean Liiklus teadaoleva andmekeskuse / pilveteenusepakkuja ASN-ist. Peegeldatud väljal details.dch.
network.tor boolean Tuvastatud Tori väljundsõlm. Peegeldatud väljal details.tor.
network.anonymous boolean Tuvastatud mis tahes anonüümimiskiht. Peegeldatud väljal details.anon.
network.residential boolean true, kui ei andmekeskuse ega proksi lipp ei rakendunud (näeb välja nagu päris kodu-IP).
network.service string Tuvastatud teenusepakkuja, kui teada (nt "PROTON_VPN", "BRIGHT_DATA"). Peegeldatud väljal details.service.
network.complete / network.sdk_blocked boolean Kui hea oli võrgumõõtmine. complete on false osalise mõõtmise korral (külastaja saatis vormi enne, kui võrgukontroll lõppes; vale vastuse tõenäosus on suurem) ja siis, kui mõõtmist üldse polnud. sdk_blocked on true, kui token saabus, aga kontroll ei saanud külastajat mõõta: teatatud aadress on privaatne, puudub või kuulub võrgukontrolli enda taristule. Nii näeb välja blokeeritud või eemaldatud mõõtmine. Siis ei tõenda võrgulipud puhast ühendust. Mõlemad väljad on olemas tootmishindamistel (mitte testtokenite, liivakasti ega näidete puhul), on ainult teave ega muuda kunagi decision-välja.
device.antidetect boolean Antidetect- / sõrmejälge võltsiv brauser (Multilogin, Kameleo, GoLogin jne). Olemas ainult siis, kui fingerprintEventId saadeti.
device.automation boolean Tuvastatud automatiseeritud brauser (Puppeteer, Playwright, Selenium).
device.emulator boolean Mobiiliemulaator.
device.virtual_machine boolean Brauser töötab virtuaalmasinas. Üksi annab see tulemuseks review (alates 29. septembrist 2026).
device.incognito boolean Tuvastatud privaatne / inkognitorežiim.
device.privacy_mode boolean Täiustatud privaatsusseaded aktiivsed (nt Brave Shields, Firefoxi resist-fingerprinting).
device.ip_blocklisted boolean Külastaja IP on e-posti rämpsposti või rünnakuallikate mustades nimekirjades.
device.high_activity boolean Seda seadet tuvastatakse ebatavaliselt sageli (kõrge aktiivsusega seade). Informatiivne — sagedased külastused üksi pole pettus, aga koos teiste signaalidega viitavad need sageli automatiseerimisele või farmimisele. Lisab põhjusekoodi high_activity_device.
device.visitor_id string Püsiv seadme sõrmejälje räsi. Sama seade tagastab sama ID kõigis seanssides ka pärast küpsiste kustutamist — kasulik konto ülevõtmise tõrjeks ja seadmete rühmitamiseks.
device.tampering_score number Andmeallika manipulatsiooniskoor 0–1 või 0, kui tulemus puudub. See ei ole pettuse tõenäosus ega tõend ehtsast brauserist. Tulemuse tõlgendamiseks kasuta välju checked_signals ja antidetect.
device.complete / device.checked_signals boolean / string[] complete tähendab, et brauseri manipuleerimise ja boti kontrollid andsid tulemuse, mitte et kõik valikulised kontrollid tehti. checked_signals loetleb tegelikult kontrollitud tõeväärtusväljad. Kontrollimata välja väärtus jääb ühilduvuse huvides false; see ei ole puhas kontrollitulemus. Otsustusreeglid ei muutu. Vanemates vastustes ja demoandmetes võivad need metaandmed puududa; puudumine ei tõenda, et kontrollid tehti.
device.times_seen integer Seadme ühesuunalise räsi kõigi registreeritud esinemiste arv ajalookirje olemasolu jooksul. See ei ole sinu klientide arv, ei ole piiratud sinu võtmega ega ole jooksva 90 päeva loendur. Kirjeid võib puhastamise käigus kustutada, kui seadet pole 90 päeva nähtud. Väärtus 1 viitab üksnes piiratud määral seadme uudsusele ega tõenda pettust.
device.first_seen string Esimese registreeritud esinemise aeg ISO 8601 vormingus praeguses seadme ajalookirjes. See ajalugu ei ole piiratud sinu API-võtmega ning võib pärast tegevusetuse tõttu kustutamist uuesti alata. Kliendisuhte kestuse määramiseks kasuta oma kontoajalugu. Eraldi väli linked_accounts jääb piiratuks sinu Maskbreaki kliendikontoga.
device.returning boolean True, kui times_seen > 1 — seda seadet on varem hinnatud.
device.linked_accounts integer Mitme erineva kontoga on seda seadet sinu API-võtme all viimase 90 päeva jooksul nähtud. Olemas ainult siis, kui edastad päringus koos fingerprintEventId-ga oma accountId. Seos salvestatakse võtmega räsidena ega ulatu kunagi teise kliendi andmetesse.
device.multi_account boolean True, kui linked_accounts > 1 — mitmikkontode põhisignaal (boonuste kuritarvitamine, prooviperioodide farmimine, topeltregistreerumised). Lisab põhjusekoodi multi_account_device.
account.device_accounts_24h integer Sinu kontod, mida viimase 24 tunni jooksul selles seadmes kontrolliti, see konto kaasa arvatud; null, kui seadme andmeid pole. Alates kolmest lisandub device_many_accounts ja lubamisest saab ülevaatus. Objekt account on olemas, kui saadad accountId tootmisvõtmega (alates 18. oktoobrist 2026).
account.devices_24h integer Seadmed, milles seda kontot viimase 24 tunni jooksul kontrolliti. Alates kolmest lisandub account_many_devices.
account.ip_accounts_24h integer Sinu kontod, mida viimase 24 tunni jooksul sellelt aadressilt kontrolliti, see konto kaasa arvatud. Null, kui aadressi ei mõõdetud või see on jagatud väljapääs (VPN, proksi, andmekeskus, Tor-väljund, Apple’i relee või mobiilioperaatori jagatud aadress), mida ei seota kunagi. Alates kolmest lisandub ip_many_accounts.
account.new_device boolean Tõene, kui seda kontot on varem kontrollitud teises seadmes ja selles mitte kunagi; lisab account_new_device. Null, kui seadme andmeid pole.
account.connected_accounts integer Sinu teised kontod, millel on selle kontoga 90 päeva jooksul ühine seade või aadress; konsool näitab neid. Midagi ei seota klientide vahel.
email.disposable boolean Olemas ainult siis, kui päring sisaldas valikulist email parameetrit. true, kui aadress kasutab teadaolevat ühekordset domeeni — lisab põhjuse disposable_email ja tõstab allow tasemele review.
timezone.reported string Olemas ainult siis, kui päring sisaldas äratuntavat tz-d. Brauseri teatatud IANA vöönd, tagasi peegeldatuna.
timezone.country string ISO 3166-1 alpha-2 riik, kuhu see vöönd kuulub.
timezone.matches_ip boolean true, kui vööndi riik võrdub country-ga (väljund-IP oma). Ehita sellele oma reegel, kui tahad meie omast rangemat poliitikat.
timezone.checked boolean false VPN-i, proksi, Tori või andmekeskuse väljundi puhul, kus lahknevus on ootuspärane ja me ei lisa ühtegi signaali. Kui false, loe matches_ip-d infona, mitte otsusena.
reasons string[] Masinloetavad koodid selle kohta, millised signaalid rakendusid (nt "vpn_detected", "datacenter_asn", "antidetect_browser").
evaluated_in_ms integer Serveripoolne töötlemisaeg selle päringu jaoks millisekundites.
device_evidence string Kas brauserikontroll oli kasutatav: "ok" (seadmesündmus lahendati ja device on olemas), "unavailable" (sündmuse ID saadeti, aga seda ei õnnestunud lahendada: vigane, aegunud, mujalt pärit või kontroll polnud kättesaadav) või "not_sent" (sündmuse ID-d polnud, näiteks vormis, kust väli sentinel_fp eemaldati). Olemas tootmishindamistel, mitte testtokenite, liivakasti ega näidete puhul. Ei muuda kunagi decision-välja: peatage tundlikud toimingud, nagu registreerumised, väljamaksed ja parooli lähtestamised, ise, kui väärtus ei ole "ok".
evidence.network_age_s / evidence.device_age_s / evidence.device_replayed integer / boolean Kui värsked tõendid olid, ainult teadaoleva osas: sekundid võrgumõõtmisest (network_age_s) ja seadmesündmusest (device_age_s) ning kas seadmesündmus märgiti varasema korduseks (device_replayed). Puudub, kui midagi sellest pole teada. Ainult teave; vanad või korduvad tõendid väärivad enne tundlikku toimingut uut kontrolli.
200 OK — kahtlane ühendus
{
  "status": "success",
  "isSuspicious": true,
  "decision": "review",
  "risk_score": 65,
  "ip": "185.107.80.12",
  "country": "EE",
  "network": {
    "vpn": true,
    "proxy": false,
    "privacy_relay": false,
    "datacenter": true,
    "tor": false,
    "anonymous": true,
    "residential": false,
    "service": "PROTON_VPN"
  },
  "reasons": ["vpn_detected", "datacenter_asn"],
  "evaluated_in_ms": 126,
  "details": {
    "ip": "185.107.80.12",
    "cc": "EE",
    "vpn": true,
    "proxied": false,
    "anon": true,
    "dch": true,
    "service": "PROTON_VPN"
  }
}
200 OK — puhas ühendus
{
  "status": "success",
  "isSuspicious": false,
  "decision": "allow",
  "risk_score": 0,
  "ip": "82.131.45.9",
  "country": "DE",
  "network": {
    "vpn": false,
    "proxy": false,
    "privacy_relay": false,
    "datacenter": false,
    "tor": false,
    "anonymous": false,
    "residential": true,
    "service": null
  },
  "reasons": [],
  "evaluated_in_ms": 118
}

Kuidas otsus sünnib

Mootor tagastab proksi, Tori väljundi, tuvastatud boti, emulaatori või brauseri manipuleerimise korral block. VPN üksi, virtuaalmasinas töötav brauser või Apple'i iCloud Private Relay üksi (ainus proksi, mis saadetakse ülevaatusele, mitte ei blokeerita) annab tulemuseks review. Muud signaalid ja sinu reeglistik võivad lõppvastust mõjutada. Pilveserveri või anonüümse võrgu lipp üksi ei põhjusta kindlat blokeeringut. Sinu reeglid ja erandid võivad otsuse üle kirjutada; engine_decision lisatakse siis, kui ülekirjutus otsust muudab, mitte igale vastusele.

Piiratud teabega vastused. Võrguteabe puudumisel tagastatakse degraded: true, ip: "unknown" ja võrgulipud väärtusega false. Need false-väärtused tähendavad, et teave pole kättesaadav, mitte seda, et ühendus on puhas. Seadme- või e-posti signaalid, reeglid ja erandid võivad endiselt anda tulemuseks review või block. Hindamiste koguarvust ja sündmuste logist jäetakse välja ainult lihtne mittekahtlane allow-varuvastus; sisuliste otsuste puhul kehtib tavapärane sündmuste ja kasutusarvestuse käsitlus. Autenditud katsed kasutavad endiselt tunnist päringulimiiti.

Lisalipud. test: true igal testtokeni või testvõtme vastusel, sandbox: true, kui kasutati avalikku sk_test_sandbox võtit, sample: true otspunktil /v1/evaluate/sample. /v1/lookup kannab lisaks täiendavat network.cloud objekti, mis nimetab teenusepakkuja, kui aadress asub avaldatud pilvevahemikus.

Põhjusekoodid

Iga väärtus, mida reasons[] kanda võib, ja mida see tähendab. Uusi koode ainult lisatakse.

  • account_many_devices — üht sinu kontot kontrolliti 24 tunni jooksul kolmes või enamas seadmes (kui saadad accountId; ainult teadmiseks)
  • account_new_device — varem kontrollitud konto seadmes, mida see pole kunagi kasutanud (kui saadad accountId; ainult teadmiseks)
  • anonymous_network — anonüümiv võrk ilma nimetatud operaatorita
  • antidetect_browser — võltsbrauser (antidetect-tööriist või võltsitud keskkond)
  • antidetect_profile_burst — viis või enam uut brauserit ühel seadmetüübil ööpäeva jooksul, igaühel oma lõuendi sõrmejälg: ühe masina võltsbrauseri profiilid (brauseri järjepidevuse beeta; ainult review)
  • antidetect_randomization — üks konto näitab samal seadmetüübil kahe brauseri kahte lõuendi sõrmejälge: juhuslikustav võltsbrauser (brauseri järjepidevuse beeta koos kontotunnusega; ainult review)
  • automation_detected — skript või liideseta (headless) brauser
  • datacenter_asn — andmekeskuse või pilve aadress
  • device_many_accounts — kolm või rohkem sinu kontot ühes seadmes 24 tunni jooksul (kui saadad accountId; lubamisest saab ülevaatus, mitte kunagi blokeerimine)
  • disposable_email — ühekordne e-posti aadress
  • emulator_detected — emulaator
  • gpu_inconsistent — brauseri enda WebGL-aruanne on vastuoluline ja nimetab GPU, mida tal olla ei saa (brauseri järjepidevuse beeta; ainult review)
  • high_activity_device — ebatavaliselt sageli nähtud seade (pehme signaal)
  • ip_blocklisted — mustas nimekirjas olev aadress
  • ip_many_accounts — kolm või rohkem sinu kontot ühelt aadressilt 24 tunni jooksul; jagatud väljapääsud nagu VPN-id ja mobiilioperaatorid ei loe kunagi (kui saadad accountId; ainult teadmiseks)
  • multi_account_device — seade, mis on juba mitme sinu konto taga
  • privacy_relay — Apple'i iCloud Private Relay, proxy_detected asemel (üksi: review)
  • private_browsing — inkognito- või privaataken
  • proxy_detected — residentne või pilveproksi
  • timezone_mismatch — brauseri ajavöönd ei klapi aadressiga (ainult kontrollimisel)
  • tor_exit_node — Tori väljundsõlm
  • virtual_machine — virtuaalmasinas töötav brauser (üksi: review)
  • vpn_detected — VPN-teenus (network.service nimetab selle, kui teada)

Testtokenid

Saada üks neist token-ina oma tootmisvõtme, testvõtme või sk_test_sandbox-iga. Sinu enda võtmetega järgivad need sinu reegleid ja erandikinnitusi (nii on test_vpn üherealine viis reegli kontrollimiseks); neid ei arvestata kunagi. Konsoolist tehtud päringud salvestatakse testridadena, et sündmuste logil oleks midagi näidata.

TokenTeeseldud külastajaSignaalidOtsus
test_clean203.0.113.42 · USmitte midagiallow
test_vpn198.51.100.18 · NLVPN, andmekeskus (PROTON_VPN)review
test_proxy203.0.113.9 · DEproksi, andmekeskus (BRIGHT_DATA)block
test_datacenter203.0.113.7 · DEandmekeskus (AWS)allow
test_tor203.0.113.99 · nullTor (TOR)block

IP-otsing

Otsus paljale IP-aadressile — brauseri tokenit pole vaja. Sama võti ja sama tunnilimiit mis /v1/evaluate; päringutel on oma kuulimiit, mis on paketi külastajakontrollide arv korda 10 (tasuta paketis 100 000 kuus).

GET /v1/lookup/{ip} — serveripoolseks sõelumiseks seal, kus klienti ei jookse: lubamisnimekirja kontrollid, hulgiskoorimine, oma logide rikastamine. Ainult võrgusignaalid (pole seadet, mille sõrmejälge võtta), nii et kasuta /v1/evaluate-i alati, kui brauser on mängus. Palja IP puhul rakenduvad Tori väljundi ja pilvevahemike kontrollid; VPN-i ja proksi tunnelid — ja teenuse nimi väljal network.service — tuvastatakse reaalsel külastusel /v1/evaluate kaudu, nii et signals.vpn ja signals.proxied tulevad siin tagasi väärtusega false.

curl https://maskbreak.com/v1/lookup/185.220.101.34 \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

{
  "ip": "185.220.101.34",
  "known": true,
  "verdict": "block",            // allow | review | block
  "risk_score": 90,
  "signals": { "vpn": false, "proxied": false, "tor": true, "dch": false, "anon": true },
  "network": { "asn": 60729, "org": "Tor exit node", "country": null, "city": null,
               "registration_country": "DE", "source": "asn_table" },
  "latency_ms": 12
}

known: false tähendab, et ühelgi andmeallikal polnud arvamust — otsus on siis allow koos risk_score: 0-ga, mis on „midagi ei leitud“, mitte puhtuse garantii. Töölaual seadistatud erandikinnitused kehtivad ka siin (verdict_source: "exception" koos täiendavalt säilitatud engine_verdict-iga). Signaalide kirjapildid (proxied, dch) on külmutatud — turvaline parsida.

Päringulimiidid

Igal paketil on külastajakontrollide kuulimiit (/v1/evaluate päringud, sh SDK-de evaluate()) ja teenust kaitsev tunnilimiit; lisaks kehtib aadressipõhine lagi. Kumb iganes enne täis saab, tagastab 429.

Ulatus Limiit
Tasuta pakett10 000 külastajakontrolli kuus · kuni 1000 tunnis
Starter50 000 kuus · kuni 5000 tunnis
Growth250 000 kuus · kuni 20 000 tunnis
Scale1 000 000 kuus · kuni 50 000 tunnis
EnterpriseLepingus kokku lepitud
Avalik huviKuulimiiti ega tunnilimiiti pole
Allika IP kohta200 000 päringut tunnis (heakskiidetud avaliku huvi võtmed pääsevad sellest läbi)

Kuulimiit arvestatakse kalendrikuu kaupa UTC järgi ja lähtestub iga kuu 1. kuupäeval kell 00:00 UTC; kasutamata kontrollid järgmisse kuusse ei kandu. /v1/lookup päringutel ja MCP tööriistal lookup_ip on oma kuulimiit, mis on paketi külastajakontrollide arv korda 10 (tasuta paketis 100 000), ja nad jagavad paketi tunnilimiiti. Fikseeritud test_* tokeneid ja avalikku liivakasti võtit ei arvestata kunagi; sinu testvõtmega päringud ja konsooli kontrollid läbivad täieliku tuvastuse ning arvestatakse kuulimiidi sisse. Ülekulu eest lisatasu ei võeta: kui kuu limiit on täis, tagastavad päringud 429 koos "code": "monthly_quota_exceeded" ja Retry-After väärtusega, mis loeb aega kuu 1. kuupäevani, kuni kuu lähtestub või valid suurema paketi. Enne 1. oktoobrit 2026 loodud kontod saavad kuni 30. novembrini 2026 edasi 1000 kontrolli tunnis ilma kuulimiidita. IP-põhine lagi on kaitse ühe masina ohjeldamatu kuritarvituse vastu. Retry-After on igas 429 vastuses kaasas. Paketid ja hinnad

Kui kuu limiit on täis

HTTP/1.1 429 Too Many Requests
Retry-After: 172800   // sekundeid kuu 1. kuupäeva kella 00:00 UTC-ni

{
  "error": "…",   // inimesele loetav; hargne koodi järgi
  "code": "monthly_quota_exceeded"
}

Võtmega /v1/evaluate ja /v1/lookup vastused kannavad ka päiseid X-RateLimit-Limit, X-RateLimit-Remaining ja X-RateLimit-Reset (Unixi sekundid), et saaksid enne 429-t tagasi tõmmata — ning päist X-Request-Id, mida saad toele tsiteerida, kui midagi tundub valesti.

Avaliku huvi programmi võtmetel (haiglad, rahvatervis, riigiasutused, valimised, hädaabiteenistused, ülikoolid, registreeritud mittetulundusühingud) tunnilimiiti pole: kolm X-RateLimit-* päist jäetakse ära, mitte ei täideta asendusväärtusega, ja /v1/usage teatab hourly_limit: null koos uncapped: true.

Töökindlus & fail-open käitumine

Maskbreak tagastab parima saadaoleva teabe, kui mõni analüüsikiht pole kättesaadav. degraded: true näitab konkreetselt puuduvaid võrguandmeid; ainult seadmeteabe pakkuja tõrge seda lippu ei sea. Puuduv device objekt ei tõenda, et brauserikontrollid läbiti. Võrgutõrke või puuduva tokeni korral jäetakse hindamiste koguarvust ja sündmuste logist välja ainult lihtne mittekahtlane allow-varuvastus. Sõltumatud signaalid või reeglistikust tulenevad ülekirjutused võivad endiselt anda salvestatava review- või block-otsuse; isiklikel testvõtmetel säilib testsündmuste käsitlus. Katsed kasutavad endiselt tunnist päringulimiiti. Pakkuja tagasi lükatud token või token, mis ei ole string, annab selle asemel vastuseks 400 Invalid token.. Vali puuduva teabe jaoks selgesõnaline otspunktipõhine varulahendus; ära võrdsusta kättesaamatuid kontrolle ohutu külastajaga.

Veakoodid

Kõik API veavastused sisaldavad error stringivälja. Üks erand, märgitud 403 all: blokeering servas tagastab lihtteksti, mitte JSON-i.

  • 400 Bad Request — vigane token (pakkuja lükkas tagasi või pole string). Puuduv või tühi token pole viga: sellele vastatakse fail-open põhimõttel koos degraded: true.
  • 400 Bad Request päringule /v1/lookup/{ip} — URL-i tee ei sisalda ühte avalikku IPv4- ega IPv6-aadressi: Invalid IP format. või Private or reserved IP — nothing to look up. Teine vastus tuleb ka IPv4-vastendatud aadressile (::ffff:, millele järgneb IPv4-aadress): saada ainult IPv4-aadress.
  • 401 Unauthorized — vigane või puuduv API-võti. Missing Key. tuleb vastuseks ka siis, kui päis on Authorization: Bearer ja selle järel pole midagi: sinu võtit hoidev muutuja oli seal, kus päring tehti, tühi (näiteks pole MASKBREAK_API_KEY selles serveris või shellis määratud). Node saadab määramata muutuja sõnana undefined, millele vastatakse Invalid API Key. /v1 puhul nimetab väli hint tõenäolise põhjuse.
  • 403 Forbidden — konto peatatud (võta ühendust support@maskbreak.com) või päringu tegija IP pole sinu võtme IP-lubamisnimekirjas (Seaded → API võtmed → Lubatud serveriaadressid; väli hint nimetab päringu teinud aadressi). Samalt aadressilt uuesti proovida ei saa.

    Kolmas põhjus, ja see segadust tekitav: paljas error code: 1010 text/plain-vormingus ilma JSON-kehata ei tule meilt — see on meie serv, mis lükkab tagasi sinu HTTP-kliendi vaikimisi User-Agenti. Python-urllib on levinud juhtum. Sea mis tahes päris User-Agent päis ja see kaob; iga ametlik SDK teeb seda juba.
  • 429 Rate Limited — paketi tunnilimiit (tasuta paketis 1000 tunnis) või kuulimiit on täis või täitus eraldi aadressipõhine kaitselimiit. Täis kuulimiidi korral on vastuses "code": "monthly_quota_exceeded" ja selle Retry-After loeb aega kuu 1. kuupäeva kella 00:00 UTC-ni. Testvõtmel on oma tunnilimiit, kuid selle päringud lähevad sama kuulimiidi sisse. Heakskiidetud avaliku huvi kontodel pole kontopõhist limiiti, kuid need ei ole vabastatud kõigist kaitsemeetmetest: /v1/usage, näidisvastused, OAuth ja vigaste võtmete vastane kaitse kasutavad sõltumatuid limiite. Järgi Retry-After väärtust, kui see tagastatakse.
  • 500 Server Error — ootamatu sisemine viga. Kasuta piiratud arvu korduskatseid pikenevate ooteaegadega oma toimingu ajalimiidi piires. Korduskatse võib korrata juba lõpetatud hindamist; ära kunagi korda makset või muud ärilist olekumuutust pimesi.
  • 503 Service Unavailable — koodiga storage_unavailable (väli code): me ei saanud sel hetkel sinu võtit ega kontot kontrollida (meie kontode andmebaas ei vastanud). See ei ole vigane võti: võti, mis ei kuulu ühelegi kontole, on alati 401. Midagi ei hinnatud ja limiiti ei kulunud. Proovi uuesti pärast Retry-After aega (30 sekundit) ja rakenda seni oma katkestuse reeglit; ära kunagi käsitle seda lubamisena.

Kasutus

Sinu võtme kvoodiseis otspunktina — küsi seda, selle asemel et viimase vastuse päistest limiite kraapida.

GET /v1/usage — autendi API-võtme endaga (Authorization: Bearer …). Töötab mõlema võtmetüübiga — sk_live_ ja sk_test_ teatavad kumbki oma tunnilimiidi seisu, nimetatud väljal key_type — ja päring on tasuta: see ei tarbi kunagi kvooti, nii et seda pollivad monitorid ei saa sinu limiiti ära süüa.

curl https://maskbreak.com/v1/usage \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

{
  "key_type": "live",            // or "test"
  "plan": "free",                // free | starter | growth | scale | custom | public_interest
  "monthly_limit": 10000,
  "month_used": 2481,
  "monthly_lookup_limit": 100000,
  "month_lookups_used": 5210,
  "month_resets_at": "2026-08-01T00:00:00.000Z",  // 00:00 UTC on the 1st of next month
  "grandfathered_until": null,   // set while an account created before 1 Oct 2026 keeps its previous allowance
  "hourly_limit": 1000,
  "used_this_hour": 412,
  "remaining": 588,
  "resets_at": "2026-07-19T11:00:00.000Z",  // end of the rolling 60 minutes that began with your first call; null if nothing used yet
  "total_evaluations": 183204,
  "limit_hits": 3
}

used_this_hour ja remaining on nõuandvad: tunniloendurid on mälus ja protsessipõhised, nii et need lähtestuvad juurutamisel — käsitle neid reaalajanäidikuna, mitte auditikirjena (tegeliku limiidi jõustamist see ei mõjuta). total_evaluations (iga arvestatud /v1/evaluate, /v1/lookup ja MCP lookup_ip päring; month_used ja month_lookups_used jagavad jooksva kuu liigi järgi) ja limit_hits on püsivad kontosummad. 30. septembrist 2026 lisaks (täiendavalt): plan (free, starter, growth, scale, custom või public_interest), monthly_limit ja month_used (selle kalendrikuu külastajakontrollid), monthly_lookup_limit ja month_lookups_used (selle kuu /v1/lookup ja MCP lookup_ip päringud), month_resets_at (järgmise kuu 1. kuupäev, 00:00 UTC) ja grandfathered_until (millal enne 1. oktoobrit 2026 loodud konto senine limiit lõpeb, muidu null). Olemasolevad väljad ei muutu.

Limiidid ja teavitused. Tunnine arvestusaken algab sinu esimese päringuga; kuulimiit järgib kalendrikuud (UTC). Omanikule saadetakse kasutushoiatus tunnilimiidi 80% juures ja selle täitumisel, tootmisvõtme puhul kõige rohkem üks kord kummagi läve kohta 24 tunni jooksul, ning kuulimiidi umbes 80% ja 100% juures. Testvõti tunnihoiatusi ei saada; selle päringud lähevad kuulimiidi sisse ja võivad seega käivitada kuulimiidi hoiatused. /v1/usage ei tarbi hindamiskvooti, kuid on piiratud 120 lugemispäringuga minutis aadressi kohta, sealhulgas avaliku huvi kontodel (429 koos Retry-After-iga). Otspunkt ei rakenda võtme IP-lubamisnimekirja; konto peatamine annab siiski vastuseks 403. Korduvad vigased autentimisandmed võivad põhjustada aadressi 15-minutilise blokeeringu (429, Retry-After: 900).

Veebihaagid

Ohuteavitused Slacki, Discordi või sinu enda otspunkti — seadistatakse konsooli Integratsiooni vahekaardil Teavituste all.

Millal need käivituvad. Mootori tuvastatud ohtude puhul (VPN, proksi, Apple'i iCloud Private Relay (review), Tor, andmekeskus koos võltsimisega, botid, antidetect-brauserid, virtuaalmasin (review)) ja iga hindamise puhul, millele sinu enda reeglid määrasid otsuse block. Slacki ja Discordi URL-id saavad kanalisse valmis sõnumi; iga muu HTTPS-otspunkt saab JSON-sündmuse (event: "threat.detected" koos IP, ohutüübi ja signaalide üksikasjadega). Töölaua nupp Saada test saadab sama kujuga sündmuse, milles on event: "test" — kui su vastuvõtja hargneb rangelt sündmuse tüübi järgi, käsitle mõlemat, muidu näeb testnupp välja nagu vaikne tõrge.

Ehtsuse kontroll. Iga tarne on allkirjastatud sinu konto allkirjasaladusega (näha töölaual veebihaagi URL-i kõrval; seal loob Asenda saladus uue: saadetised allkirjastatakse sellega kohe, nii et uuenda vastuvõtjat kohe pärast seda, ja asenda see alati, kui keegi, kes seda nägi, ei tohiks enam teavitusi allkirjastada). Arvuta HMAC_SHA256(secret, timestamp + "." + rawBody), kasutades päist X-Maskbreak-Timestamp, ja võrdle seda (konstantse ajaga) heksdigestiga päises X-Maskbreak-Signature (pärast prefiksit sha256=). Lükka tagasi kõik, mis on allkirjastamata, allkirjaga mittevastav või üle 5 minuti vana.

Kopeeritavad vastuvõtjad. Kaks klassikalist viga on kontrollida uuesti serialiseeritud parsitud keha, mitte toorbaitide vastu, ja võrrelda ==-ga. Need vastuvõtjad teevad seda õigesti:

const crypto = require('crypto');
const express = require('express');
const app = express();

// Raw body required — verify the exact bytes Maskbreak signed,
// never a re-serialized JSON.parse() of them.
app.post('/webhooks/sentinel', express.raw({ type: 'application/json' }), (req, res) => {
  const secret = process.env.SENTINEL_WEBHOOK_SECRET;  // shown next to the URL in the dashboard
  const ts  = req.get('X-Maskbreak-Timestamp') || '';
  const sig = req.get('X-Maskbreak-Signature') || '';

  // Freshness: reject anything older than 5 minutes (replay defense)
  const age = Math.abs(Date.now() / 1000 - Number(ts));
  if (!ts || !Number.isFinite(age) || age > 300) return res.status(400).end();

  // "sha256=" + HMAC_SHA256(secret, timestamp + "." + rawBody), hex digest
  const expected = 'sha256=' + crypto.createHmac('sha256', secret)
    .update(ts + '.').update(req.body).digest('hex');

  // Constant-time compare — never ===
  const a = Buffer.from(sig), b = Buffer.from(expected);
  if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) {
    return res.status(401).end();
  }

  const event = JSON.parse(req.body);  // { event: "threat.detected", event_id, ip, threat_type, details }
  // ... handle it (queue it, alert, block the IP upstream)
  res.status(200).end();  // answer 2xx fast — deliveries time out after 10 s
});
import hashlib, hmac, os, time
from flask import Flask, request, abort

app = Flask(__name__)
SECRET = os.environ["SENTINEL_WEBHOOK_SECRET"].encode()  # shown next to the URL in the dashboard

@app.post("/webhooks/sentinel")
def sentinel_webhook():
    ts  = request.headers.get("X-Maskbreak-Timestamp", "")
    sig = request.headers.get("X-Maskbreak-Signature", "")

    # Freshness: reject anything older than 5 minutes (replay defense)
    try:
        fresh = abs(time.time() - int(ts)) <= 300
    except ValueError:
        fresh = False
    if not fresh:
        abort(400)

    # "sha256=" + HMAC_SHA256(secret, timestamp + "." + raw_body), hex digest.
    # Sign request.get_data() — the exact raw bytes, not request.json.
    expected = "sha256=" + hmac.new(
        SECRET, ts.encode() + b"." + request.get_data(), hashlib.sha256
    ).hexdigest()

    # Constant-time compare — never ==
    if not hmac.compare_digest(sig, expected):
        abort(401)

    event = request.get_json(force=True)  # {"event": "threat.detected", "event_id": ..., "ip": ..., "details": ...}
    # ... handle it (queue it, alert, block the IP upstream)
    return "", 200

Tarne & kordused. Iga sündmust proovitakse kuni 3 korda: ebaõnnestunud tarnet korratakse umbes 1 minuti ja seejärel umbes 8 minuti pärast. Kordused on parima pingutuse põhimõttel ja protsessisisesed — korduse keskel toimuv juurutus jätab ülejäänud katsed ära —, seega käsitle töölaua sündmuste logi tõe allikana ja veebihaaki parima pingutuse tõukena. 25 viimast tarnet (sündmus, tulemus, viga) on kirjas töölaual jaotises Arendaja tööriistad → Veebihaagi teavitused, säilitatakse 30 päeva; päise kiip näitab hetkeseisu ja kui 5 järjestikust tarnet ebaõnnestub, saadame sulle e-kirja — surnud veebihaaki ei tohi kunagi lugeda kui „ohte pole“. Tarned aeguvad 10 s pärast ega järgi kunagi ümbersuunamisi.

Dubleerimise vältimine event_id järgi. Iga kasulik koormus kannab event_id-d — 32 heksmärki, unikaalne iga sündmuse kohta, olemas ka testsündmustel — ja iga tarne kannab seda ka päises X-Maskbreak-Event-Id. Korduvad tarned kasutavad sama event_id-d, nii et kasuta seda oma töötluses unikaalse võtmena ja iga sündmust käsitletakse täpselt üks kord, ükskõik mitu katset sinuni jõuab.

Üldise otspunkti kasulik koormus. Mida su vastuvõtja tegelikult saab (Slacki/Discordi URL-id saavad selle asemel vormindatud sõnumi):

{
  "event": "threat.detected",
  "event_id": "9f2ce7a4c1d84b7fa3d2c05e8b6f4a19",  // unique per event; same on retries
  "timestamp": "2026-07-19T09:14:03.512Z",
  "ip": "185.220.101.34",
  "threat_type": "Tor",              // or "Custom rule (…)" / "Customer exception (…)"
  "details": {
    "ip": "185.220.101.34", "cc": "DE",
    "vpn": false, "proxied": false, "tor": true, "dch": false,
    "bot": false, "tampering": false, "antidetect": false,
    "virtual_machine": false,        // since 29 Sep 2026; tampering = tampered browser or emulator
    "privacy_relay": false,          // since 10 Oct 2026; true = Apple's iCloud Private Relay (review), proxied stays true
    "decision": "block",
    "rule_matched": null,            // signals, when your rule caused the block
    "exception_matched": null        // pins, when your exception caused it
  }
}

MCP AI-agentidele

Hallatud Model Context Protocoli server — suuna AI-agent sellele ja ta saab IP-sid päris Maskbreaki otsustega kontrollida.

Otspunkt: POST https://maskbreak.com/mcp (voogedastatav HTTP, olekuta). Tööriistad: lookup_ip — sama otsus mis GET /v1/lookup — ja service_status. Autendi kas klassikalise API-võtmega Authorization: Bearer sk_live_… või OAuthi access_token-iga otspunktilt POST /oauth/token. Anonüümne kasutus jagab tasuta tööriista rangeid IP-põhiseid limiite; autenditud päringud jagavad sinu paketi tunnilimiiti ja lähevad /v1/lookup päringutega sama kuulimiidi sisse (sinu IP-lubamisnimekiri kehtib ka siin).

{
  "mcpServers": {
    "sentinel": {
      "type": "http",
      "url": "https://maskbreak.com/mcp",
      "headers": { "Authorization": "Bearer sk_live_YOUR_API_KEY" }
    }
  }
}

API stabiilsus & versioonimine

Millele saad ehitada, muretsemata, et pind liigub.

Versioonimine. API on versioonitud tees (/v1/). Ühe peaversiooni sees teeme ainult lisavaid muudatusi: uued vastuseväljad, uued valikulised päringuparameetrid, uued signaalipõhjused. Sinu integratsioon peab taluma tundmatuid välju vastustes — see on ainus edasiühilduvuse nõue, mille sulle seame.

Katkestavad muudatused. Vastuseväljade ümbernimetamine või eemaldamine, tüüpide või tähenduse muutmine või otspunkti sulgemine toimub ainult uues peaversioonis (/v2/). Kui see päev tuleb, töötab /v1/ edasi vähemalt 12 kuud pärast teatamist.

Aegumisteade. Igast aegumisest teatatakse vähemalt 90 päeva ette muudatuste logis ja e-kirjaga mõjutatud API-võtmetele, koos dokumenteeritud migratsiooniteega. Suurkliendilepingud võivad kinnitada pikemad toeaknad — support@maskbreak.com.

Valmis päris liiklusel käivitama?
Tasuta võti alla minutiga — 10 000 kontrolli kuus, ilma kaardita.
Alusta tasuta Proovi otse
KKK

Korduma kippuvad küsimused

Kuidas Maskbreaki API-s autentida?
Edasta oma API-võti Bearer-tokenina Authorization päises: Authorization: Bearer YOUR_API_KEY. API-võtmed genereeritakse pärast registreerumist töölaual, üks konto kohta.
Kui kiire on API vastus?
Iga hindamine tagastab serveripoolse töötlusaja väljas evaluated_in_ms. Kogu ooteaeg sõltub ka võrguühendusest ja kasutatud andmeallikatest. Sea oma serveris ajalimiit, mõõda tegelikku liiklust ning määra käitumine ajalõpu või puudulike signaalide korral.
Milliseid keeli ja SDK-sid toetatakse?
Ametlikud SDK-d on olemas Node.js-ile (@sentinelsup/sdk), Pythonile (sentinelsup) ja PHP-le (sentinelsup/sdk Packagistis), lisaks hallatud MCP-server AI-agentidele. REST API-t saab otse kutsuda igast HTTP-võimelisest keskkonnast, sealhulgas Go, PHP, Ruby, Java, Rust, C#, Kotlin ja Swift.
Mida tasuta pakett sisaldab?
10 000 külastajakontrolli kuus (kuni 1000 tunnis) ilma krediitkaardita. Iga otspunkt ja signaal on tasuta paketis olemas — VPN-i tuvastus, residentse proksi skoorimine, antidetect-brauseri tuvastus ja boti sõrmejälg. Tasulised paketid suurendavad limiiti: Starter 29, Growth 99 ja Scale 299 eurot kuus, lisandub käibemaks.
Mis juhtub, kui ületan oma päringulimiidi?
API tagastab HTTP 429 koos Retry-After päisega. Kehtib kaks paketilimiiti: tunnilimiit (Retry-After ütleb, millal tunniaken lähtestub) ja kuulimiit (monthly_quota_exceeded; Retry-After loeb aega kuu 1. kuupäeva kella 00:00 UTC-ni). Ülekulu eest lisatasu ei võeta: limiiti saab suurendada konsoolis paketi vahetusega, alates Starterist 29 eurot kuus kuni Enterprise’ini alates 990 eurost kuus. Avaliku huvi organisatsioonid (haiglad, rahvatervis, riigiasutused, valimised, hädaabiteenistused, ülikoolid, registreeritud mittetulundusühingud) saavad avaliku huvi programmi lehel taotleda limiidi eemaldamist.