Overview

The Watheef API allows you to integrate your recruitment workflow with external systems. Push jobs from your ERP, pull applications into your HRIS, and receive real-time webhook notifications when events happen.

Base URL
https://watheef.com/api/v1
Format
JSON
Auth
Bearer Token

Authentication

All requests require an API key passed as a Bearer token. Generate keys from your organization's Settings → API Keys page.

curl -H "Authorization: Bearer wtf_your_api_key" \
  https://watheef.com/api/v1/jobs

Permissions

jobs:readList and view job postings
jobs:writeCreate and update jobs
applications:readView applications and candidates
webhooks:manageCreate and delete webhooks

Rate Limits

120 requests per minute per IP. Exceeding this returns 429 with a Retry-After header.

Error Handling

All errors return a JSON object with an error field.

CodeMeaning
400Bad request — invalid or missing parameters
401Unauthorized — missing or invalid API key
403Forbidden — insufficient permissions
404Not found — resource does not exist
429Rate limit exceeded
500Internal server error

List Jobs

GET/api/v1/jobsjobs:read

Returns a paginated list of jobs for your organization.

Parameters

NameTypeDescription
pageintegerPage number (default: 1)
limitintegerResults per page, max 100 (default: 20)
statusstringPUBLISHED, DRAFT, CLOSED (default: PUBLISHED)

Response

{
  "data": [
    {
      "id": "clx1abc...",
      "title": "Senior Backend Engineer",
      "slug": "senior-backend-engineer",
      "status": "PUBLISHED",
      "employmentType": "CONTRACT",
      "employmentTypeLabel": "Contract",
      "workMode": "REMOTE",
      "workModeLabel": "Remote",
      "location": "Kuwait City",
      "department": "Engineering",
      "skills": ["Node.js", "PostgreSQL", "AWS"],
      "applicantCount": 12,
      "publishedAt": "2026-03-20T12:00:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 5,
    "totalPages": 1
  }
}

Create Job

POST/api/v1/jobsjobs:write

Create a new job posting. Set publish: true to make it live immediately.

Request Body

{
  "title": "Product Manager",
  "description": "We are looking for a Product Manager to own our roadmap...",
  "requirements": "3+ years PM experience in fintech or SaaS",
  "benefits": "Competitive salary, health insurance, annual bonus",
  "employmentType": "FULL_TIME",
  "workMode": "HYBRID",
  "location": "Kuwait City",
  "department": "Product",
  "experienceLevel": "Mid-Senior",
  "skills": ["Agile", "Product Strategy", "Data Analysis"],
  "salaryMin": 800,
  "salaryMax": 1200,
  "showSalary": true,
  "publish": true,
  "expiresInDays": 30
}

Get Job

GET/api/v1/jobs/:idjobs:read

Returns a single job with pipeline stage statistics and application count.

List Applications

GET/api/v1/applicationsapplications:read

Returns applications across all jobs, including candidate details and pipeline stage.

Parameters

NameTypeDescription
job_idstringFilter by job ID
statusstringAPPLIED, SCREENING, INTERVIEWING, OFFERED, HIRED, REJECTED
pageintegerPage number (default: 1)
limitintegerResults per page, max 100 (default: 20)

List Webhooks

GET/api/v1/webhookswebhooks:manage

Returns all registered webhooks for your organization.

Create Webhook

POST/api/v1/webhookswebhooks:manage

Register a URL to receive webhook events. The response includes a secret for verifying signatures — save it, it won't be shown again.

Request Body

{
  "url": "https://your-erp.com/webhooks/watheef",
  "events": [
    "application.created",
    "application.hired",
    "job.created"
  ]
}

Response

{
  "data": {
    "id": "clx2def...",
    "url": "https://your-erp.com/webhooks/watheef",
    "events": ["application.created", "application.hired", "job.created"],
    "secret": "a1b2c3d4e5f6a1b2c3d4e5f6...",
    "active": true
  }
}

Delete Webhook

DELETE/api/v1/webhooks/:idwebhooks:manage

Permanently removes a webhook. Events will no longer be sent to this URL.

Event Types

Subscribe to any combination of these events when creating a webhook.

EventTrigger
application.createdCandidate submits a new application
application.stage_changedApplication moves to a new pipeline stage
application.hiredCandidate is marked as hired
application.rejectedCandidate is rejected
job.createdNew job posting is created
job.closedJob posting is closed
message.receivedNew message in a conversation

Payload Format

{
  "event": "application.created",
  "data": {
    "applicationId": "clx3ghi...",
    "candidateName": "Ahmad Ali",
    "jobTitle": "Senior Engineer",
    "status": "APPLIED"
  },
  "timestamp": "2026-03-21T16:00:00.000Z"
}

Verifying Signatures

Every webhook request includes an X-Watheef-Signature header. Verify it using HMAC-SHA256 with your webhook secret.

const crypto = require("crypto");

function verifyWebhook(rawBody, secret, signature) {
  const expected = crypto
    .createHmac("sha256", secret)
    .update(rawBody)
    .digest("hex");
  return expected === signature;
}

// Express.js example:
app.post("/webhooks/watheef", (req, res) => {
  const sig = req.headers["x-watheef-signature"];
  if (!verifyWebhook(JSON.stringify(req.body), SECRET, sig)) {
    return res.status(401).send("Invalid signature");
  }
  // Process the event...
  res.sendStatus(200);
});

ERP Integration

Connect Watheef with your ERP to automate the hiring workflow end-to-end.

1

Push jobs from ERP

When a headcount is approved in your ERP, create the job listing automatically.

POST /api/v1/jobs
2

Receive hire notifications

Register a webhook to get notified when a candidate is hired, then create their employee record in your ERP.

webhook: "application.hired"
3

Sync pipeline data

Poll applications or use stage_changed webhooks to keep your HRIS updated with candidate progress.

GET /api/v1/applications?status=HIRED

ODOO Integration

ODOO is popular in Kuwait. Here's how to connect Watheef with your ODOO instance.

# In your ODOO custom module, call Watheef when
# a recruitment request is approved:

import requests

WATHEEF_API_KEY = "wtf_your_key_here"
BASE_URL = "https://watheef.com/api/v1"

def create_watheef_job(recruitment_request):
    response = requests.post(
        f"{BASE_URL}/jobs",
        headers={"Authorization": f"Bearer {WATHEEF_API_KEY}"},
        json={
            "title": recruitment_request.job_title,
            "description": recruitment_request.description,
            "department": recruitment_request.department_id.name,
            "location": "Kuwait City",
            "employmentType": "FULL_TIME",
            "publish": True,
        }
    )
    return response.json()

SAP Integration

For SAP SuccessFactors or SAP HCM integration, use the same REST endpoints. Create a middleware service that translates between SAP's data model and Watheef's API. Contact [email protected] for enterprise integration support.