PHP SDK
The official Qudra SDK for PHP 8.1+. Built on Guzzle, PSR-4 autoloaded, with a first-class Laravel service provider.
Install
composer require qudra/sdkQuick start
<?php
use Qudra\Client;
$qudra = new Client(['api_key' => getenv('QUDRA_API_KEY')]);
$job = $qudra->jobs->create([
'title' => 'Senior Backend Engineer',
'description' => 'Build the Qudra matching pipeline.',
'city' => 'Riyadh',
'employment_type' => 'full_time',
'salary_min' => 18000,
'salary_max' => 30000,
'currency' => 'SAR',
]);
echo $job['qudra_url'];Configuration
$qudra = new Client([
'api_key' => 'qk_live_…', // required
'sandbox' => false, // optional
'base_url' => 'https://api.qudrah.io/v1', // optional override
'timeout' => 30, // seconds
]);Jobs
// Create
$job = $qudra->jobs->create([
'title' => '…', 'city' => 'Riyadh', 'employment_type' => 'full_time',
'salary_min' => 15000, 'salary_max' => 22000,
]);
// List
foreach ($qudra->jobs->list(['status' => 'active']) as $job) {
echo $job['id'] . ' — ' . $job['title'] . PHP_EOL;
}
// Retrieve / Update / Delete
$job = $qudra->jobs->retrieve('job_01HXY…');
$qudra->jobs->update('job_01HXY…', ['status' => 'paused']);
$qudra->jobs->delete('job_01HXY…');
// Bulk
$result = $qudra->jobs->bulkCreate([
'jobs' => [
['title' => 'Backend', 'city' => 'Riyadh', 'employment_type' => 'full_time', 'salary_min' => 15000, 'salary_max' => 22000],
['title' => 'Frontend', 'city' => 'Jeddah', 'employment_type' => 'full_time', 'salary_min' => 14000, 'salary_max' => 20000],
],
]);
echo count($result['created']) . ' jobs created';Webhooks
// Register
$wh = $qudra->webhooks->register([
'url' => 'https://your-app.example.com/webhooks/qudra',
'events' => ['job.created', 'job.matched'],
]);
echo 'Save this secret: ' . $wh['secret'];
// Verify
$raw = file_get_contents('php://input');
if (!$qudra->webhooks->verify($raw, $_SERVER['HTTP_X_QUDRA_SIGNATURE'], $WEBHOOK_SECRET)) {
http_response_code(401);
exit;
}
$event = json_decode($raw, true);
// …handle event…
http_response_code(200);The verify() helper uses hash_equals internally for constant-time comparison.
Laravel integration
The SDK ships with a Laravel service provider, auto-registered via Composer.
php artisan vendor:publish --tag=qudra-configAdd your key to .env:
QUDRA_API_KEY=qk_live_…
QUDRA_SANDBOX=false
QUDRA_WEBHOOK_SECRET=whsec_…Then inject anywhere:
use Qudra\Client;
class JobSyncController extends Controller
{
public function store(Request $req, Client $qudra)
{
$job = $qudra->jobs->create($req->validated());
return response()->json($job, 201);
}
}Or use the Qudra facade:
use Qudra\Laravel\Facades\Qudra;
$job = Qudra::jobs()->create([...]);Error handling
use Qudra\QudraException;
try {
$qudra->jobs->create(['title' => '', 'city' => 'Riyadh']);
} catch (QudraException $e) {
echo $e->getCode(); // 'partner.validation_error'
echo $e->getMessage(); // English
echo $e->getMessageAr(); // Arabic
print_r($e->getFields()); // ['title' => 'must be a non-empty string']
echo $e->getRequestId(); // 'req_01HXY…'
}