QudraQudra Docs
Get API key

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/sdk

Quick 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-config

Add 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…'
}