Base URL
https://api.crytify.com
Autentikasi
Kirim API key kamu di setiap request API pakai format Bearer token. Ini kerjanya sama terlepas dari HTTP method-nya — /v1/ip dan /v1/trust itu POST, sedangkan /v1/usage dan /v1/me itu GET.
curl -X POST "https://api.crytify.com/v1/trust" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer cry_live_xxxxxxxxxxxx" \
-d '{ ... }'
IP Lookup
Pakai /v1/ip kalau kamu cuma butuh intelijen jaringan. Biayanya 1 kredit dan ga mengembalikan keputusan trust.
curl -X POST "https://api.crytify.com/v1/ip" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer cry_live_xxxxxxxxxxxx" \
-d '{
"ip": "8.8.8.8"
}'
{
"request_id": "req_123",
"ip": "8.8.8.8",
"network": {
"country": "US",
"network_type": "business"
},
"credits": {
"charged": 1,
"remaining_today": 999
}
}
BIN Lookup
Gratis · Ga perlu API key
Cari tahu jaringan kartu, tipe, bank penerbit, dan negara dari 6–8 digit pertama kartu pembayaran apapun (BIN/IIN). Ga perlu autentikasi — dibatasi 10 request per menit per IP.
curl "https://api.crytify.com/api/bin/453201"
{
"bin": "453201",
"scheme": "Visa",
"type": "Debit",
"brand": "Visa Classic",
"prepaid": false,
"bank": {
"name": "Jyske Bank",
"city": "Silkeborg",
"phone": "+4589893300"
},
"country": {
"name": "Denmark",
"code": "DK",
"emoji": "🇩🇰",
"currency": "DKK"
}
}
| Field | Deskripsi |
| bin |
BIN yang kamu query (6–8 digit). |
| scheme |
Jaringan kartu: Visa, Mastercard, Amex, dll. |
| type |
Credit, Debit, atau Prepaid. |
| brand |
Sub-brand (misalnya Visa Classic, Mastercard Gold). |
| prepaid |
true kalau kartunya prepaid. |
| bank.name |
Nama bank penerbit. |
| country.code |
Kode negara ISO 3166-1 alpha-2. |
| country.currency |
Kode mata uang ISO 4217. |
Mengembalikan HTTP 404 kalau BIN ga ada di database. Mengembalikan HTTP 429 kalau rate limit terlampaui — tunggu dan coba lagi setelah 60 detik.
Trust Decision
Pakai /v1/trust sebelum me-render konten yang dilindungi. Kirim IP, method, path, dan header browser yang sudah disanitasi. Opsional: sertakan objek fingerprint dari JavaScript SDK buat memperbaiki analisis konsistensi request. ↳ JavaScript SDK
curl -X POST "https://api.crytify.com/v1/trust" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer cry_live_xxxxxxxxxxxx" \
-d '{
"ip": "203.0.113.5",
"mode": "hard",
"method": "POST",
"path": "/login",
"url": "https://app.example.com/login",
"challenge_return_url": "https://app.example.com/login",
"headers": {
"user-agent": "Mozilla/5.0 ...",
"accept": "text/html,application/xhtml+xml",
"accept-language": "en-US,en;q=0.9",
"sec-ch-ua-platform": "\"Windows\""
},
"fingerprint": {
"client_context": "generated by the Crytify JavaScript SDK"
}
}'
{
"request_id": "req_456",
"decision": "CHALLENGE",
"mode": "hard",
"trust_score": 42,
"risk_score": 61,
"reasons": [
"identity_risk"
],
"challenge": {
"type": "hosted",
"url": "https://crytify.com/challenge/abc123",
"expires_in": 600,
"token_param": "crytify_challenge_token"
},
"network": {
"country": "US",
"network_type": "unknown"
},
"credits": {
"charged": 8,
"remaining_today": 992
}
}
Alur hosted challenge
Kalau keputusannya CHALLENGE, redirect visitor ke challenge.url. Setelah verifikasi, Crytify redirect balik ke challenge_return_url dengan crytify_challenge_token. Kirim nilai itu sebagai challenge_token di panggilan /v1/trust berikutnya.
Mode test
Tambahkan "test": true ke body request pas kamu lagi eksplorasi alur integrasi. Decision engine beneran tetap jalan — ALLOW/CHALLENGE/BLOCK yang sama kayak yang bakal kamu dapat di production — tapi ga ada apapun dari request itu yang ditulis balik ke data self-learning Crytify (reputasi IP, ASN, atau fingerprint). Kredit tetap kena charge normal, dan request-nya tetap muncul di dashboard kamu ditandai sebagai test request.
Jangan pernah kirim test: true dari traffic visitor beneran — itu cuma buat testing eksplorasi/integrasi kamu sendiri. Testing berulang tanpa itu (misal lewat curl, dari IP yang sama, berkali-kali) bisa numpuk reputasi self-learned beneran ke IP kamu sendiri, persis kayak traffic lain manapun.
Testing langsung di situs kamu sendiri pakai crytify_gate()? Kirim di options array-nya, ga usah edit body request sendiri:
crytify_gate('cry_live_xxxxxxxxxxxx', ['test' => true]);
Usage
GET · Gratis — ga makan kredit
Cek sisa kredit harian dan limit paket buat akun key yang terautentikasi. Berguna buat nampilin usage di dashboard kamu sendiri atau kasih peringatan sebelum habis.
curl "https://api.crytify.com/v1/usage" \
-H "Authorization: Bearer cry_live_xxxxxxxxxxxx"
{
"user_id": 7,
"plan": "free",
"credits": {
"daily_limit": 1000,
"daily_used": 42,
"daily_remaining": 958,
"unlimited": false,
"balance": 0,
"reset_at": "2026-07-04T00:00:00Z"
}
}
Me
GET · Gratis — ga makan kredit
Mengembalikan metadata soal API key yang dipakai dan paket akun saat ini. Berguna buat verifikasi key/mode mana yang aktif tanpa buka dashboard.
curl "https://api.crytify.com/v1/me" \
-H "Authorization: Bearer cry_live_xxxxxxxxxxxx"
{
"api_key": {
"id": 22,
"name": "Default Key",
"prefix": "cry_live_b6ba5ef81c422782",
"default_mode": "medium",
"can_override_mode": false,
"status": "active",
"created_at": "2026-07-03 01:05:42"
},
"account": {
"id": 7,
"plan": "free"
}
}
Mode dan Kredit
| Mode |
Kredit |
Kasus pakai |
| easy | 2 | Halaman konten dengan friksi rendah. |
| medium | 4 | Mode default buat form, halaman akun, dan perlindungan umum. |
| hard | 8 | Login, signup, checkout, admin, dan perlindungan API. |
Kode Error
| Kode | HTTP | Arti |
| invalid_json |
400 |
Body request bukan JSON yang valid. |
| missing_required_field |
400 |
Field wajib seperti ip hilang. |
| invalid_ip |
400 |
Alamat IP yang dikirim ga valid. |
| invalid_api_key |
401 |
API key hilang atau ga valid. |
| insufficient_credits |
402 |
Wallet ga punya cukup kredit. |
| rate_limited |
429 |
Terlalu banyak request. |
| internal_error |
500 |
Error internal. Kredit yang kena charge di-refund. |
Contoh Penerapan
Aplikasi kamu yang nentuin mau ngapain sama keputusan yang dikembalikan. Gate pre-render yang tipikal kira-kira begini:
if ($decision === 'BLOCK') {
http_response_code(403);
exit('Blocked');
}
if ($decision === 'CHALLENGE') {
header('Location: ' . $result['challenge']['url']);
exit;
}
if (!empty($_GET['crytify_challenge_token'])) {
// Send this token in the next /v1/trust call as challenge_token.
}
renderProtectedPage();
Perlindungan Halaman
SDK · Gate dua lapis
SDK Crytify bikin kamu bisa nyembunyiin konten halaman dari bot sebelum sempat dirender atau kelihatan. Ada dua lapis yang saling melengkapi — pakai keduanya bareng buat cakupan maksimal.
1
Gate server-side (PHP)
Evaluasi IP dan header visitor di kode PHP kamu sebelum render apapun. Memblokir semua bot — termasuk yang ga jalanin JavaScript (curl, Python requests, Scrapy, wget).
2
Gate client-side (JS)
Script di <head> langsung nyembunyiin halaman, ngumpulin metadata konsistensi, dan cuma nampilin konten setelah pengecekan trust lolos.
Browser → Your server → Crytify /v1/trust
↓ gate PHP (sebelum render)
Browser → crytify-protect.js → Your endpoint → Crytify /v1/trust
↓ gate JS (sebelum kelihatan)
Cuma halaman entry kamu yang butuh pengecekan penuh. Kalau visitor selalu sampai ke halaman terlindungi lain (checkout, akun) setelah halaman yang udah jalanin crytify_gate(), pakai crytify_require_pass() di situ — pengecekan gratis berbasis cookie doang, ga ada API call dan ga kena kredit. Lihat cara kerjanya →
JavaScript SDK
crytify-protect.js itu script drop-in yang langsung nyembunyiin halaman kamu pas load, ngumpulin fingerprint browser, dan ngirim ke backend kamu. Konten cuma ditampilin setelah backend kamu konfirmasi visitor-nya diizinkan.
1. Pasang di <head> — sebelum script lain manapun
<head>
<!-- Must be the first script in <head> -->
<script src="/crytify-protect.js"
data-endpoint="/api/crytify-check"
data-block-url="/blocked"
data-timeout="5000">
</script>
</head>
Opsi
| Atribut |
Wajib |
Deskripsi |
| data-endpoint |
Ya |
URL endpoint pengecekan trust backend kamu. JS-nya bakal POST fingerprint ke sini. |
| data-block-url |
Tidak |
Redirect ke sini kalau visitor diblokir. Default-nya pesan blokir inline. |
| data-timeout |
Tidak |
Milidetik sebelum fail open (tetap nampilin konten) kalau endpoint kamu ga merespons. Default: 5000. |
| data-debug |
Tidak |
Set ke "true" buat nampilin log keputusan di console browser. |
2. Buat endpoint backend (data-endpoint)
JS-nya nge-POST { "fingerprint": { ... } } ke endpoint kamu. Endpoint kamu manggil Crytify dan mengembalikan { "allow": true } atau { "allow": false }.
<?php
// /api/crytify-check.php — the endpoint crytify-protect.js calls
require 'CrytifyClient.php';
header('Content-Type: application/json');
$body = json_decode(file_get_contents('php://input'), true);
$fingerprint = $body['fingerprint'] ?? null;
$crytify = new CrytifyClient('cry_live_xxxxxxxxxxxx');
$result = $crytify->trust(
CrytifyClient::resolveIp(),
getallheaders(),
['fingerprint' => $fingerprint]
);
echo json_encode(['allow' => $result->isAllow(), 'reason' => $result->reason()]);
Keamanan fail-open: Kalau endpoint kamu ga bisa dijangkau atau lebih lama dari data-timeout milidetik, script-nya otomatis nampilin halamannya. Ini nyegah outage Crytify ngerusak situs kamu buat user beneran.
PHP SDK
CrytifyClient.php itu class PHP mandiri tanpa dependency. Taruh di manapun di project kamu. Pakai sebagai middleware buat nge-gate render halaman sebelum satu byte HTML pun terkirim.
Download
# Copy the file into your project
cp crytify-sdk/CrytifyClient.php your-project/lib/CrytifyClient.php
Penggunaan dasar — gate server-side
Taruh ini di paling atas halaman PHP manapun yang mau kamu lindungi, sebelum ada output apapun.
<?php
require 'CrytifyClient.php';
$crytify = new CrytifyClient('cry_live_xxxxxxxxxxxx', mode: 'medium');
$result = $crytify->trust(
CrytifyClient::resolveIp(), // resolves CF-Connecting-IP / X-Forwarded-For automatically
getallheaders(),
['path' => $_SERVER['REQUEST_URI'], 'method' => $_SERVER['REQUEST_METHOD']]
);
if ($result->isBlock()) {
http_response_code(403);
include 'blocked.html';
exit;
}
if ($result->isChallenge()) {
header('Location: ' . $result->challengeUrl());
exit;
}
// Visitor passed — render your page normally
Method CrytifyResult
| Method | Return | Deskripsi |
| isAllow() |
bool |
true kalau visitor lolos. |
| isChallenge() |
bool |
true kalau verifikasi tambahan direkomendasikan. |
| isBlock() |
bool |
true kalau visitor harus ditolak. |
| challengeUrl() |
?string |
URL hosted challenge Crytify kalau keputusannya CHALLENGE. |
| decision() |
string |
String keputusan mentah: ALLOW, CHALLENGE, atau BLOCK. |
| trustScore() |
int |
0–100. Lebih tinggi berarti lebih dipercaya. |
| riskScore() |
int |
0–100. Lebih tinggi berarti lebih mencurigakan. |
| reason() |
string |
String alasan yang bisa dibaca manusia dari keputusan itu. |
| isFailOpen() |
bool |
true kalau error jaringan menyebabkan fail-open otomatis. |
Filter CodeIgniter 4
Untuk project CI4, pakai class filter yang disediakan buat lindungi route secara deklaratif.
// app/Config/Filters.php
public array $aliases = [
'crytify' => \App\Filters\CrytifyGateFilter::class,
];
// app/Config/Routes.php — protect individual routes
$routes->get('checkout', 'OrderController::checkout', ['filter' => 'crytify']);
// Or protect an entire group
$routes->group('members', ['filter' => 'crytify'], function ($routes) {
$routes->get('dashboard', 'MemberController::dashboard');
$routes->get('profile', 'MemberController::profile');
});
Browser Fingerprint
Ngirim objek fingerprint di /v1/trust nambahin konteks konsistensi client-side yang ga tersedia dari header server doang. Penanganan sinyal detailnya privat dan respons publik cuma nampilin kategori alasan yang luas.
Kategori publik
| Sinyal | Artinya apa | Confidence |
| fingerprint_risk |
Konteks konsistensi client-side ikut berkontribusi ke keputusan. |
kategori publik |
| automation_risk |
Konteks terkait automation ikut berkontribusi ke keputusan. |
kategori publik |
| identity_risk |
Konteks konsistensi sesi atau identitas ikut berkontribusi ke keputusan. |
kategori publik |
Kumpulin fingerprint dengan helper JS
crytify-fingerprint.js ngumpulin semua sinyal dan mengembalikan objek biasa. Pakai ini sendiri kalau kamu mau ngumpulin fingerprint sendiri dan ngirimnya ke server kamu tanpa perilaku auto-hide halaman.
<script src="/crytify-fingerprint.js"></script>
<script>
crytifyFingerprint().then(function (fp) {
// fp is a plain JS object — send it to your server
fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: document.getElementById('email').value,
password: document.getElementById('password').value,
fingerprint: fp, // <-- include fingerprint in your form submission
}),
});
});
</script>
Server kamu terus ngirim fingerprint langsung ke /v1/trust di body request. Ga perlu endpoint Crytify baru.