Recruiter
ParaAI matches sent to you by hiring managers
curl -X GET "https://external-api.paraform.com/api/external/v1/recruiter/paraai-recommendations?status=pending&limit=20" \
-H "Authorization: Bearer $PARAFORM_API_KEY"
{
"recommendations": [
{
"id": "string",
"status": "string",
"actionBucket": "new",
"sentAt": "string",
"daysUntilExpiry": 0,
"reachedOutToCandidate": true,
"hiringManagerNote": "string",
"hiringManagerName": "string",
"candidate": {
"candidateId": "string",
"name": "string",
"title": "string",
"oneLiner": "string",
"location": "string",
"linkedinUrl": "string"
},
"role": {
"id": "string",
"name": "string",
"urls": {},
"locations": [],
"company": {},
"compensation": {},
"feePercent": 0
},
"application": {
"progressLabel": "string",
"rejectedAfterStage": "string"
}
}
]
}
Required scopes:
Rate limit:
candidates:read, roles:read, submissions:readRate limit:
default tier, 120 requests per minute per keylistRecommendedRolesForCandidate, where Paraform’s model suggests roles; here a person asked.
Each row carries the hiring manager’s name and their note on why they want the candidate, the role with its pay and your fee, the candidate, and the deadline. A pending match expires 7 days after it is sent (daysUntilExpiry), and unresolved expired matches can pause ParaAI matching for you, so the oldest pending rows are the most urgent.
actionBucket says what to do: new means nobody has contacted the candidate, needs_submission means you marked them contacted but have not submitted, expired means the window closed, closed means submitted or passed.
status narrows the list: pending (default), expired, dismissed, submitted, or all. Pending matches on closed roles are left out; resolved matches are kept. Rows come back oldest first. A page holds at most 20 matches (limit, default 20). Pass nextCursor back as cursor, with the same status, for the next page; nextCursor is absent on the last page. The cursor marks a position, so acting on a match between pages does not skip or repeat rows.
role.feePercent is null when your agency hides payment from its members; agency owners always see it. role.urls.recruit is null until you are approved on the role.
When role.company.confidentialSearch is true the search is confidential: candidate-facing copy must refer to the employer as role.company.anonymizedName and must not name the company or quote copy that identifies it.
This endpoint is read-only; contacting, passing and submitting happen in the Paraform app.
Query parameters
string
default:"pending"
Which matches to return: pending (default), expired, dismissed, submitted, or all.
Allowed values:
pending, expired, dismissed, submitted, all.string
The
nextCursor of the previous page, sent back verbatim. Omit for the first page.
Constraints: min length 1, max length 2048.integer
default:"20"
Matches per page, at most 20. A larger value returns 20.
Constraints: minimum 1.
Response
object[]
required
Show recommendations properties
Show recommendations properties
string
required
string
required
pending, submitted, dismissed or expired.
string
required
What to do next: new, needs_submission, expired or closed. See the endpoint description.
Allowed values:
new, needs_submission, expired, closed.string
required
When the hiring manager sent the match (ISO 8601).
number | null
required
Whole days until a pending match expires, 0 on its last day; null once resolved.
boolean
required
Whether you marked the candidate as contacted.
string | null
required
The hiring manager’s own words on why they want this candidate.
string
required
The hiring manager who sent the match.
object
required
object
required
Show role properties
Show role properties
string
required
string
required
object
required
string[]
required
object
required
object
required
number | null
required
Your placement fee as a percent of first-year salary, null when your agency hides payment.
object
required
How far your submission got, once submitted.
Show application properties
Show application properties
string
Absent on the last page. Opaque: send it back verbatim as
cursor.curl -X GET "https://external-api.paraform.com/api/external/v1/recruiter/paraai-recommendations?status=pending&limit=20" \
-H "Authorization: Bearer $PARAFORM_API_KEY"
{
"recommendations": [
{
"id": "string",
"status": "string",
"actionBucket": "new",
"sentAt": "string",
"daysUntilExpiry": 0,
"reachedOutToCandidate": true,
"hiringManagerNote": "string",
"hiringManagerName": "string",
"candidate": {
"candidateId": "string",
"name": "string",
"title": "string",
"oneLiner": "string",
"location": "string",
"linkedinUrl": "string"
},
"role": {
"id": "string",
"name": "string",
"urls": {},
"locations": [],
"company": {},
"compensation": {},
"feePercent": 0
},
"application": {
"progressLabel": "string",
"rejectedAfterStage": "string"
}
}
]
}
⌘I
curl -X GET "https://external-api.paraform.com/api/external/v1/recruiter/paraai-recommendations?status=pending&limit=20" \
-H "Authorization: Bearer $PARAFORM_API_KEY"
{
"recommendations": [
{
"id": "string",
"status": "string",
"actionBucket": "new",
"sentAt": "string",
"daysUntilExpiry": 0,
"reachedOutToCandidate": true,
"hiringManagerNote": "string",
"hiringManagerName": "string",
"candidate": {
"candidateId": "string",
"name": "string",
"title": "string",
"oneLiner": "string",
"location": "string",
"linkedinUrl": "string"
},
"role": {
"id": "string",
"name": "string",
"urls": {},
"locations": [],
"company": {},
"compensation": {},
"feePercent": 0
},
"application": {
"progressLabel": "string",
"rejectedAfterStage": "string"
}
}
]
}