Overview
A client-mode connector for SAP SuccessFactors HXM: the OData v2 API (User Management, Employee Central employment and personal information, Foundation Objects, Time Off) and the Time Tracking Clock In Clock Out APIs. Use it to connect the shop floor to HR:- Badge readers and gate terminals publish clock-in / clock-out punches on MQTT, and the connector sends them to Clock In Clock Out.
- A kiosk or HMI books or cancels an absence, or shows the remaining vacation balance.
- Line planning and andon boards read who is assigned to a plant and department, with standard hours (EmpJob with
asOfDate).
SapSuccessFactorsRestApi in SapSuccessfactorsRestApi.lot has 28 events (23 GET, 5 POST). 3 are writes: EmployeeTimeCreate, Upsert, TimeEventsCreate. There are no DELETE, PUT or PATCH events.
Set BASE_ADDRESS to the API server of your data center, with no trailing slash and no /odata/v2, for example https://api55.sapsf.eu or https://api4.successfactors.com (SAP KBA 2215682 lists all API servers). Topics use finance/sap-successfactors/<object>/<verb>; replies land on <topic>/response.
See the base guide: REST API Connectors.
Setup
- Create or choose an API user with role-based permissions for the entities the broker uses (for example User, Employee Central job information, Time Off) and Employee Central API / SFAPI access. Every call runs with this user’s permissions.
- In Admin Center > Manage OAuth2 Client Applications, register a client: application name and URL, Bind to Users with the API user, and Generate X.509 Certificate. Download the certificate (it holds the private key) and save the API Key (the
client_id). - For Clock In Clock Out punches, register a second client bound to the technical user
TECHNICAL_USER_CICOTERMINAL_9D3F8AC1. SuccessFactors accepts punches only with that user’s token (SAP KBA 3206348). - Note your company ID. Keep
SF_COMPANY_ID,SF_CLIENT_ID, the private key or assertions, and the current token in broker secrets and inject them withGET SECRET.
Authentication
SuccessFactors uses the OAuth 2.0 SAML 2.0 bearer assertion grant:- Get a SAML assertion for the API user, signed with the client’s private key. Generate it outside the broker (for example with SAP’s assertion generator or an integration platform), or use
SamlAssertion(POST /oauth/idpwithclient_id,user_id,token_url,private_key). SAP has deprecated/oauth/idpbecause the private key travels in the call (KBA 3239495); it still answers today, but prefer generating the assertion yourself. - Get a token with
OAuthToken:POST /oauth/tokenwithcompany_id,client_idandassertion(the grant typeurn:ietf:params:oauth:grant-type:saml2-beareris fixed in the template). The reply hasaccess_token,token_typeBearerandexpires_in. - Every other event sends
Authorization: Bearer <access_token>from the payload.TokenValidatechecks a token.
+, / and =: send them as %2B, %2F and %3D, or the server rejects the assertion.
Events
Payloads
OData v2 query options:
$filter, $select, $expand, $orderby, $top, $skip, $format, $inlinecount, and the SuccessFactors effective-dating options asOfDate, fromDate and toDate (YYYY-MM-DD). Dates in OData v2 JSON bodies use /Date(<epoch milliseconds>)/.
Basic Syntax
An excerpt of the template (the full file has all 28 events and comments):Examples
Keep a token for the other actions
Publish a fresh, URL-encoded assertion from your signer tostate/sf/assertion (assertions are short-lived). A COLLAPSED model builds the token request, because PUBLISH TOPIC does not take inline JSON:
Who works where today
Every hour, read the job information valid today for one plant, with department, manager and standard hours. The reply is OData v2 JSON: rows ind.results; follow d.__next (a $skiptoken link) for the next page.
asOfDate SuccessFactors returns the record valid today; add asOfDate=2026-10-05 (or fromDate / toDate) for another day.
Send badge punches to Clock In Clock Out
The badge gateway publishes the punch payload onfinance/sap-successfactors/clock/events/create (a LoT model cannot build the JSON array that the API expects). access_token must come from the client bound to TECHNICAL_USER_CICOTERMINAL_9D3F8AC1. P10 / P20 stand for the clock-in and clock-out time event types of your Clock In Clock Out group; ClockGroupsList lists them.
201 with succeededTimeEvents (one UUID per punch) and failedTimeEvents (for example A time event for this employee and timestamp already exists.). Up to 1000 punches can go in one call; id only has to be unique within the call. Read them back with TimeEventsExport:
Book and cancel an absence
Publish tofinance/sap-successfactors/employee-time/create (the time type must exist and be allowed for the employee; check with TimeTypeList / AvailableTimeTypeList):
finance/sap-successfactors/odata/upsert. The reply has one row per record with status OK or ERROR and a message:
Notes
- Effective-dated entities (EmpJob, EmpEmployment, Foundation Objects) return the record valid today unless you pass
asOfDate, orfromDate/toDatefor history. EmpJobcannot be created with POST; it is upsert only (the metadata marks itupsertable, notcreatable).Upsertworks for any upsertable entity, but HR master data changes usually belong in SuccessFactors itself; the template only shows time records.TimeEventsExportneeds the export permission; without it SuccessFactors returns an empty list with200.- Use
Metadata(/odata/v2/<entity>/$metadata) to see the custom fields of your instance, andEntityQueryto read entity sets that have no dedicated event. - Errors: OData v2 returns
401with[LGN0007]Invalid OAuth tokenfor a bad token; the Clock In Clock Out APIs answer401AuthenticationRequiredwithout a token and400AuthenticationFailedfor a malformed one;/oauth/tokenanswers400witherrorHttpCode/errorMessage. - Not packaged on purpose: every DELETE, the Clock In Clock Out mass delete (
PATCHwithdeleted: true), PUT / MERGE updates (useUpsert),$batch, SFAPI and Compound Employee, the OData v4 Employee Central APIs, and HTTP Basic authentication.
Status
Technical preview, blocked on a live test. Static, spec, example and mock checks pass, and keyless calls to real SuccessFactors API servers return the documented400 / 401 answers. A live run needs a SuccessFactors test instance (company ID and API server), an OAuth2 client with its X.509 key bound to an API user, and a second client bound to the Clock In Clock Out technical user for punches.
