> ## 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.

# Job-Suche

> Finden Sie offene Stellenausschreibungen nach Unternehmen, Titel, Funktion, Senioritätsstufe, Land und Ausschreibungsdatum — und lesen Sie die Klassifizierung, die Pubrio jeder Ausschreibung hinzufügt.

[Job Search](/de/api-reference/endpoint/companies/job_search) liefert von Pubrio erfasste offene Stellenausschreibungen zurück, eine Zeile pro Ausschreibung, jeweils verknüpft mit dem Unternehmen, das sie veröffentlicht hat. Jede Zeile enthält die Rohausschreibung (Titel, Standort, URL, Veröffentlichungsdatum) sowie drei Felder, die Pubrio aus dem Titel ableitet: `functions`, `seniority_rank` und `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
  }'
```

## Wann verwenden

* **Einstellungssignale für einen Account** — geben Sie das Unternehmen an und lesen Sie, wofür, wo und auf welcher Ebene es einstellt.
* **Prospecting nach Rolle** — durchsuchen Sie ein Land nach Unternehmen, die Senior-Engineering- oder -Sales-Rollen ausschreiben, und springen Sie dann mit der `domain_search_id` aus jeder Zeile zu [People Search](/de/api-reference/endpoint/people/search).
* **Inkrementelle Synchronisierung** — pollen Sie mit `created_at` auf den neuesten gespeicherten Erfassungszeitpunkt gesetzt.

Wenn Sie eine laufende Summe statt Zeilen möchten, verwenden Sie [Job Insights](/de/api-reference/endpoint/companies/job_insights). Wenn Sie benachrichtigt werden möchten, sobald ein Unternehmen eine Stelle ausschreibt, erstellen Sie einen [Monitor](/de/developer-guides/examples/tracking-job-postings) mit `signal_types: ["jobs"]`.

## Auf ein Unternehmen eingrenzen

Die schnellsten Suchen benennen das Unternehmen. Alle drei Identifikatoren lösen sich zum selben Datensatz auf und können gemischt werden:

| Schlüssel       | Wert                                          | Hinweise                                                                  |
| --------------- | --------------------------------------------- | ------------------------------------------------------------------------- |
| `domains`       | `["stripe.com"]`                              | URLs wie `https://www.stripe.com/jobs` werden auf die Domain normalisiert |
| `linkedin_urls` | `["https://www.linkedin.com/company/stripe"]` | Nur Unternehmensseiten                                                    |
| `companies`     | `["5378845d-7726-4817-aba9-ced8c5f41dee"]`    | `domain_search_id` aus einer früheren Antwort                             |

Suchen ohne Unternehmen sind erlaubt — `{"locations": ["SG"], "seniority_ranks": [5]}` funktioniert — zählen aber gegen den gesamten Index. `total_entries` ist dann eine Schätzung, und `is_timeout` kann bei sehr breiten Filtern `true` sein.

## Filter

### Text

| Schlüssel      | Typ        | Trifft zu auf                                                                                                                   |
| -------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------- |
| `titles`       | `string[]` | Jobtitel. Wortbasierter Abgleich, sodass `["engineer"]` auch `Senior Software Engineer` liefert. Beliebiger aufgeführter Titel. |
| `search_term`  | `string`   | Freitext gegen den Ausschreibungstitel.                                                                                         |
| `search_terms` | `string[]` | Mehrere Freitextbegriffe, von denen jeder zutreffen kann.                                                                       |

### Klassifizierung

