Dealroom Jobs API

Active job openings posted by companies, with hiring-trend signals.

Operations 2

GET /data/jobs List job openings #
GET /data/jobs/{id} Get single job opening #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/dealroom:dealroom-jobs-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

dealroom-jobs-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Dealroom Jobs API
  version: '2026-10-09'
  description: REST API for the Dealroom platform — companies, funds, founders, investors, funding rounds, valuations, taxonomy, news, and aggregate analytics across all of them. Authentication uses Auth0 (Bearer JWT or OAuth2 client_credentials). All endpoints are versioned via the `API-Version` header (Stripe-style date-based versioning).
  contact:
    name: Dealroom API support
    email: support@dealroom.co
    url: https://dealroom.co
  termsOfService: https://dealroom.co/terms
  license:
    name: Proprietary — Dealroom commercial license
    url: https://dealroom.co/terms
servers:
- url: https://api.dealroom.app
  description: Production
security:
- bearerAuth: []
- oauth2: []
tags:
- name: Jobs
  description: Active job openings posted by companies, with hiring-trend signals.
paths:
  /data/jobs:
    get:
      operationId: listJobs
      security:
      - oauth2:
        - read:jobs
      - bearerAuth:
        - read:jobs
      tags:
      - Jobs
      summary: List job openings
      description: '> ⚠ **DATA INCOMPLETE** — `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded from BigQuery but have <1% coverage (Predict Leads, ~99% of volume, does not supply them) and are intentionally not exposed in the API. The jobs table also covers active openings only (`expired = 0`).


        Returns a paginated list of active job openings, each joined to the hiring company. Supports filtering by entity, source, location (city/country/region IDs), and posted-date range. Sorted by `posted_at` descending by default.'
      parameters:
      - schema:
          type: string
          description: 'Filter expression for job openings.


            Examples:

            - Single: source[eq]:linkedin

            - AND: and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,posted_at[gte]:2024-01-01T00:00:00Z)

            - OR: or(country_id[eq]:2282,country_id[eq]:93)


            Operators: eq, neq, gte, lte, in_any, nin_any

            Default ref: ''jobs''

            '
          example: and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,posted_at[gte]:2024-01-01T00:00:00Z)
        required: false
        description: 'Filter expression for job openings.


          Examples:

          - Single: source[eq]:linkedin

          - AND: and(entity_id[eq]:345d1ab6-33df-4759-9e17-0d0c0ec9ab1c,posted_at[gte]:2024-01-01T00:00:00Z)

          - OR: or(country_id[eq]:2282,country_id[eq]:93)


          Operators: eq, neq, gte, lte, in_any, nin_any

          Default ref: ''jobs''

          '
        name: filter
        in: query
      - schema:
          type: integer
          format: int32
          minimum: 1
          maximum: 2000
          default: 25
          description: Number of results to return (1-2000, default 25)
          example: 25
        required: false
        description: Number of results to return (1-2000, default 25)
        name: limit
        in: query
      - schema:
          type: string
          description: Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
          example: eyJ2IjoxLCJkIjoibmV4dCJ9
        required: false
        description: Opaque cursor token from a previous response's `page.next_cursor` or `page.prev_cursor`. Round-trip it as-is — do not decode or modify.
        name: cursor
        in: query
      - schema:
          type: string
          pattern: ^(?:-?\w+)?(?:,(?:-?\w+)?)*$
          description: Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
          example: -posted_at
        required: false
        description: Sort by one or more keys. Prefix with `-` for descending order; comma-separated for multi-key sorts.
        name: sort
        in: query
      - schema:
          type: boolean
          description: Pass `true` to compute `page.total` (the matching record count). By default no count query runs and `page.total` is `null`.
          example: true
        required: false
        description: Pass `true` to compute `page.total` (the matching record count). By default no count query runs and `page.total` is `null`.
        name: include_total
        in: query
      - schema:
          type: string
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          example: EUR
        required: false
        description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
        name: currency
        in: query
      - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: List of job openings
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobsListResponse'
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '400':
          description: Invalid request parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: VALIDATION_ERROR
                  message: The request was malformed or failed validation.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
                  details: null
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '402':
          description: '`CREDITS_EXHAUSTED` — the caller''s team has no credits left, or none granted yet. Only API-key and MCP requests are capped.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
        '403':
          description: Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
                  details: null
        '503':
          description: '`SERVICE_UNAVAILABLE` — the caller''s team credits could not be checked. Retry shortly.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: SERVICE_UNAVAILABLE
                  message: The service is temporarily unavailable.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
      x-data-status:
        kind: data-incomplete
        gapId: jobs-sparse-fields-unexposed
        reason: '`salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded from BigQuery but have <1% coverage (Predict Leads, ~99% of volume, does not supply them) and are intentionally not exposed in the API. The jobs table also covers active openings only (`expired = 0`).'
        observable: These fields never appear in the `/data/jobs` response; only well-populated fields (title, source, location, posted_at) are returned.
  /data/jobs/{id}:
    get:
      operationId: getJob
      security:
      - oauth2:
        - read:jobs
      - bearerAuth:
        - read:jobs
      tags:
      - Jobs
      summary: Get single job opening
      description: '> ⚠ **DATA INCOMPLETE** — Same as `listJobs`: `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded but intentionally unexposed (<1% coverage), and the table covers active openings only (`expired = 0`).


        Returns one active job opening by numeric ID, joined to the hiring company.'
      parameters:
      - schema:
          type: string
          minLength: 1
          example: '8765432'
          description: Numeric Dealroom job opening ID.
        required: true
        description: Numeric Dealroom job opening ID.
        name: id
        in: path
      - schema:
          type: string
          description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
          example: EUR
        required: false
        description: ISO 4217 currency code for monetary field conversion. Defaults to USD.
        name: currency
        in: query
      - $ref: '#/components/parameters/ApiVersion'
      responses:
        '200':
          description: Single job opening
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobDetailResponse'
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '401':
          description: Authentication required. The `Authorization` header was missing, the bearer token was malformed, or the token failed signature / expiry validation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHORIZED
                  message: Authentication required — provide a valid bearer token.
                  details: null
          headers:
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '402':
          description: '`CREDITS_EXHAUSTED` — the caller''s team has no credits left, or none granted yet. Only API-key and MCP requests are capped.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
        '403':
          description: Authentication succeeded but the caller's token does not include the permission required for this operation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: FORBIDDEN
                  message: You do not have permission to perform this action.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '404':
          description: Job opening not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: The requested resource was not found.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
        '429':
          description: Rate limit exceeded.
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
            Deprecation:
              $ref: '#/components/headers/Deprecation'
            Sunset:
              $ref: '#/components/headers/Sunset'
            Retry-After:
              schema:
                type: string
                description: Seconds to wait before retrying.
                example: '1'
              required: true
              description: Seconds to wait before retrying.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Rate limit exceeded — retry after the delay in the `Retry-After` header.
                  details: null
        '503':
          description: '`SERVICE_UNAVAILABLE` — the caller''s team credits could not be checked. Retry shortly.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: SERVICE_UNAVAILABLE
                  message: The service is temporarily unavailable.
                  details: null
          headers:
            X-Credits-Used:
              $ref: '#/components/headers/X-Credits-Used'
      x-data-status:
        kind: data-incomplete
        gapId: jobs-detail-sparse-fields-unexposed
        reason: 'Same as `listJobs`: `salary_min`, `salary_max`, `currency`, `department`, and `contract_type` are loaded but intentionally unexposed (<1% coverage), and the table covers active openings only (`expired = 0`).'
        observable: These fields never appear in the `/data/jobs/{id}` response; only well-populated fields are returned.
