Skip to content

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
SAP SuccessFactors + HireLayer
  1. 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.
  2. 2Parse the resumeHireLayerYour service reads JobApplication with $expand=resume, decodes the base64 fileContent and sends the file to HireLayer CV Extract.
  3. 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.
  4. 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. 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. 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. 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. 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 fieldSuccessFactors OData v2Note
scoreJobApplication custom field (MERGE)Make it reportable to filter and sort on it
summary + evaluated_criteriaJobApplicationComments (content)Upsert
score ≥ your thresholdCandidate tags (CandidateTags label)Needs Candidate Tagging Permission
info_candidate.job_title, current company_nameJobApplication currentTitle, currentCompanyWhen the template includes them
info_candidate.first_name, last_name, email, phone_numberCandidate firstName, lastName, primaryEmail, cellPhoneOnly external candidates can be created
skills[].skill_titleCandidate custom field or tagsNo 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.

successfactors-screening.tstypescript
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.

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.