| Schlüssel         | Typ         | Trifft zu auf                                                                                                                                                                                                  |
| ----------------- | ----------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `functions`       | `string[]`  | Aus dem Titel abgeleitete Funktions-Slugs: `engineering`, `sales`, `marketing`, `finance`, `product_management`, … Beliebiger aufgeführter Slug. Siehe [Jobfunktionen](/de/api-reference/enums#job-functions). |
| `seniority_ranks` | `integer[]` | `1` junior · `2` senior · `3` manager · `4` director · `5` executive. Siehe [Senioritätsstufen](/de/api-reference/enums#seniority-ranks).                                                                      |

<Warning>
  Die beiden verhalten sich bei ungültiger Eingabe unterschiedlich. Ein unbekannter `functions`-Slug liefert **null** Zeilen. Ein `seniority_ranks`-Wert außerhalb von 1–5 wird **ignoriert** und liefert jede Zeile. Keiner der beiden löst einen Fehler aus.
</Warning>

### Daten

| Schlüssel      | Typ                        | Trifft zu auf                                                                                                                                                                                                                                      |
| -------------- | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `launch_dates` | `[von, bis]`               | Das Ausschreibungsdatum — `posting_date`, wenn der Veröffentlicher eines angibt, andernfalls der Tag, an dem Pubrio die Stelle erstmals gesehen hat. UTC-Tagesgrenzen; stimmt mit Job Insights überein, daher **standardmäßig hierfür verwenden.** |
| `posted_dates` | `[von, bis]`               | Nur `posting_date`. Tagesgrenzen richten sich nach der Workspace-Zeitzone.                                                                                                                                                                         |
| `created_at`   | Datum oder ISO-Zeitstempel | Erfasst zu diesem Zeitpunkt oder danach (UTC). Übergeben Sie das exakte `created_at` Ihrer neuesten gespeicherten Zeile für inkrementelles Polling.                                                                                                |

Beide Fenster sind inklusive. `launch_dates` mit einem einzelnen Element trifft auf genau diesen Tag zu.

### Standort

| Schlüssel           | Typ         | Trifft zu auf                                                                                                                                                                         |
| ------------------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `locations`         | `string[]`  | Land der Ausschreibung, ISO alpha-2.                                                                                                                                                  |
| `exclude_locations` | `string[]`  | Auszuschließendes Ausschreibungsland.                                                                                                                                                 |
| `location_ids`      | `integer[]` | Ausschreibungsland per Pubrio-`location_id`, dieselben Zahlen, die der Endpunkt [Locations](/de/api-reference/endpoint/locations/locations) und die `location_id` jeder Zeile führen. |
| `company_locations` | `string[]`  | Land des **Unternehmenssitzes**, das vom Standort der Stelle abweichen kann.                                                                                                          |

### Paginierung und Reihenfolge

| Schlüssel            | Standard | Hinweise                                                                                      |
| -------------------- | -------- | --------------------------------------------------------------------------------------------- |
| `per_page`           | 25       | Gedeckelt durch `max_search_per_page` Ihres Plans.                                            |
| `page`               | 1        | Gedeckelt durch `max_search_page`; `total_display_pages` der Antwort nennt die Obergrenze.    |
| `is_ascending_order` | `false`  | Zeilen werden nach `created_at` sortiert, neueste zuerst. `true` kehrt zu ältesten zuerst um. |

## So sieht eine Zeile aus

```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` ist `null` und `seniority_rank` ist `0`, wenn der Titel nicht klassifiziert werden konnte. Filtern Sie trotzdem darauf — nicht klassifizierte Zeilen treffen einfach nicht zu.
* `posting_date` ist das Datum des Veröffentlichers; `created_at` ist, wann Pubrio die Ausschreibung erstmals gesehen hat, und ist der standardmäßige Sortierschlüssel.
* `job_id` und `job_search_id` sind derselbe Wert; übergeben Sie einen von beiden an [Job Lookup](/de/api-reference/endpoint/companies/job_lookup).

### `metadata` prüfen, bevor Sie einem Ergebnis vertrauen

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

`ignored_fields` listet jeden Body-Schlüssel auf, den der Endpunkt nicht erkannt hat. Ein Tippfehler wie `"seniorty_ranks"` lässt die Anfrage nicht fehlschlagen — er weitet sie stillschweigend aus. Prüfen Sie bei allem Automatisierten, dass dieses Array leer ist.

## Rezepte

<Tabs>
  <Tab title="Senior-Engineering-Einstellungen, letzte 30 Tage">
    <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="Wer stellt Sales-Führungskräfte in Singapur ein">
    ```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
      }'
    ```

    Gruppieren Sie die Zeilen nach `companies.domain_search_id` — jedes einzelne Unternehmen ist ein Prospect, und die ID geht direkt in `companies` bei [People Search](/de/api-reference/endpoint/people/search).
  </Tab>

  <Tab title="Inkrementelle Synchronisierung">
    ```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):
        """Ruft jede Ausschreibung ab, die zu `since` (ISO-Zeitstempel) oder danach erfasst wurde. Gibt den neuen Cursor zurück."""
        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"])  # hier in Ihren Speicher upserten
            if page >= body["data"]["pagination"]["total_display_pages"]:
                break
            page += 1
        return newest

    cursor = sync(["stripe.com"], "2026-09-01T00:00:00Z")
    # `cursor` speichern und beim nächsten Lauf als `since` übergeben
    ```

    Der Cursor ist das vollständige `created_at` der neuesten gespeicherten Zeile, sodass beim nächsten Lauf nur diese eine Zeile erneut geliefert wird. Upserten Sie über `job_id`. Zeilen kommen in der Reihenfolge neueste-zuerst an, sodass ein arbeitsreicher Tag den Cursor nie über die Seitenobergrenze Ihres Plans hinaus verschiebt.
  </Tab>
</Tabs>

## Siehe auch

<CardGroup cols={2}>
  <Card title="Job Search reference" icon="code" href="/de/api-reference/endpoint/companies/job_search">
    Jeder Parameter und jedes Antwortfeld.
  </Card>

  <Card title="Job Insights" icon="chart-column" href="/de/api-reference/endpoint/companies/job_insights">
    Anzahl nach Funktion, Senioritätsstufe, Land und Woche für ein Unternehmen.
  </Card>

  <Card title="Enums & Konstanten" icon="list" href="/de/api-reference/enums">
    Senioritätsstufen und das vollständige Vokabular der Jobfunktionen.
  </Card>

  <Card title="Stellenausschreibungen mit Monitoren verfolgen" icon="bell" href="/de/developer-guides/examples/tracking-job-postings">
    Erhalten Sie einen Webhook statt zu pollen.
  </Card>
</CardGroup>
