> ## Documentation Index
> Fetch the complete documentation index at: https://developer.keverd.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PHP Laravel

# PHP SDK

```bash theme={null}
composer require keverd/keverd
```

PHP 8.1+ with `curl` and `json`.

## Initialize + verify

```php theme={null}
<?php

use Keverd\Keverd;

$keverd = new Keverd([
    'secretKey' => getenv('KEVERD_SECRET_KEY'), // kv_sk_…
]);

$result = $keverd->verify($eventId);

if (($result['action'] ?? null) === 'block') {
    // reject
} elseif (($result['action'] ?? null) === 'allow') {
    // continue
}
```

## Laravel

```php theme={null}
use Keverd\Keverd;
use Illuminate\Http\Request;

Route::post('/login', function (Request $request) {
    $keverd = new Keverd(['secretKey' => config('services.keverd.secret')]);
    $risk = $keverd->verify($request->input('eventId'));

    if (($risk['action'] ?? null) === 'block') {
        return response()->json([
            'error' => 'Blocked',
            'reasons' => $risk['reasons'] ?? [],
        ], 403);
    }

    return ['ok' => true, 'visitorId' => $risk['visitor_id'] ?? null];
});
```

## Webhooks

```php theme={null}
Route::post('/webhooks/keverd', function (Request $request) {
    $keverd = new Keverd(['secretKey' => config('services.keverd.secret')]);

    $event = $keverd->webhooks->constructEvent(
        $request->getContent(), // raw body
        $request->header('X-Keverd-Signature', ''),
        config('services.keverd.webhook_secret'),
    );

    if ($event['type'] === 'verification.completed') {
        $verification = $event['data']['object'];
    }

    return response()->noContent();
});
```

You can also call `Keverd\Webhooks::constructEvent(...)`.
