> ## Documentation Index
> Fetch the complete documentation index at: https://docs.pubrio.com/llms.txt
> Use this file to discover all available pages before exploring further.

# البحث عن الوظائف

> اعثر على إعلانات الوظائف المفتوحة حسب الشركة والمسمى الوظيفي والوظيفة الأساسية ودرجة الأقدمية والدولة وتاريخ النشر — واقرأ التصنيف الذي يضيفه Pubrio لكل إعلان.

يُعيد [البحث عن الوظائف](/ar/api-reference/endpoint/companies/job_search) إعلانات الوظائف المفتوحة التي التقطها Pubrio، صفًا واحدًا لكل إعلان، مرتبطًا بالشركة التي نشرته. يحمل كل صف الإعلان الخام (المسمى، الموقع، الرابط، تاريخ النشر) بالإضافة إلى ثلاثة حقول يشتقها Pubrio من المسمى الوظيفي: `functions` و`seniority_rank` و`location_id`.

```bash theme={null}
curl -X POST https://api.pubrio.com/companies/jobs/search \
  -H "pubrio-api-key: $PUBRIO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "domains": ["stripe.com"],
    "seniority_ranks": [4, 5],
    "launch_dates": ["2026-08-01", "2026-08-31"],
    "per_page": 25
  }'
```

## متى تستخدمه

* **إشارات التوظيف لحساب واحد** — مرّر الشركة واقرأ عن ماذا توظّف، وأين، وبأي مستوى.
* **التنقيب حسب الدور** — ابحث في دولة عن شركات تفتح أدوارًا هندسية أو مبيعات كبيرة، ثم انتقل إلى [People Search](/ar/api-reference/endpoint/people/search) باستخدام `domain_search_id` من كل صف.
* **المزامنة التزايدية** — استعلم دوريًا مع ضبط `created_at` على أحدث وقت استيعاب مخزَّن لديك.

إن أردت حصيلة تراكمية بدل الصفوف، استخدم [رؤى الوظائف](/ar/api-reference/endpoint/companies/job_insights). وإن أردت أن تُبلَّغ عند نشر شركة لوظيفة، أنشئ [Monitor](/ar/developer-guides/examples/tracking-job-postings) بضبط `signal_types: ["jobs"]`.

## التحديد بشركة

أسرع عمليات البحث هي التي تُسمّي الشركة. تُحلّ المعرّفات الثلاثة جميعها إلى نفس السجل ويمكن مزجها:

