New source connector: SAP SuccessFactors (OData v2 API) #80774
Replies: 2 comments
|
Hi Diwakar Gupta (@Diwakar-Gupta), thank you for this incredibly thorough and well-researched proposal! The level of detail here — validated auth flows, tested OData queries, a clear stream design rationale — is really impressive. We've escalated this to our internal team for review. A few thoughts on your open questions while they take a look:
We'll follow up once the team has reviewed the design proposal. In the meantime, if you have any additional questions about the Connector Builder or the low-code CDK, the Connector Builder documentation and the low-code CDK reference are good resources. Need more help? Join Airbyte Community Slack for peer support, or if you're a Cloud customer, open a support ticket referencing this URL. |
|
This discussion has been escalated to our internal team for review: https://github.com/airbytehq/oncall/issues/12983 |
Uh oh!
There was an error while loading. Please reload this page.
Connector type
New API source connector - to be built with the Connector Builder / low-code YAML CDK.
Summary
There is currently no Airbyte source connector for SAP SuccessFactors HCM. SuccessFactors is one of the most widely deployed HR/HCM platforms in the enterprise market (core HR, Employee Central, Recruiting, Onboarding, Performance & Compensation), and its absence is a recurring gap - it's been asked about on the SAP Community forum with no existing answer pointing to a native Airbyte connector.
I have hands-on SuccessFactors experience (Employee Central, Onboarding, and Recruiting modules, admin-level access) and access to both a production-style and a sandbox tenant, where I've validated both Basic Auth and OAuth 2.0 (SAML Bearer Assertion) against the OData v2 API directly. I'd like to build this connector and would appreciate early feedback on scope and a couple of design questions before I start.
Proposed design approach: use-case streams, not raw entities
Rather than exposing each OData entity as a separate 1:1 stream, I'd like to model streams around the data shape a customer actually wants - since several core entities are tightly interrelated and rarely useful independently. For example, "employee details" naturally spans three entities (
EmpEmployment,User,EmpJob) that have no real standalone analytical value on their own.OData v2 supports this natively via
$expandand$select, letting a single request pull a denormalized, ready-to-use record. Example, tested against a live tenant:This returns one denormalized "Employee Details" record per employee: identity (name, email, status, location), employment facts (start/end dates, assignment class), and current job (title, department, division, manager). I've confirmed this shape works against the live OData API; I haven't yet confirmed the declarative CDK's
$expand/$selecthandling supports a query this nested as static request-options config, or whether it needs a custom component - that's one of my open questions below.Proposed streams for v1
EmpEmployment+userNav,jobInfoNav(+ nestedmanagerUserNav,departmentNav,divisionNav,locationNav)JobRequisitionJobApplicationEmpJobRelationships(matrix/secondary manager relationships) is a natural follow-up stream once the pattern above is validated and reviewed — leaving it out of v1 to keep the first PR reviewable.I'm intentionally leaving Compensation out of scope for now and focusing on getting the core pattern (auth, pagination, the "Employee Details" composite stream) right first.
Proposed authentication
OAuth 2.0 using a Bearer access token obtained via the SAML Bearer Assertion flow. The SAML signing/exchange would happen outside the connector (it doesn't map cleanly onto a static declarative auth block); the connector itself would use a standard Bearer Token authenticator with a token supplied by the user. Basic Auth is deprecated by SAP and being phased out, so I'd treat it as a documented fallback only, not the primary method.
Pagination
OData's native
__nextlink (returned in the response body) rather than manually constructing offsets — this is SAP's own recommended mechanism and avoids relying on offset math the API doesn't guarantee is stable.Incremental sync
$filteronlastModifiedDateTimefor entities that expose it, so customers aren't forced into full refreshes on every sync.Open questions for maintainers
$expand/$selectacross 3 entities) consistent with how Airbyte connectors are typically modeled, or is there a strong preference for 1:1 entity-to-stream mapping that I should follow instead? Happy to go either way, just want to align before building.$filter, rather than pulling all records including terminated/inactive ones. Should this be a configurable connector option in v1, or is that better left to downstream transformation?Happy to share sanitized sample request/response payloads from my test tenant if useful for review.
All reactions