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: 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