Jobs API
The Jobs resource is the heart of the Qudra Partner API. Every job you create flows through the embedding pipeline and becomes matchable against the Qudra seeker graph within ~30 seconds.
The job object
{
"id": "job_01HXY8N1K9PZ3R…",
"title": "Senior Backend Engineer",
"description": "Build the Qudra matching pipeline…",
"city": "Riyadh",
"employment_type": "full_time",
"salary_min": 18000,
"salary_max": 30000,
"currency": "SAR",
"status": "active",
"embedding_status": "ready",
"match_ready": true,
"qudra_url": "https://qudrah.io/jobs/senior-backend-engineer-01hxy…",
"created_at": "2026-05-21T08:14:22.123Z",
"updated_at": "2026-05-21T08:14:54.802Z"
}| Field | Type | Description |
|---|---|---|
| id | string | Stable Qudra-issued id. Prefixed `job_`. |
| title | string | 3–200 chars. Used in matching — be specific. |
| description | string | Up to 20,000 chars. Markdown is rendered on the public page. |
| city | string | KSA city in English (Riyadh, Jeddah, Dammam, NEOM, …). |
| employment_type | enum | `full_time` · `part_time` · `contract` · `internship`. |
| salary_min | integer | Monthly SAR. Required for full_time and contract. |
| salary_max | integer | Monthly SAR. Must be ≥ salary_min. |
| currency | string | Always `SAR` today. Reserved for future expansion. |
| status | enum | `active` · `paused` · `closed`. |
| embedding_status | enum | `processing` · `ready` · `failed`. |
| match_ready | boolean | `true` once embedding is ready and the job is in the match graph. |
| qudra_url | string | Public canonical URL on qudrah.io. |
Create
/v1/partner/jobsCounts against your monthly quota and per-minute rate limit. The embedding runs asynchronously — listen for job.created and job.matched webhooks rather than polling.
Request
curl -X POST https://api.qudrah.io/v1/partner/jobs \
-H "Authorization: Bearer $QUDRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Senior Backend Engineer",
"description": "Build the Qudra matching pipeline. Stack: NestJS, Postgres, pgvector, Redis.",
"city": "Riyadh",
"employment_type": "full_time",
"salary_min": 18000,
"salary_max": 30000,
"currency": "SAR"
}'Response — 201 Created
{
"id": "job_01HXY8N1K9PZ3R…",
"status": "active",
"embedding_status": "processing",
"match_ready": false,
"qudra_url": "https://qudrah.io/jobs/senior-backend-engineer-01hxy…",
"created_at": "2026-05-21T08:14:22.123Z"
}Idempotency
Pass Idempotency-Key: <uuid> to safely retry a create. We deduplicate by hash of (partnerId, idempotencyKey) for 24 hours.
List
/v1/partner/jobsQuery params
| Field | Type | Description |
|---|---|---|
| limit | integer | 1–100. Default 20. |
| cursor | string | Opaque cursor from previous response. |
| status | enum | Filter by `active` · `paused` · `closed`. |
| city | string | Filter by city. |
Response
{
"data": [
{ "id": "job_01HXY…", "title": "…", "status": "active", "match_ready": true, "…": "…" }
],
"next_cursor": "eyJpZCI6Imp…",
"has_more": true
}Retrieve
/v1/partner/jobs/:idReturns the full job object. Returns 404 partner.not_found if the job doesn't belong to your partner.
Update
/v1/partner/jobs/:idSend only the fields you want to change. Updating title or description re-runs the embedding pipeline and temporarily flips match_ready to false.
curl -X PATCH https://api.qudrah.io/v1/partner/jobs/job_01HXY… \
-H "Authorization: Bearer $QUDRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "status": "paused" }'Delete
/v1/partner/jobs/:idSoft-deletes the job: it disappears from the seeker feed and matching graph immediately, but we retain it for 30 days for audit. Returns 204 No Content.
Bulk
/v1/partner/jobs/bulkGrowth and Scale plans only. Create up to 100 jobs in a single request. Counts as one request against your rate limit but N against your monthly job quota.
Request
curl -X POST https://api.qudrah.io/v1/partner/jobs/bulk \
-H "Authorization: Bearer $QUDRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"jobs": [
{ "title": "Backend Engineer", "city": "Riyadh", "employment_type": "full_time", "salary_min": 15000, "salary_max": 22000 },
{ "title": "Frontend Engineer", "city": "Jeddah", "employment_type": "full_time", "salary_min": 14000, "salary_max": 20000 }
]
}'Response — 207 Multi-Status
{
"created": [
{ "index": 0, "id": "job_01HXY…", "status": "active" },
{ "index": 1, "id": "job_01HXZ…", "status": "active" }
],
"errors": []
}Per-item failures are reported in errors with the same shape as a top-level validation error — the rest of the batch still succeeds.