| المفتاح         | القيمة                                        | ملاحظات                                                    |
| --------------- | --------------------------------------------- | ---------------------------------------------------------- |
| `domains`       | `["stripe.com"]`                              | روابط مثل `https://www.stripe.com/jobs` تُطبَّع إلى النطاق |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` | صفحات الشركات فقط                                          |
| `companies`     | `["5378845d-7726-4817-aba9-ced8c5f41dee"]`    | قيمة `domain_search_id` من أي استجابة سابقة                |

يُسمح بالبحث دون تحديد شركة — يعمل `{"locations": ["SG"], "seniority_ranks": [5]}` — لكنه يُحتسب مقابل الفهرس بأكمله. تكون `total_entries` عندئذٍ تقديرية، وقد تكون `is_timeout` بقيمة `true` مع المرشحات الواسعة جدًا.

## المرشحات

### النص

| المفتاح        | النوع      | يطابق                                                                                                                  |
| -------------- | ---------- | ---------------------------------------------------------------------------------------------------------------------- |
| `titles`       | `string[]` | المسميات الوظيفية. مطابقة على مستوى الكلمة، بحيث تُعيد `["engineer"]` أيضًا `Senior Software Engineer`. أي مسمى مذكور. |
| `search_term`  | `string`   | نص حر مقابل مسمى الإعلان.                                                                                              |
| `search_terms` | `string[]` | عدة عبارات نص حر، تطابق أي منها.                                                                                       |

### التصنيف

| المفتاح           | النوع       | يطابق                                                                                                                                                                                           |
| ----------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `functions`       | `string[]`  | أسماء الوظائف الأساسية المشتقة من المسمى: `engineering`، `sales`، `marketing`، `finance`، `product_management`، … أي اسم مذكور. انظر [الوظائف الأساسية](/ar/api-reference/enums#job-functions). |
| `seniority_ranks` | `integer[]` | `1` مبتدئ · `2` خبير · `3` مدير · `4` مدير تنفيذي · `5` قيادة عليا. انظر [درجات الأقدمية](/ar/api-reference/enums#seniority-ranks).                                                             |

<Warning>
  يتصرف الحقلان بشكل مختلف مع المدخلات غير الصحيحة. الاسم غير المعروف في `functions` يُعيد **صفر** صفوف. أما قيمة `seniority_ranks` خارج النطاق 1–5 فتُتجاهَل وتُعيد كل الصفوف. لا يُطلق أي منهما خطأً.
</Warning>

### التواريخ

| المفتاح        | النوع                  | يطابق                                                                                                                                                                       |
| -------------- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `launch_dates` | `[from, to]`           | تاريخ إطلاق الإعلان — `posting_date` إن قدّم الناشر واحدًا، وإلا فاليوم الذي رصده Pubrio لأول مرة. حدود اليوم بتوقيت UTC؛ يتوافق مع رؤى الوظائف، لذا **استخدمه افتراضيًا.** |
| `posted_dates` | `[from, to]`           | `posting_date` فقط. تتبع حدود اليوم توقيت منطقة عمل حسابك.                                                                                                                  |
| `created_at`   | تاريخ أو طابع زمني ISO | تم الاستيعاب عند هذه اللحظة أو بعدها (UTC). مرّر `created_at` بالضبط لأحدث صف مخزَّن لديك للاستعلام التزايدي.                                                               |

كلا النطاقين شامل للطرفين. تطابق `launch_dates` بعنصر واحد ذلك اليوم بعينه.

### الموقع

| المفتاح             | النوع       | يطابق                                                                                                                                                                   |
| ------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `locations`         | `string[]`  | دولة الإعلان، بترميز ISO حرفين.                                                                                                                                         |
| `exclude_locations` | `string[]`  | دولة الإعلان المستبعدة.                                                                                                                                                 |
| `location_ids`      | `integer[]` | دولة الإعلان حسب `location_id` الخاص بـ Pubrio، وهي نفس الأرقام التي تحملها نقطة [المواقع](/ar/api-reference/endpoint/locations/locations) وحقل `location_id` في كل صف. |
| `company_locations` | `string[]`  | دولة **مقر الشركة**، والتي قد تختلف عن مكان الوظيفة.                                                                                                                    |

### التصفح والترتيب

| المفتاح              | الافتراضي | ملاحظات                                                                              |
| -------------------- | --------- | ------------------------------------------------------------------------------------ |
| `per_page`           | 25        | محدود بسقف `max_search_per_page` في خطتك.                                            |
| `page`               | 1         | محدود بسقف `max_search_page`؛ يخبرك `total_display_pages` في الاستجابة بالحد الأقصى. |
| `is_ascending_order` | `false`   | تُرتَّب الصفوف حسب `created_at`، الأحدث أولًا. تقلب `true` الترتيب إلى الأقدم أولًا. |

## شكل الصف

```json theme={null}
{
  "job_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
  "job_search_id": "4418496a-6a4f-4432-8910-50153e9ba27c",
  "created_at": "2026-08-30T00:02:52.531Z",
  "last_modified": "2026-09-01T16:08:09.324Z",
  "title": "Finance and Strategy Partner",
  "job_url": "https://www.linkedin.com/jobs/view/4460586030",
  "location": "United States",
  "location_id": 357,
  "country": "United States",
  "country_code": "US",
  "posting_date": "2026-08-29",
  "source_type": "linkedin",
  "functions": ["consulting"],
  "seniority_rank": 5,
  "base_salary": null,
  "experience_requirement": null,
  "education_requirement": null,
  "employment_type": null,
  "companies": {
    "domain_search_id": "5378845d-7726-4817-aba9-ced8c5f41dee",
    "company_name": "Stripe",
    "linkedin_name": "stripe",
    "country_code": "US",
    "company_url": "https://stripe.com/",
    "domain": "stripe.com",
    "logo_url": "https://buckets.pubrio.com/company-logo/....jpg"
  }
}
```

* تكون `functions` بقيمة `null` و`seniority_rank` بقيمة `0` عندما يتعذّر تصنيف المسمى. صفِّ عليها رغم ذلك — فالصفوف غير المصنَّفة ببساطة لا تطابق.
* `posting_date` هو تاريخ الناشر؛ أما `created_at` فهو وقت رصد Pubrio للإعلان لأول مرة، وهو مفتاح الترتيب الافتراضي.
* `job_id` و`job_search_id` نفس القيمة؛ مرّر أيًا منهما إلى [Job Lookup](/ar/api-reference/endpoint/companies/job_lookup).

### اقرأ `metadata` قبل الوثوق بأي نتيجة

```json theme={null}
"metadata": {
  "profile": null,
  "filters": { "domains": ["stripe.com"], "seniority_ranks": [4, 5], "per_page": 25, "language": "en" },
  "ignored_fields": []
}
```

تسرد `ignored_fields` أي مفتاح في جسم الطلب لم تتعرّف عليه النقطة الطرفية. خطأ إملائي مثل `"seniorty_ranks"` لا يُفشل الطلب — بل يُوسّعه بصمت. تحقق أن هذه المصفوفة فارغة في أي عملية آلية.

## وصفات جاهزة

<Tabs>
  <Tab title="توظيفات هندسية كبيرة، آخر 30 يومًا">
    <CodeGroup>
      ```bash cURL theme={null}
      curl -X POST https://api.pubrio.com/companies/jobs/search \
        -H "pubrio-api-key: $PUBRIO_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
          "domains": ["stripe.com", "adyen.com", "checkout.com"],
          "functions": ["engineering", "data_science"],
          "seniority_ranks": [3, 4, 5],
          "launch_dates": ["2026-08-05", "2026-09-04"],
          "per_page": 25
        }'
      ```

      ```python Python theme={null}
      import os, requests

      r = requests.post(
          "https://api.pubrio.com/companies/jobs/search",
          headers={"pubrio-api-key": os.environ["PUBRIO_API_KEY"], "Content-Type": "application/json"},
          json={
              "domains": ["stripe.com", "adyen.com", "checkout.com"],
              "functions": ["engineering", "data_science"],
              "seniority_ranks": [3, 4, 5],
              "launch_dates": ["2026-08-05", "2026-09-04"],
              "per_page": 25,
          },
      )
      body = r.json()
      assert body["metadata"]["ignored_fields"] == []
      for job in body["data"]["jobs"]:
          print(job["companies"]["company_name"], "-", job["title"], job["seniority_rank"])
      ```
    </CodeGroup>
  </Tab>

  <Tab title="من يوظّف قادة مبيعات في سنغافورة">
    ```bash cURL theme={null}
    curl -X POST https://api.pubrio.com/companies/jobs/search \
      -H "pubrio-api-key: $PUBRIO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "locations": ["SG"],
        "functions": ["sales", "business_development"],
        "seniority_ranks": [4, 5],
        "launch_dates": ["2026-08-01", "2026-09-04"],
        "per_page": 25
      }'
    ```

    جمّع الصفوف حسب `companies.domain_search_id` — كل شركة مميزة تمثّل عميلًا محتملًا، ويُستخدم هذا المعرّف مباشرة كقيمة `companies` في [People Search](/ar/api-reference/endpoint/people/search).
  </Tab>

  <Tab title="مزامنة تزايدية">
    ```python Python theme={null}
    import os, requests

    API = "https://api.pubrio.com/companies/jobs/search"
    HEADERS = {"pubrio-api-key": os.environ["PUBRIO_API_KEY"]}

    def sync(domains, since):
        """Fetch every posting ingested at or after `since` (ISO timestamp). Returns the new cursor."""
        newest = since
        page = 1
        while True:
            body = requests.post(API, headers=HEADERS, json={
                "domains": domains, "created_at": since, "page": page, "per_page": 25,
            }).json()
            rows = body["data"]["jobs"]
            if not rows:
                break
            for job in rows:  # newest first
                newest = max(newest, job["created_at"])
                print(job["job_id"], job["title"])  # upsert into your store here
            if page >= body["data"]["pagination"]["total_display_pages"]:
                break
            page += 1
        return newest

    cursor = sync(["stripe.com"], "2026-09-01T00:00:00Z")
    # persist `cursor` and pass it as `since` on the next run
    ```

    المؤشّر (cursor) هو قيمة `created_at` الكاملة لأحدث صف خزّنته، بحيث يُعاد تسليم ذلك الصف الواحد فقط في التشغيلة التالية. نفّذ upsert حسب `job_id`. تصل الصفوف بترتيب الأحدث أولًا، لذا لن يدفع يوم مزدحم المؤشّر إلى ما بعد سقف الصفحات في خطتك.
  </Tab>
</Tabs>

## صفحات ذات صلة

<CardGroup cols={2}>
  <Card title="مرجع البحث عن الوظائف" icon="code" href="/ar/api-reference/endpoint/companies/job_search">
    كل معامل وحقل استجابة.
  </Card>

  <Card title="رؤى الوظائف" icon="chart-column" href="/ar/api-reference/endpoint/companies/job_insights">
    عدد الوظائف حسب الوظيفة الأساسية والأقدمية والدولة والأسبوع لشركة واحدة.
  </Card>

  <Card title="التعدادات والثوابت" icon="list" href="/ar/api-reference/enums">
    درجات الأقدمية والمفردات الكاملة للوظائف الأساسية.
  </Card>

  <Card title="تتبّع إعلانات الوظائف باستخدام Monitors" icon="bell" href="/ar/developer-guides/examples/tracking-job-postings">
    احصل على webhook بدل الاستعلام الدوري.
  </Card>
</CardGroup>
