mosparo/php-api-client
PHP API client for mosparo spam protection. Connect to a mosparo instance, send verification requests for form submissions, handle validation results, and integrate bot protection into your PHP/Laravel apps with a simple, lightweight client.
composer require mosparo/php-api-client
use Mosparo\ApiClient\Client;
$client = new Client(
config('mosparo.url'),
config('mosparo.public_key'),
config('mosparo.private_key'),
['timeout' => 10] // Optional Guzzle options
);
$result = $client->verifySubmission(
$formData, // Clean array of form fields (remove mosparo-processed fields)
$_POST['_mosparo_submitToken'],
$_POST['_mosparo_validationToken']
);
if ($result->isSubmittable()) {
// Process valid submission
}
Client class: Core functionality (verification, metadata, stats, rule packages)VerificationResult: Understand field validation states (isSubmittable(), getVerifiedField()).env:
MOSPARO_URL=https://your-mosparo-instance.com
MOSPARO_PUBLIC_KEY=your_public_key
MOSPARO_PRIVATE_KEY=your_private_key
<div id="mosparo-box"></div>
<script src="https://[MOSPARO_URL]/build/mosparo-frontend.js" defer></script>
<script>
window.onload = () => {
new mosparo('mosparo-box', '{{ config("mosparo.url") }}', '{{ $project->uuid }}', '{{ $project->public_key }}');
};
</script>
public function handleFormSubmission(Request $request)
{
$client = app(Client::class);
$formData = $this->sanitizeFormData($request->all());
$result = $client->verifySubmission(
$formData,
$request->input('_mosparo_submitToken'),
$request->input('_mosparo_validationToken')
);
if ($result->isSubmittable()) {
$this->processValidSubmission($formData);
return redirect()->route('thank-you');
}
return back()->withErrors($this->formatVerificationErrors($result));
}
Link custom data to submissions:
$client->storeMetadata(
$_POST['_mosparo_submitToken'],
$_POST['_mosparo_validationToken'],
[
'user_id' => auth()->id(),
'campaign_id' => $request->campaign_id,
'source' => 'newsletter'
]
);
Update rules programmatically:
// 1. Stream hash index for incremental updates
$file = new \SplTempFileObject();
$client->streamRulePackageHashIndex(1, $file, function($progress) {
Log::info("Progress: {$progress}MB");
});
// 2. Batch update rules
$client->batchUpdateRulePackage(1, [
[
'type' => 'update_rule_item',
'rule_id' => 5,
'rule_item_id' => 10,
'value' => 'new_value',
'rating' => 0.8
]
]);
Track submissions in Laravel:
// Daily cron job
$stats = $client->getStatisticByDate(
range: 86400, // Last 24 hours
startDate: now()->subDays(7)
);
$validSubmissions = $stats->getNumberOfValidSubmissions();
$spamSubmissions = $stats->getNumberOfSpamSubmissions();
Register the client as a singleton:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(Client::class, function ($app) {
return new Client(
config('mosparo.url'),
config('mosparo.public_key'),
config('mosparo.private_key'),
['timeout' => 10]
);
});
}
Field Sanitization:
$formData.$formData = array_filter($request->all(), fn($key) => !str_starts_with($key, '_mosparo_'), ARRAY_FILTER_USE_KEY);
Token Validation:
Exception. Validate presence first:
if (empty($_POST['_mosparo_submitToken']) || empty($_POST['_mosparo_validationToken'])) {
throw new \RuntimeException('Mosparo tokens missing');
}
Pagination Handling:
getTotalPages():
$page = 1;
do {
$result = $client->getRulePackageRules($packageId, $page);
$this->processRules($result->getRules());
$page++;
} while ($page <= $result->getTotalPages());
Hash Mismatches:
storeRulePackage fails if hashes don't match.$hash = hash_file('sha256', $filePath);
$client->storeRulePackage($packageId, file_get_contents($filePath), $hash);
$client = new Client($url, $publicKey, $privateKey, [
'debug' => fopen('mosparo_debug.log', 'w'),
'headers' => ['Accept' => 'application/json']
]);
if ($result->hasIssues()) {
foreach ($result->getIssues() as $issue) {
Log::error("Mosparo issue: {$issue['message']}");
}
}
streamRulePackageHashIndex for large rule packages to avoid memory issues.batchUpdateRulePackage over full imports for incremental changes.getStatisticByDate results in Laravel's cache:
$stats = Cache::remember("mosparo_stats_{$range}", now()->addHours(1), function() use ($client, $range) {
return $client->getStatisticByDate($range);
});
VerificationResult to add domain-specific checks:
class CustomVerificationResult extends \Mosparo\ApiClient\VerificationResult {
public function isBusinessValid(): bool {
return $this->getVerifiedField('company') === self::FIELD_VALID
&& $this->getVerifiedField('email') === self::FIELD_VALID;
}
}
$client = new Client($url, $publicKey, $privateKey, [
'handler' => HandlerStack::create([
new RetryMiddleware(),
new AuthMiddleware($privateKey)
])
]);
if ($result->isSubmittable()) {
event(new SubmissionVerified($formData, $result));
}
How can I help you explore Laravel packages today?