SAP SuccessFactors integration · OData v2 API + Integration Center
Screen SAP SuccessFactors applications with HireLayer
SAP SuccessFactors Recruiting already fills candidate profiles from resumes. HireLayer adds a score for each application against the requisition, with an explanation per criterion and normalized skills, written back through the OData v2 API.
- SuccessFactors API
- OData v2, OAuth 2.0 (SAML bearer)
- Trigger
- Status change or scheduled poll
- Write-back
- Application fields, comments, candidate tags
- Cost
- 2 credits per application, +1 per job
- 1An application moves forwardSAP SuccessFactorsSuccessFactors publishes no event when an application is created. An Integration Center job triggered by a status change, or your scheduled poll, sends the application ID to your service.
- 2Parse the resumeHireLayerYour service reads JobApplication with $expand=resume, decodes the base64 fileContent and sends the file to HireLayer CV Extract.
- 3Score against the requisitionHireLayerHireLayer Match compares the resume with criteria extracted once from the job requisition and returns a score and an explanation per criterion.
- 4Write back to SuccessFactorsSAP SuccessFactorsA MERGE on JobApplication sets your score field, a comment carries the explanation, and a candidate tag marks strong matches.
Use cases
What recruiting teams do with HireLayer and SuccessFactors
Triage high-volume requisitions
Every application gets a score from 0 to 1 and the list of mandatory criteria it meets. Stored in a reportable custom field, the score can be filterd and sorted.
Explain the shortlist
A job application comment lists each criterion with its status and the evidence found in the resume, so hiring managers see why a candidate is ahaed.
Rediscover past applicants
Query earlier applications for similar requisitions and rank them 10 at a time against a new one with HireLayer Rank, then tag the ones worth a cal.
Normalized skills
The candidate entity has no standard skills property. Map free-text skills to the HireLayer taxonomy and store them in a custom field or as tags.
Setup
Connect SAP SuccessFactors to HireLayer
This is a small service you run, such as a serverless function, or a flow in SAP Integration Suite if you already use it. Your SuccessFactors administrator sets it up; no SAP partner program is needed.
- 1
Register an OAuth client
In Admin Center → Manage OAuth2 Client Applications, register the service with an X.509 certificate. It gets an access token from /oauth/token with a SAML bearer assertion; tokens last 24 hours. Basic authentication is deprecated.
- 2
Grant permissions and add fields
Give the API user OData API Application Export and Update, OData API Candidate Export and Update, and Candidate Tagging Permission. Add the custom fields you write to, such as a score, to your job application template.
- 3
Choose the trigger
Recruiting fires no Intelligent Services event when an application is created (SAP KBA 2775469). Trigger an Integration Center job with a REST destination on the first status change, such as a move to screening, or poll JobApplication on a schedule, for example with a filter on lastModified.
- 4
Parse, score and write back
Extract criteria once per requisition with Job Extract. For each application, parse the resume, score it, then MERGE your score field, upsert a JobApplicationComments entry and add a candidate tag.
Field mapping
Where HireLayer results go in SuccessFactors
Fields come from your templates: a custom field appears in the OData metadata only once it is in an active template. The Recruiting APIs cannot set a property to null.
| HireLayer field | SuccessFactors OData v2 | Note |
|---|---|---|
| score | JobApplication custom field (MERGE) | Make it reportable to filter and sort on it |
| summary + evaluated_criteria | JobApplicationComments (content) | Upsert |
| score ≥ your threshold | Candidate tags (CandidateTags label) | Needs Candidate Tagging Permission |
| info_candidate.job_title, current company_name | JobApplication currentTitle, currentCompany | When the template includes them |
| info_candidate.first_name, last_name, email, phone_number | Candidate firstName, lastName, primaryEmail, cellPhone | Only external candidates can be created |
| skills[].skill_title | Candidate custom field or tags | No standard skills property |
Example
Score one application in TypeScript
A minimal Node.js function: it reads an application with its resume, parses and scores it, then writes two custom fields you added to the application template. sfToken and loadCriteria stand for your own token and criteria storage.
const HIRELAYER = 'https://hirelayer.co'
const SF = `https://${process.env.SF_API_SERVER}/odata/v2`
const apiKey = { 'X-API-Key': process.env.HIRELAYER_API_KEY! }
// OData v2 call with an OAuth 2.0 access token (SAML bearer, /oauth/token)
async function sf(path: string, method = 'GET', body?: object, extra = {}) {
const res = await fetch(SF + path, {
method,
headers: {
Authorization: `Bearer ${await sfToken()}`,
Accept: 'application/json',
'Content-Type': 'application/json',
...extra,
},
body: body && JSON.stringify(body),
})
// 429 + Retry-After when a rate limit is enforced
if (!res.ok) throw new Error(`SuccessFactors ${res.status}: ${await res.text()}`)
const text = await res.text() // MERGE answers with an empty body
return text ? JSON.parse(text) : null
}
// applicationId comes from your poll on JobApplication, or from an
// Integration Center job that runs when the application status changes
export async function screen(applicationId: string) {
const { d: app } = await sf(`/JobApplication('${applicationId}')?$expand=resume`)
if (!app.resume?.fileContent) return // no resume, or hidden by read audit
// 1. Parse the resume (fileContent is base64)
const form = new FormData()
const file = new Blob([Buffer.from(app.resume.fileContent, 'base64')])
form.append('file', file, app.resume.fileName)
form.append('application_id', applicationId)
const parsed = await fetch(`${HIRELAYER}/api/v3/parser`, {
method: 'POST', headers: apiKey, body: form, signal: AbortSignal.timeout(150_000),
}).then((r) => r.json())
// 2. Score with the criteria saved for this requisition
const criteria = await loadCriteria(app.jobReqId)
const match = await fetch(`${HIRELAYER}/api/v1/matching/job-candidate`, {
method: 'POST',
headers: { ...apiKey, 'Content-Type': 'application/json' },
body: JSON.stringify({
job_text: criteria.jobText,
candidate_text: parsed.info_resume.text,
matching_criteria: criteria.items,
}),
}).then((r) => r.json())
// 3. Write two custom fields of your application template
await sf(`/JobApplication('${applicationId}')`, 'POST', {
hirelayerScore: String(match.score),
hirelayerSummary: match.summary,
}, { 'X-HTTP-METHOD': 'MERGE' })
}Limits
Good to know
Not on SAP Store
HireLayer is not listed on SAP Store and is not a certified SAP integration. You connect it with your own OAuth client, or ask us to build the connector with your integration team.
Rate limits
JobApplication allows 75 requests per minute, Candidate 50, upsert and $batch 25, and the whole tenant 600. Enforcement is soft for now; when it applies, a 429 comes with a Retry-After header.
Resume files
Attachments come inline as base64 (5 MB by default; HireLayer accepts about 4.5 MB). If read audit is enabled for Recruiting, fileContent is hidden from queries: check with your administrator first.
Results written in French
Criteria labels, match summaries and rationales are in French; scores and field names are not. HireLayer processes data in the EU, and do_not_store_data keeps no copy of the file.
HireLayer APIs used on this page
FAQ
HireLayer and SAP SuccessFactors: questions
Does HireLayer integrate with SAP SuccessFactors?
Yes, through the SuccessFactors OData v2 API: your service reads applications, calls HireLayer and writes the score back to the application. HireLayer has no SAP Store listing; we can build the connector with your integration team on request.
SuccessFactors already parses resumes. Why add HireLayer?
The built-in parsing fills the candidate profile. HireLayer scores each application against the requisition’s criteria, explains the score criterion by criterion, and returns normalized skills.
Can SuccessFactors call HireLayer as soon as a candidate applies?
Not directly. SAP documents that no Intelligent Services event fires when a job application is created. Use the first status change as the trigger, or poll new applications every few minutes.
Which permissions does the API user need?
OData API Application Export and Update, OData API Candidate Export and Update, and Candidate Tagging Permission for tags. OData API Attachment Export is needed only if you query the Attachment entity directly.
Can I build this in Make instead of code?
Yes, on Make’s Enterprise plan: Make’s SAP SuccessFactors app can get or search records and make any OData call, and Make’s HTTP module calls HireLayer.
Connect SAP SuccessFactors to HireLayer today
The Free plan includes 50 credits a month, no card required. One successful call is one credit, on every API.
Sources
Other integrations
All integrations- WorkdayScore Workday Recruiting applications against the requisition and add normalized skills, through the Recruiting web service and an integration system user.
- Oracle Recruiting CloudPoll new Oracle Recruiting Cloud applications, parse and score the resume, and attach the result to the candidate, with the Fusion HCM REST API.
- MakeParse CVs and score candidates in Make scenarios with the built-in HTTP module and a HireLayer API key.
