Skip to main content
Required scopes: roles:read
Rate limit: default tier, 120 requests per minute per key
The roles the calling recruiter can see on Paraform, the same set and the same ordering as the in-app Browse page. Every filter is optional and they combine with AND. Array filters match ANY of the values given; pass a filter more than once to send several values. query is a full-text search over the role and company that tolerates typos. minSalary and maxSalary are whole numbers of annual salary, compared to each role’s salary band as stored, with no currency conversion, and matched to the nearest 1,000. A bound above 999,000 is read as 999,000. compensation.salaryLowerBound, salaryUpperBound and fee.amountLowerBound are in compensation.currency when it is set; when it is null the currency is not recorded, so it is not necessarily dollars. location, roleType, workplace and talentDensity take ONLY the keys listed in this schema (for example san_francisco, product_management, ON_SITE). A display name such as “San Francisco” or “Product Manager” is rejected with a 400 that names the field and lists the accepted values. primaryOnly narrows to roles where you hold a primary slot: the roles you are working on. approvedOnly narrows to every role where your approval is APPROVED at any access level, primary or not; it is not a list of roles you can submit any candidate to. Both are much cheaper than paging the whole board and reading myRole. investors matches investor names as substrings, ignoring case, so Y Combinator and combinator both work. Set matchMyPreferences to true to fold in the role types, locations, industries, funding rounds and minimum salary saved on your Paraform profile; read them with getRecruiterPreferences. Within one field the saved values are ADDED to the values you send, across fields the filters still combine with AND, and the salary floor is the higher of the two. The search drops a maxSalary below that floor, so the ceiling does not apply. To get only your preferences send this flag and no other filters. Each role carries fee (what the placement pays), pipeline (competition across all recruiters), recruiterAccess (how crowded the role is), hiringManager (rating, responsiveness, recency) and myRole (your approval, whether you are primary, and your own submission counts). fee.percentOfSalary is the rate offered to you and fee.amountLowerBound is that rate at the bottom of the salary band. When your agency hides payment from its members, every fee amount is null. myRole.isApproved is approvalStatus equal to APPROVED. myRole.isPrimary is that plus accessLevel FULL: you hold a primary slot and submit through the normal path. APPROVED with accessLevel CROSS_SUBMIT is single-submission access: no primary slot, and whether a given candidate can go through is decided per candidate, so this flag alone does not mean you can submit. SUBMISSION_REQUEST_ONLY means only candidates a hiring manager specifically requested. approvalStatus null or anything other than APPROVED (PENDING, REJECTED, WITHDRAWN and so on) means you are not on the role; urls.recruit is null in that case. recruiterAccess.density is low, medium or high: how much recruiter competition the role already has, the same tier the Browse page labels. Exact recruiter counts are not published. atMaxCapacity true means the role’s count of pending, unreviewed submissions has reached Paraform’s backlog threshold; it does not say whether you can submit. notAcceptingRecruiters true means the role does not let recruiters join by themselves and you are not on it, so you cannot self-serve onto it right now. hiringManager.responsivenessDays is a weighted average of response times in days; a metric with no data counts as 0, so a very low value can mean little history rather than a fast hiring manager. hiringManager.engagement.finalRating runs 3.5 to 5.0 and percentileRank 0 to 100 against other hiring managers; both are null until the role has enough submissions to rate. myRole.trial is set on a primary slot that is on trial. isActive true means the goal is not yet met inside the window; endingSoon true means the slot is about to be withdrawn. To find slots about to be lost, request primaryOnly and keep every role whose trial.isActive is true, sorted by businessDaysLeft. submissionGoal and submissionsCounted are the trial target and your progress toward it, endsAt the deadline, and businessDaysLeft the same countdown the app shows. The response keeps the Browse order. PAGING: one response is ONE page of at most 20 roles, not the whole board. nextCursor present means more roles match; absent means this page was the last. cursor is a position inside the result list for one exact set of filters. When anything about the search changes (a different query, a filter added, removed or changed), start a NEW search with no cursor; reusing a cursor from a different search does not fail, it silently skips rows. An empty roles array on a fresh first page (no cursor) means nothing matched those filters, not that no roles exist. An empty page reached with a cursor only means there are no more rows at that position. Each row is a summary. getRecruiterRole with the row’s id returns the description, requirements, hiring manager questions, interview stages and recruiting advice. Roles nobody can self-serve onto, and roles whose hiring manager has stopped reviewing, are left out, matching the in-app Browse page. urls.recruit links to the role on Paraform, and urls.browse does when recruit is null. Paraform URLs are not guaranteed to be derivable from an id.

Query parameters

string
Constraints: min length 1.
integer | null
default:"0"
The nextCursor of the previous page. Omit for the first page. Constraints: minimum 0.
integer
default:"20"
Constraints: minimum 1.
string | string[]
string | string[]
Allowed values: REMOTE, ON_SITE, HYBRID.
string | string[]
string | string[]
string | string[]
string | string[]
Allowed values: S_PLUS, S, A, B, C.
integer | null
Constraints: minimum 0.
integer | null
Constraints: minimum 0.
integer | null
Constraints: minimum 0.
integer | null
Constraints: minimum 0.
string
Allowed values: true, false.
string
Allowed values: true, false.
string
Allowed values: true, false.
string
Allowed values: true, false.
string | string[]
string | string[]
string
Allowed values: available, not_available.
number | null
Constraints: minimum 0.
number | null
Constraints: minimum 0.
integer | null
Constraints: minimum 0.
integer | null
Constraints: minimum 0.
integer
Constraints: minimum 1.

Response

object[]
required
number