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

# Bloomberry: Search Job Postings

> Search job postings whose descriptions mention a keyword or technology, for one company domain or a normalized job title, as a hiring or technology signal.

Search job postings whose descriptions mention a keyword or technology, for one company domain or a normalized job title, as a hiring or technology signal.

<Info>
  Tool ID: `bloomberry_search_job_postings`
</Info>

## Run this action

Use the TypeScript SDK for a single call. Put `ctx.tools.execute(...)` inside a Play when the call should be durable, scheduled, or run across a CSV.

```ts theme={null}
import { Deepline } from 'deepline';

const deepline = await Deepline.connect();
const result = await deepline.tools.execute(
  'bloomberry_search_job_postings',
  {
    "keyword": "software companies hiring engineers",
    "normalized_job_titles": "VP of Engineering",
    "domain": "example.com"
  },
);

console.log(result.toolResponse.raw);
```

### CLI

```bash theme={null}
deepline tools execute bloomberry_search_job_postings --input '{
  "keyword": "software companies hiring engineers",
  "normalized_job_titles": "VP of Engineering",
  "domain": "example.com"
}' --json
```

## Example response

The SDK exposes this shape at `result.toolResponse.raw`. Values below are representative.

```json theme={null}
{
  "data": {
    "jobs": [
      {
        "id": 123,
        "title": "VP of Engineering",
        "normalized_job_title": "VP of Engineering",
        "regions": [
          "example"
        ],
        "region": "example",
        "description": "Example description",
        "displayed_url": "https://example.com/resource",
        "remote": 0,
        "snapshot_date": "2026-01-15",
        "created_at": "2026-01-15T12:00:00Z",
        "updated_at": "2026-01-15T12:00:00Z",
        "inactive": 0,
        "company_employee_size_range": "example",
        "company_industry": "example",
        "company_domain": "example.com",
        "company_name": "Example Corp"
      }
    ],
    "pagination": {
      "page": 123,
      "per_page": 123,
      "total_pages": 123,
      "total_items": 123
    }
  }
}
```

Use `deepline tools get bloomberry_search_job_postings --json` for the latest machine-readable contract.

## Input reference