components:
  headers:
    Sunset:
      description: 'Present when the request pinned a superseded version: the date the version stops working and requests begin returning `400` (`YYYY-MM-DD`).'
      schema:
        type: string
        format: date
    X-Credits-Used:
      description: Credits this request consumed, under the current credit schedule. Present on every response to an API-key request under `/data`, `/analytics` and `/reference`; `0` on an error response or a free endpoint. Absent when the request was not authenticated with an API key (so never on a `401`), or on unmetered endpoints. During open beta credits are drawn from the team's balance but not billed.
      schema:
        type: integer
        minimum: 0
      example: 25
    Deprecation:
      description: 'Present when the request pinned a superseded version: the date that version was deprecated (`YYYY-MM-DD`).'
      schema:
        type: string
        format: date
  schemas:
    CappedPaginationPage:
      type: object
      properties:
        total:
          type:
          - number
          - 'null'
        limit:
          type: number
        offset:
          type: number
        next_cursor:
          type:
          - string
          - 'null'
          description: Opaque cursor for the next page. Null when no further pages exist.
        prev_cursor:
          type:
          - string
          - 'null'
          description: Opaque cursor for the previous page. Null when on the first page.
        capped:
          type: boolean
          description: True when the requested page size was reduced to the per-tier/ecosystem row cap.
        tier:
          $ref: '#/components/schemas/AccessTier'
        ecosystem:
          type:
          - string
          - 'null'
          description: Slug of the active ecosystem subdomain, or null when none is in scope.
      required:
      - total
      - limit
      - offset
      - next_cursor
      - prev_cursor
      - capped
      - tier
      - ecosystem
    Job:
      type: object
      properties:
        id:
          type: number
          description: Stable Dealroom job opening ID.
          example: 8765432
        entity:
          $ref: '#/components/schemas/EntityRef'
        title:
          type:
          - string
          - 'null'
          description: Job title as provided by the source.
          example: Senior Backend Engineer
        url:
          type:
          - string
          - 'null'
          description: Canonical URL of the job posting.
          example: https://jobs.example.com/senior-backend-engineer
        source:
          type:
          - string
          - 'null'
          description: Source / provider of the posting (e.g. `linkedin`, `predictleads`).
          example: linkedin
        job_type:
          type:
          - string
          - 'null'
          description: Job type / category as classified by the source.
          example: engineering
        formatted_location:
          type:
          - string
          - 'null'
          description: Human-readable location string as provided by the source.
          example: Berlin, Germany
        post_language:
          type:
          - string
          - 'null'
          description: Detected language of the posting (ISO 639-1).
          example: en
        latitude:
          type:
          - number
          - 'null'
          description: Latitude of the opening location in decimal degrees.
          example: 52.52
        longitude:
          type:
          - number
          - 'null'
          description: Longitude of the opening location in decimal degrees.
          example: 13.405
        posted_at:
          type:
          - string
          - 'null'
          format: date-time
          description: ISO 8601 timestamp the opening was posted.
          example: '2024-06-15T00:00:00.000Z'
        city_unique_id:
          type:
          - number
          - 'null'
          description: Dealroom location ID (`locations.id`) for the city. Use as `city_id` filter value.
          example: 1297711
        state_unique_id:
          type:
          - number
          - 'null'
          description: Dealroom location ID (`locations.id`) for the state/province.
          example: 8205
        country_unique_id:
          type:
          - number
          - 'null'
          description: Dealroom location ID (`locations.id`) for the country.
          example: 133
        continent_unique_id:
          type:
          - number
          - 'null'
          description: Dealroom location ID (`locations.id`) for the continent.
          example: 64
        city_region_unique_ids:
          type:
          - array
          - 'null'
          items:
            type: number
          description: Dealroom location IDs (`locations.id`) for city-regions this opening belongs to. Use as `region_id` filter values.
          example:
          - 8205
      required:
      - id
      - entity
      - title
      - url
      - source
      - job_type
      - formatted_location
      - post_language
      - latitude
      - longitude
      - posted_at
      - city_unique_id
      - state_unique_id
      - country_unique_id
      - continent_unique_id
      - city_region_unique_ids
    OrganizationSubtype:
      type: string
      enum:
      - company
      - university
      - gov_ngo
      - investor
      description: 'The kind of organization: company, university, gov_ngo or investor.'
    JobsListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Job'
        page:
          $ref: '#/components/schemas/CappedPaginationPage'
        currency:
          type: string
      required:
      - data
      - page
      - currency
    AccessTier:
      type: string
      enum:
      - anonymous
      - free
      - premium
      description: 'The access tier applied to this request (anonymous, free, premium). API-key callers report premium: they receive the full field set and are not page-capped.'
    EntityType:
      type: string
      enum:
      - organization
      - person
      description: 'Top-level entity type: `organization` or `person`.'
    EntityRef:
      type: object
      properties:
        uuid:
          type: string
          description: Stable UUID of the entity.
        type:
          $ref: '#/components/schemas/EntityType'
        subtype:
          anyOf:
          - $ref: '#/components/schemas/OrganizationSubtype'
          - type: 'null'
          description: Organization subtype; always null for a person.
        name:
          type: string
          description: Display name.
        image:
          type:
          - string
          - 'null'
          description: Absolute image URL; null when none.
        dealroom_url:
          type:
          - string
          - 'null'
          description: Canonical profile URL on app.dealroom.co.
      required:
      - uuid
      - type
      - subtype
      - name
      - image
      - dealroom_url
      description: 'The identity of an entity embedded in another entity''s response. Closed: richer detail lives on the sub-resource, where tier redaction can reach it.'
    JobDetailResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Job'
        currency:
          type: string
      required:
      - data
      - currency
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
              - VALIDATION_ERROR
              - NOT_FOUND
              - UNAUTHORIZED
              - DATABASE_ERROR
              - UNKNOWN_FILTER
              - FILTER_VALIDATION_ERROR
              - UNSUPPORTED_OPERATOR
              - FILTER_PARSE_ERROR
              - QUERY_TIMEOUT
              - INTERNAL_SERVER_ERROR
              - INVALID_ENTITY_ID
              - PAGINATION_DEPTH_EXCEEDED
              - SCHEMA_ERROR
              - FORBIDDEN
              - EXTERNAL_SERVICE_ERROR
              - ACCOUNT_REQUIRED
              - INSTANCE_ACCESS_REQUIRED
              - SERVICE_UNAVAILABLE
              - RATE_LIMITED
              - CREDITS_EXHAUSTED
              - LIST_LOCKED
              - PATH_RENAMED
              - ENDPOINT_REMOVED
              description: Stable machine-readable error code.
            message:
              type: string
            details:
              anyOf:
              - type: array
                items:
                  type: object
                  properties:
                    path:
                      type: string
                    message:
                      type: string
                  required:
                  - path
                  - message
              - type: object
                additionalProperties:
                  anyOf:
                  - type: string
                  - type: number
                  - type: boolean
              - type: 'null'
          required:
          - code
          - message
          - details
      required:
      - error
  parameters:
    ApiVersion:
      name: API-Version
      in: header
      required: false
      schema:
        type: string
        format: date
        example: '2026-10-09'
      description: Pin a Stripe-style date-based API version (`YYYY-MM-DD`). Omit to use the latest version (`2026-10-09`). A pinned version is supported for 30 days after it is superseded, after which it returns `400`.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: Auth0 JWT access token. Paste a token obtained from your preferred OAuth2 flow. For machine-to-machine use, the OAuth2 client_credentials scheme below can mint a token directly from your `client_id` / `client_secret` inside the Swagger UI Authorize dialog.
    oauth2:
      type: oauth2
      description: OAuth2 client-credentials flow against the Dealroom Auth0 tenant. Use the `client_id` / `client_secret` from a Programmatic API key. Tokens are valid for 24h — Swagger UI will reuse the same token across operations. Revoking or deactivating a key rejects it on the next request (within a ≤5-minute server-side cache window), not at token expiry.
      flows:
        clientCredentials:
          tokenUrl: https://accounts.dealroom.co/oauth/token
          scopes:
            read:entities: Grant the read:entities permission
            read:transactions: Grant the read:transactions permission
            read:valuations: Grant the read:valuations permission
            read:investors: Grant the read:investors permission
            read:founders: Grant the read:founders permission
            read:dimensions: Grant the read:dimensions permission
            read:timeseries: Grant the read:timeseries permission
            read:aggregate: Grant the read:aggregate permission
            read:news: Grant the read:news permission
            read:jobs: Grant the read:jobs permission
            read:people: Grant the read:people permission
            read:search: Grant the read:search permission
x-tagGroups:
- name: Data
  tags:
  - Entities
  - Companies
  - Universities
  - Government & NGO
  - Transactions
  - Valuations
  - Investors
  - Funds
  - People
  - Founders
  - News
  - Jobs
  - Search
- name: Analytics
  tags:
  - Aggregate
  - Timeseries
- name: Reference
  tags:
  - Discovery
  - Filters
x-public-contract: true