Returns job postings, with full-text descriptions containing a given keyword, for a specific company, or for a specific normalized job title Need an API key? Get a free API key here .

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `payload.keyword` | `string` | No | — | A keyword to search for in the full-text description of job postings. You can separate multiple keywords with "OR". For example 'machine learning OR LLMs' will find jobs that have either 'machine learning' or 'LLMs'. Please exclude any quotes from the query |
| `payload.normalized_job_titles` | `string` | No | — | A list of normalized job titles to filter by, separated by ';'. The entire list of normalized job titles can be found here [https://api.revealera.com/normalized\_job\_titles.txt](https://api.revealera.com/normalized_job_titles.txt) (the 2nd column in this CSV) |
| `payload.domain` | `string` | No | — | The website domain of the company to filter by. Note that one of keyword, normalized\_job\_titles, and domain MUST be passed |
| `payload.search_job_title_only` | `boolean` | No | `false` | if keyword is passed, and this is true, we'll search just for the title of the job posting, instead of BOTH the title and the description |
| `payload.begin_date` | `string` | No | — | Start date for filtering job postings. Defaults to '2020-01-01'. Format: `date`. |
| `payload.end_date` | `string` | No | — | End date for filtering job postings. Defaults to end of today. Format: `date`. |
| `payload.search_companies_added_before_date` | `string` | No | — | Only search job postings in companies that were "added" on or before this date. We constantly add companies to our database, so if you're looking at any trends data such as # of job postings over time containining a certain keywords since a certain date (ie. through facets) you wouldn't want to include jobs from companies that were added after a certain date (because that would overinflate the volume for recent months) Format: `date`. |
| `payload.limit` | `integer` | No | `20` | Job postings per page Minimum: 1. Maximum: 20. |
| `payload.active_only` | `boolean` | No | `false` | True if you only want to see active job postings (not deleted or taken down), false otherwise |
| `payload.countries` | `string` | No | — | Only show jobs from companies *headquartered* (not necessarily where the job is located) in the specified countries. Country codes must be in ISO 3166-1 alpha-2 format. Separate multiple values with ';' Pattern: `^[A-Z]&#123;2&#125;(;[A-Z]&#123;2&#125;)*$`. |
| `payload.region_countries` | `string` | No | — | Only show jobs that are located in the specified countries. Country codes must be in ISO 3166-1 alpha-2 format. Separate multiple values with ';' Note: If you pass in a country code, there is a chance we will not show jobs that might be located in that country because our parser wasn't able to parse the country from the job posting Pattern: `^[A-Z]&#123;2&#125;(;[A-Z]&#123;2&#125;)*$`. |
| `payload.exact_match` | `boolean` | No | `true` | True if the job posting must match the keyword passed in EXACTLY, in the order passed. For example, if keyword = "content marketing", only job postings with "content marketing" together as an exact phrase will be returned |
| `payload.company_size_range` | `string` | No | — | Only show jobs from companies with number of employees that match the specified size ranges. Separate multiple values with ';'. Possible ranges are 1 employee, 2-10, 11-50, 51-200, 201-500, 501-1,000, 1,001-5,000, 5,001-10,000, 10,001+ |
| `payload.remote_only` | `boolean` | No | `false` | If true, only show jobs that are marked as remote |
| `payload.show_facets` | `boolean` | No | `false` | If true, show aggregate statistics on number of jobs found per month |
| `payload.facet_on` | `string` | No | — | If you wish to get aggregate statistics on the unique # of companies per month that match this query (NOT # of jobs), pass in 'company\_domain'. Otherwise, pass 'jobs' (default). Only two possible values are allowed: 'jobs' or 'company\_domain'. If show\_facets is false, this field is ignored. |
| `payload.next_token` | `string` | No | — | Pagination token from previous response (located in "pagination" > "next\_token") to fetch the next page. Leave blank for the first page |
| `payload.company_industry` | `string` | No | — | Only show job postings from companies in the specified industries. We look at the LinkedIn company page to determine industries. All possible industries are available at [https://api.revealera.com/linkedin\_industries.txt](https://api.revealera.com/linkedin_industries.txt) . Separate multiple values with ';' |

<details>
  <summary>Show raw input schema</summary>

  ### Input JSON Schema

  ```json theme={null}
  {
    "type": "object",
    "description": "Returns job postings, with full-text descriptions containing a given keyword, for a specific company, or for a specific normalized job title Need an API key? Get a free API key here .",
    "properties": {
      "keyword": {
        "type": "string",
        "description": "A keyword to search for in the full-text description of job postings. You can separate multiple keywords with \"OR\". For example 'machine learning OR LLMs' will find jobs that have either 'machine learning' or 'LLMs'. Please exclude any quotes from the query"
      },
      "normalized_job_titles": {
        "type": "string",
        "description": "A list of normalized job titles to filter by, separated by ';'. The entire list of normalized job titles can be found here https://api.revealera.com/normalized_job_titles.txt (the 2nd column in this CSV)"
      },
      "domain": {
        "type": "string",
        "description": "The website domain of the company to filter by. Note that one of keyword, normalized_job_titles, and domain MUST be passed"
      },
      "search_job_title_only": {
        "type": "boolean",
        "description": "if keyword is passed, and this is true, we'll search just for the title of the job posting, instead of BOTH the title and the description",
        "default": false
      },
      "begin_date": {
        "type": "string",
        "description": "Start date for filtering job postings. Defaults to '2020-01-01'.",
        "format": "date"
      },
      "end_date": {
        "type": "string",
        "description": "End date for filtering job postings. Defaults to end of today.",
        "format": "date"
      },
      "search_companies_added_before_date": {
        "type": "string",
        "description": "Only search job postings in companies that were \"added\" on or before this date. We constantly add companies to our database, so if you're looking at any trends data such as # of job postings over time containining a certain keywords since a certain date (ie. through facets) you wouldn't want to include jobs from companies that were added after a certain date (because that would overinflate the volume for recent months)",
        "format": "date"
      },
      "limit": {
        "type": "integer",
        "description": "Job postings per page",
        "default": 20,
        "minimum": 1,
        "maximum": 20
      },
      "active_only": {
        "type": "boolean",
        "description": "True if you only want to see active job postings (not deleted or taken down), false otherwise",
        "default": false
      },
      "countries": {
        "type": "string",
        "description": "Only show jobs from companies *headquartered* (not necessarily where the job is located) in the specified countries. Country codes must be in ISO 3166-1 alpha-2 format. Separate multiple values with ';'",
        "pattern": "^[A-Z]{2}(;[A-Z]{2})*$"
      },
      "region_countries": {
        "type": "string",
        "description": "Only show jobs that are located in the specified countries. Country codes must be in ISO 3166-1 alpha-2 format. Separate multiple values with ';' Note: If you pass in a country code, there is a chance we will not show jobs that might be located in that country because our parser wasn't able to parse the country from the job posting",
        "pattern": "^[A-Z]{2}(;[A-Z]{2})*$"
      },
      "exact_match": {
        "type": "boolean",
        "description": "True if the job posting must match the keyword passed in EXACTLY, in the order passed. For example, if keyword = \"content marketing\", only job postings with \"content marketing\" together as an exact phrase will be returned",
        "default": true
      },
      "company_size_range": {
        "type": "string",
        "description": "Only show jobs from companies with number of employees that match the specified size ranges. Separate multiple values with ';'. Possible ranges are 1 employee, 2-10, 11-50, 51-200, 201-500, 501-1,000, 1,001-5,000, 5,001-10,000, 10,001+"
      },
      "remote_only": {
        "type": "boolean",
        "description": "If true, only show jobs that are marked as remote",
        "default": false
      },
      "show_facets": {
        "type": "boolean",
        "description": "If true, show aggregate statistics on number of jobs found per month",
        "default": false
      },
      "facet_on": {
        "type": "string",
        "description": "If you wish to get aggregate statistics on the unique # of companies per month that match this query (NOT # of jobs), pass in 'company_domain'. Otherwise, pass 'jobs' (default). Only two possible values are allowed: 'jobs' or 'company_domain'. If show_facets is false, this field is ignored."
      },
      "next_token": {
        "type": "string",
        "description": "Pagination token from previous response (located in \"pagination\" > \"next_token\") to fetch the next page. Leave blank for the first page"
      },
      "company_industry": {
        "type": "string",
        "description": "Only show job postings from companies in the specified industries. We look at the LinkedIn company page to determine industries. All possible industries are available at https://api.revealera.com/linkedin_industries.txt . Separate multiple values with ';'"
      }
    },
    "required": [],
    "additionalProperties": false
  }
  ```
</details>

## Output reference

Standard tool result payload.

| Name | Type | Required | Default | Details |
| - | - | - | - | - |
| `result.data` | `object` | Yes | — | Provider response payload. |
| `result.data.jobs` | `array` | Yes | — | — |
| `result.data.jobs[].id` | `integer` | Yes | — | Job Posting ID |
| `result.data.jobs[].company_country` | `string` | No | — | Country code of the company that published the job posting |
| `result.data.jobs[].title` | `string` | Yes | — | The job title, as specified by the company |
| `result.data.jobs[].normalized_job_title` | `string` | Yes | — | The normalized job title. For instance, job titles like "java engineer", "aws engineer", all get normalized to "backend engineer" based on our machine learning algorithm. The entire list of normalized job titles can be found here [https://api.revealera.com/normalized\_job\_titles.txt](https://api.revealera.com/normalized_job_titles.txt) (the 2nd column in this CSV) |
| `result.data.jobs[].regions` | `array` | Yes | — | An array of structured regions/locations for this job posting. If we are not able to parse/convert the raw region to a structured list, this is an empty list |
| `result.data.jobs[].region` | `string` | Yes | — | The raw region we extracted from the job posting (unstructured) |
| `result.data.jobs[].description` | `string` | Yes | — | The full-text job description |
| `result.data.jobs[].displayed_url` | `string` | Yes | — | The URL of the job posting Format: `uri`. |
| `result.data.jobs[].currency_code` | `string \| null` | No | — | The currency code of the salary of the job, if found in the job description |
| `result.data.jobs[].min_salary_range` | `number \| null` | No | — | The minimum salary range, if found in the job description |
| `result.data.jobs[].max_salary_range` | `number \| null` | No | — | The maximum salary range, if found in the job description |
| `result.data.jobs[].avg_salary_range` | `number \| null` | No | — | The average salary range, if found in the job description |
| `result.data.jobs[].min_hourly_rate` | `number \| null` | No | — | The minimum hourly rate, if found in the job description |
| `result.data.jobs[].max_hourly_rate` | `number \| null` | No | — | The maximum hourly rate, if found in the job description |
| `result.data.jobs[].avg_hourly_rate` | `number \| null` | No | — | The average hourly rate, if found in the job description |
| `result.data.jobs[].min_experience_years` | `number \| null` | No | — | The minimum number of years of experience required if found in the job description |
| `result.data.jobs[].max_experience_years` | `number \| null` | No | — | The maximum number of years of experience required if found in the job description |
| `result.data.jobs[].remote` | `0 \| 1` | Yes | — | 0 if job is not remote, 1 otherwise Allowed: `0`, `1`. |
| `result.data.jobs[].snapshot_date` | `string` | Yes | — | The date the job posting was found Format: `date`. |
| `result.data.jobs[].created_at` | `string` | Yes | — | The datetime the job posting was created Format: `date-time`. |
| `result.data.jobs[].updated_at` | `string` | Yes | — | The datetime the job posting was updated Format: `date-time`. |
| `result.data.jobs[].linkedin_company_id` | `integer \| null` | No | — | The LinkedIn company ID of the company associated with this job posting |
| `result.data.jobs[].inactive` | `0 \| 1` | Yes | — | 1 if the job posting has been taken down, 0 if it's still up. Note there may be a lag on when we determine a job posting is inactive Allowed: `0`, `1`. |
| `result.data.jobs[].company_number_of_employees` | `integer \| null` | No | — | The number of employees found on LinkedIn for this company |
| `result.data.jobs[].company_employee_size_range` | `string` | Yes | — | The employee size range of the company associated with the job posting |
| `result.data.jobs[].company_industry` | `string` | Yes | — | The industry of the company associated with the job posting, as taken from its LinkedIn company profile |
| `result.data.jobs[].company_domain` | `string` | Yes | — | The website domain of the company associated with the job posting |
| `result.data.jobs[].linkedin_username` | `string \| null` | No | — | The LinkedIn handle of the company associated with the job posting |
| `result.data.jobs[].company_name` | `string` | Yes | — | The name of the company associated with the job posting |
| `result.data.jobs[].company_logo` | `string \| null` | No | — | The URL of the logo of the company associated with the job posting Format: `uri`. |
| `result.data.pagination` | `object` | Yes | — | — |
| `result.data.pagination.page` | `integer` | Yes | — | Current page number |
| `result.data.pagination.per_page` | `integer` | Yes | — | Number of items per page |
| `result.data.pagination.total_pages` | `integer` | Yes | — | Total number of pages |
| `result.data.pagination.total_items` | `integer` | Yes | — | Total number of items |
| `result.meta` | `object` | No | — | Additional response metadata (status, paging). |

<details>
  <summary>Show raw output schema</summary>

  ### Output JSON Schema

  ```json theme={null}
  {
    "type": "object",
    "description": "Standard tool result payload.",
    "properties": {
      "data": {
        "type": "object",
        "description": "Provider response payload.",
        "properties": {
          "jobs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "integer",
                  "description": "Job Posting ID"
                },
                "company_country": {
                  "type": "string",
                  "description": "Country code of the company that published the job posting"
                },
                "title": {
                  "type": "string",
                  "description": "The job title, as specified by the company"
                },
                "normalized_job_title": {
                  "type": "string",
                  "description": "The normalized job title. For instance, job titles like \"java engineer\", \"aws engineer\", all get normalized to \"backend engineer\" based on our machine learning algorithm. The entire list of normalized job titles can be found here https://api.revealera.com/normalized_job_titles.txt (the 2nd column in this CSV)"
                },
                "regions": {
                  "type": "array",
                  "description": "An array of structured regions/locations for this job posting. If we are not able to parse/convert the raw region to a structured list, this is an empty list",
                  "items": {
                    "type": "string"
                  }
                },
                "region": {
                  "type": "string",
                  "description": "The raw region we extracted from the job posting (unstructured)"
                },
                "description": {
                  "type": "string",
                  "description": "The full-text job description"
                },
                "displayed_url": {
                  "type": "string",
                  "description": "The URL of the job posting",
                  "format": "uri"
                },
                "currency_code": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The currency code of the salary of the job, if found in the job description"
                },
                "min_salary_range": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The minimum salary range, if found in the job description"
                },
                "max_salary_range": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The maximum salary range, if found in the job description"
                },
                "avg_salary_range": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The average salary range, if found in the job description"
                },
                "min_hourly_rate": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The minimum hourly rate, if found in the job description"
                },
                "max_hourly_rate": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The maximum hourly rate, if found in the job description"
                },
                "avg_hourly_rate": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The average hourly rate, if found in the job description"
                },
                "min_experience_years": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The minimum number of years of experience required if found in the job description"
                },
                "max_experience_years": {
                  "type": [
                    "number",
                    "null"
                  ],
                  "description": "The maximum number of years of experience required if found in the job description"
                },
                "remote": {
                  "type": "integer",
                  "description": "0 if job is not remote, 1 otherwise",
                  "enum": [
                    0,
                    1
                  ]
                },
                "snapshot_date": {
                  "type": "string",
                  "description": "The date the job posting was found",
                  "format": "date"
                },
                "created_at": {
                  "type": "string",
                  "description": "The datetime the job posting was created",
                  "format": "date-time"
                },
                "updated_at": {
                  "type": "string",
                  "description": "The datetime the job posting was updated",
                  "format": "date-time"
                },
                "linkedin_company_id": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "The LinkedIn company ID of the company associated with this job posting"
                },
                "inactive": {
                  "type": "integer",
                  "description": "1 if the job posting has been taken down, 0 if it's still up. Note there may be a lag on when we determine a job posting is inactive",
                  "enum": [
                    0,
                    1
                  ]
                },
                "company_number_of_employees": {
                  "type": [
                    "integer",
                    "null"
                  ],
                  "description": "The number of employees found on LinkedIn for this company"
                },
                "company_employee_size_range": {
                  "type": "string",
                  "description": "The employee size range of the company associated with the job posting"
                },
                "company_industry": {
                  "type": "string",
                  "description": "The industry of the company associated with the job posting, as taken from its LinkedIn company profile"
                },
                "company_domain": {
                  "type": "string",
                  "description": "The website domain of the company associated with the job posting"
                },
                "linkedin_username": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The LinkedIn handle of the company associated with the job posting"
                },
                "company_name": {
                  "type": "string",
                  "description": "The name of the company associated with the job posting"
                },
                "company_logo": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "The URL of the logo of the company associated with the job posting",
                  "format": "uri"
                }
              },
              "required": [
                "id",
                "title",
                "normalized_job_title",
                "regions",
                "region",
                "description",
                "displayed_url",
                "remote",
                "snapshot_date",
                "created_at",
                "updated_at",
                "inactive",
                "company_employee_size_range",
                "company_industry",
                "company_domain",
                "company_name"
              ],
              "additionalProperties": false
            }
          },
          "pagination": {
            "type": "object",
            "properties": {
              "page": {
                "type": "integer",
                "description": "Current page number"
              },
              "per_page": {
                "type": "integer",
                "description": "Number of items per page"
              },
              "total_pages": {
                "type": "integer",
                "description": "Total number of pages"
              },
              "total_items": {
                "type": "integer",
                "description": "Total number of items"
              }
            },
            "required": [
              "page",
              "per_page",
              "total_pages",
              "total_items"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "jobs",
          "pagination"
        ],
        "additionalProperties": false
      },
      "meta": {
        "type": "object",
        "description": "Additional response metadata (status, paging).",
        "additionalProperties": true
      }
    },
    "required": [
      "data"
    ],
    "additionalProperties": false
  }
  ```
</details>

## Deepline cost

* Pricing model: `per_result` (per result).
* Estimated Deepline credits: `0.09` per pricing unit.

## Related documentation

* [Bloomberry provider guide](/docs/providers/bloomberry/guide)
* [SDK V2 quickstart](/docs/sdk-v2/quickstart)
* [SDK reference](/docs/sdk-v2/sdk-reference)
* [Run tools across a CSV](/docs/sdk-v2/batch-csv)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.