openapi: 3.0.3
info:
  title: SAP SuccessFactors Employee Central OData API
  version: v2
  x-slurry-persona: true
  description: >-
    Community simulation based on SAP SuccessFactors's public API documentation. Not affiliated with or endorsed by SAP SuccessFactors.
    Covers the OData v2 entities most used by Employee Central integrations (User, PerPerson, PerPersonal, PerEmail,
    EmpEmployment, EmpJob, FODepartment, FOCompany, FOJobCode, Position) and the upsert function, written from the
    public SAP SuccessFactors HXM Suite OData API reference. Collections return {"d": {"results": [...]}} with a
    __next link when server-side paging applies; single entities return {"d": {...}}. Entities carry __metadata
    with uri and type. Query options: $top, $skip, $filter, $select, $expand, $orderby and the effective-dating
    parameters asOfDate, fromDate and toDate.
  license:
    name: CC-BY-4.0
    url: https://creativecommons.org/licenses/by/4.0/
  contact:
    name: Slurry
    url: https://slurry.io
externalDocs:
  description: SAP SuccessFactors HXM Suite OData API reference (public)
  url: https://help.sap.com/docs/successfactors-platform/sap-successfactors-api-reference-guide-odata-v2
servers:
  - url: https://api4.successfactors.com
security:
  - oauth2: []
paths:
  /odata/v2/User:
    get:
      operationId: listUser
      tags: [User]
      summary: Query users (the user account and basic employee information)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
      responses:
        "200":
          description: Collection of User
          content:
            application/json:
              schema: { $ref: "#/components/schemas/UserCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
    post:
      operationId: createUser
      tags: [User]
      summary: Insert a User
      requestBody:
        required: true
        content:
          application/json:
            schema: { $ref: "#/components/schemas/UserInput" }
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema: { $ref: "#/components/schemas/UserEntity" }
        "400":
          description: Validation error
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/User('{userId}'):
    get:
      operationId: getUser
      tags: [User]
      summary: Read one user by key
      parameters:
        - name: userId
          in: path
          required: true
          schema: { type: string }
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
      responses:
        "200":
          description: The entity
          content:
            application/json:
              schema: { $ref: "#/components/schemas/UserEntity" }
        "404":
          description: Entity not found
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/PerPerson:
    get:
      operationId: listPerPerson
      tags: [PerPerson]
      summary: Query persons (biographical information)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
      responses:
        "200":
          description: Collection of PerPerson
          content:
            application/json:
              schema: { $ref: "#/components/schemas/PerPersonCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/PerPerson('{personIdExternal}'):
    get:
      operationId: getPerPerson
      tags: [PerPerson]
      summary: Read one person by key
      parameters:
        - name: personIdExternal
          in: path
          required: true
          schema: { type: string }
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
      responses:
        "200":
          description: The entity
          content:
            application/json:
              schema: { $ref: "#/components/schemas/PerPersonEntity" }
        "404":
          description: Entity not found
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/PerPersonal:
    get:
      operationId: listPerPersonal
      tags: [PerPersonal]
      summary: Query personal information records (effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of PerPersonal
          content:
            application/json:
              schema: { $ref: "#/components/schemas/PerPersonalCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/PerEmail:
    get:
      operationId: listPerEmail
      tags: [PerEmail]
      summary: Query email addresses
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
      responses:
        "200":
          description: Collection of PerEmail
          content:
            application/json:
              schema: { $ref: "#/components/schemas/PerEmailCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/EmpEmployment:
    get:
      operationId: listEmpEmployment
      tags: [EmpEmployment]
      summary: Query employment records
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
      responses:
        "200":
          description: Collection of EmpEmployment
          content:
            application/json:
              schema: { $ref: "#/components/schemas/EmpEmploymentCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/EmpJob:
    get:
      operationId: listEmpJob
      tags: [EmpJob]
      summary: Query job information records (effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of EmpJob
          content:
            application/json:
              schema: { $ref: "#/components/schemas/EmpJobCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/FODepartment:
    get:
      operationId: listFODepartment
      tags: [FODepartment]
      summary: Query departments (foundation object, effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of FODepartment
          content:
            application/json:
              schema: { $ref: "#/components/schemas/FODepartmentCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/FOCompany:
    get:
      operationId: listFOCompany
      tags: [FOCompany]
      summary: Query legal entities (foundation object, effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of FOCompany
          content:
            application/json:
              schema: { $ref: "#/components/schemas/FOCompanyCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/FOJobCode:
    get:
      operationId: listFOJobCode
      tags: [FOJobCode]
      summary: Query job classifications (foundation object, effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of FOJobCode
          content:
            application/json:
              schema: { $ref: "#/components/schemas/FOJobCodeCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/Position:
    get:
      operationId: listPosition
      tags: [Position]
      summary: Query positions (effective dated)
      parameters:
        - $ref: "#/components/parameters/Top"
        - $ref: "#/components/parameters/Skip"
        - $ref: "#/components/parameters/Filter"
        - $ref: "#/components/parameters/Select"
        - $ref: "#/components/parameters/Expand"
        - $ref: "#/components/parameters/OrderBy"
        - $ref: "#/components/parameters/Format"
        - $ref: "#/components/parameters/AsOfDate"
        - $ref: "#/components/parameters/FromDate"
        - $ref: "#/components/parameters/ToDate"
      responses:
        "200":
          description: Collection of Position
          content:
            application/json:
              schema: { $ref: "#/components/schemas/PositionCollection" }
        "400":
          description: Invalid query option
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
  /odata/v2/upsert:
    post:
      operationId: upsert
      tags: [Upsert]
      summary: Insert or update one or more entities in a single call
      parameters:
        - name: purgeType
          in: query
          schema: { type: string, enum: [full, incremental] }
      requestBody:
        required: true
        content:
          application/json:
            schema:
              oneOf:
                - { $ref: "#/components/schemas/UpsertEntity" }
                - { type: array, items: { $ref: "#/components/schemas/UpsertEntity" } }
      responses:
        "200":
          description: Per-entity results
          content:
            application/json:
              schema: { $ref: "#/components/schemas/UpsertResponse" }
              example:
                d:
                  - { key: "EmpJob/seqNumber=1,EmpJob/startDate=2026-10-01T00:00:00.000Z,EmpJob/userId=108743", status: OK, editStatus: UPSERTED, message: null, index: 0, httpCode: 200, inlineResults: null }
        "400":
          description: Malformed payload
          content:
            application/json:
              schema: { $ref: "#/components/schemas/Error" }
components:
  securitySchemes:
    oauth2:
      type: oauth2
      description: OAuth 2.0 SAML bearer assertion (or basic authentication with user@companyId where still enabled).
      flows:
        clientCredentials:
          tokenUrl: https://api4.successfactors.com/oauth/token
          scopes: {}
  parameters:
    Top:
      name: $top
      in: query
      schema: { type: integer, maximum: 1000 }
    Skip:
      name: $skip
      in: query
      schema: { type: integer }
    Filter:
      name: $filter
      in: query
      description: "OData filter, for example status eq 't' and lastModifiedDateTime gt datetime'2026-09-01T00:00:00'"
      schema: { type: string }
    Select:
      name: $select
      in: query
      schema: { type: string }
    Expand:
      name: $expand
      in: query
      schema: { type: string }
    OrderBy:
      name: $orderby
      in: query
      schema: { type: string }
    Format:
      name: $format
      in: query
      schema: { type: string, enum: [json, atom] }
    AsOfDate:
      name: asOfDate
      in: query
      schema: { type: string, format: date }
    FromDate:
      name: fromDate
      in: query
      schema: { type: string, format: date }
    ToDate:
      name: toDate
      in: query
      schema: { type: string, format: date }
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code: { type: string, enum: [COE_GENERAL_BAD_REQUEST, COE_PROPERTY_NOT_FOUND, COE_ENTITY_NOT_FOUND, COE_GENERAL_FORBIDDEN, COE_INVALID_FILTER, COE_REQUIRED_FIELD_MISSING] }
            message:
              type: object
              properties:
                lang: { type: string, example: en-US }
                value: { type: string, example: "[COE0019]Unable to find entity 'User' with key(s) userId='999999'" }
    UpsertEntity:
      type: object
      properties:
        __metadata: { type: object, properties: { uri: { type: string, example: "EmpJob(seqNumber=1L,startDate=datetime'2026-10-01T00:00:00',userId='108743')" } } }
      additionalProperties: true
    UpsertResponse:
      type: object
      properties:
        d:
          type: array
          items:
            type: object
            properties:
              key: { type: string }
              status: { type: string, enum: [OK, ERROR] }
              editStatus: { type: string, enum: [UPSERTED, INSERTED, UPDATED] }
              message: { type: string, nullable: true }
              index: { type: integer }
              httpCode: { type: integer }
              inlineResults: { type: object, nullable: true }
    UserInput:
      type: object
      required: [userId, username, status]
      properties:
        userId: { type: string }
        username: { type: string }
        status: { type: string }
        firstName: { type: string }
        lastName: { type: string }
        email: { type: string }
        managerId: { type: string }
        hrId: { type: string }
    User:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/User" }
            type: { type: string, example: SFOData.User }
        userId: { type: string, example: "108743" }
        username: { type: string, example: priya.raman }
        status: { type: string, enum: ["t", "f"], description: "t active, f inactive" }
        firstName: { type: string }
        lastName: { type: string }
        displayName: { type: string }
        email: { type: string, format: email }
        title: { type: string }
        department: { type: string }
        division: { type: string }
        location: { type: string }
        timeZone: { type: string, enum: [Europe/London, America/New_York, America/Chicago, America/Los_Angeles] }
        hireDate: { type: string, format: date-time }
        empId: { type: string }
        managerId: { type: string, example: "100212" }
        hrId: { type: string }
        country: { type: string, enum: [GBR, USA, IRL] }
        defaultLocale: { type: string, enum: [en_GB, en_US] }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
    UserCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/User" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/User?$skiptoken=..." }
    PerPerson:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/PerPerson" }
            type: { type: string, example: SFOData.PerPerson }
        personIdExternal: { type: string, example: "108743" }
        personId: { type: string }
        userId: { type: string }
        dateOfBirth: { type: string, format: date-time }
        countryOfBirth: { type: string, enum: [GBR, USA, IND, IRL, POL, NGA] }
        placeOfBirth: { type: string }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    PerPersonCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/PerPerson" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/PerPerson?$skiptoken=..." }
    PerPersonal:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/PerPersonal" }
            type: { type: string, example: SFOData.PerPersonal }
        personIdExternal: { type: string }
        startDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time, example: "9999-12-31T00:00:00.000Z" }
        firstName: { type: string }
        lastName: { type: string }
        preferredName: { type: string }
        salutation: { type: string, enum: [Mr, Ms, Mrs, Mx, Dr] }
        gender: { type: string, enum: [M, F, O, U] }
        maritalStatus: { type: string, enum: [S, M, D, W, P] }
        nationality: { type: string, enum: [GBR, USA, IND, IRL, POL, NGA] }
        nativePreferredLang: { type: string, enum: [en_GB, en_US] }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    PerPersonalCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/PerPersonal" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/PerPersonal?$skiptoken=..." }
    PerEmail:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/PerEmail" }
            type: { type: string, example: SFOData.PerEmail }
        personIdExternal: { type: string }
        emailType: { type: string, enum: ["8448", "8449"], description: "picklist option id: business or personal" }
        emailAddress: { type: string, format: email }
        isPrimary: { type: boolean }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    PerEmailCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/PerEmail" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/PerEmail?$skiptoken=..." }
    EmpEmployment:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/EmpEmployment" }
            type: { type: string, example: SFOData.EmpEmployment }
        userId: { type: string }
        personIdExternal: { type: string }
        startDate: { type: string, format: date-time }
        originalStartDate: { type: string, format: date-time }
        seniorityDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time, nullable: true }
        isContingentWorker: { type: boolean }
        assignmentClass: { type: string, enum: [ST, GA] }
        serviceDate: { type: string, format: date-time }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    EmpEmploymentCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/EmpEmployment" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/EmpEmployment?$skiptoken=..." }
    EmpJob:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/EmpJob" }
            type: { type: string, example: SFOData.EmpJob }
        seqNumber: { type: integer, format: int64 }
        userId: { type: string }
        startDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time }
        company: { type: string, example: GB01 }
        businessUnit: { type: string, example: FIN }
        division: { type: string }
        department: { type: string, example: "50001040" }
        location: { type: string, example: LON-FAR }
        costCenter: { type: string }
        jobCode: { type: string }
        jobTitle: { type: string }
        position: { type: string }
        managerId: { type: string }
        emplStatus: { type: string, enum: [A, U, P, T], description: "Employment status: A active, U unpaid leave, P paid leave, T terminated" }
        eventReason: { type: string, enum: [HIRNEW, DATACHG, PROMO, TRANSFER, LOAPAID, TERVOL, TERINV] }
        employeeClass: { type: string, enum: ["1", "2", "3"], description: "1 employee, 2 contractor, 3 intern" }
        employmentType: { type: string, enum: [FT, PT] }
        regularTemp: { type: string, enum: [R, T] }
        payGrade: { type: string, enum: [GR-03, GR-04, GR-05, GR-06, GR-07, GR-08] }
        fte: { type: number, minimum: 0, maximum: 1 }
        standardHours: { type: number }
        timezone: { type: string }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    EmpJobCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/EmpJob" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/EmpJob?$skiptoken=..." }
    FODepartment:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/FODepartment" }
            type: { type: string, example: SFOData.FODepartment }
        externalCode: { type: string, example: "50001040" }
        startDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time }
        name: { type: string }
        description: { type: string }
        status: { type: string, enum: [A, I] }
        headOfUnit: { type: string }
        parent: { type: string }
        costCenter: { type: string }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    FODepartmentCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/FODepartment" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/FODepartment?$skiptoken=..." }
    FOCompany:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/FOCompany" }
            type: { type: string, example: SFOData.FOCompany }
        externalCode: { type: string, example: GB01 }
        startDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time }
        name: { type: string }
        description: { type: string }
        status: { type: string, enum: [A, I] }
        country: { type: string, enum: [GBR, USA, IRL] }
        currency: { type: string, enum: [GBP, USD, EUR] }
        standardHours: { type: number }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    FOCompanyCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/FOCompany" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/FOCompany?$skiptoken=..." }
    FOJobCode:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/FOJobCode" }
            type: { type: string, example: SFOData.FOJobCode }
        externalCode: { type: string, example: FIN-ACC-03 }
        startDate: { type: string, format: date-time }
        endDate: { type: string, format: date-time }
        name: { type: string }
        description: { type: string }
        status: { type: string, enum: [A, I] }
        jobFunction: { type: string }
        grade: { type: string }
        isFulltimeEmployee: { type: boolean }
        regularTemporary: { type: string, enum: [R, T] }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    FOJobCodeCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/FOJobCode" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/FOJobCode?$skiptoken=..." }
    Position:
      type: object
      properties:
        __metadata:
          type: object
          properties:
            uri: { type: string, example: "https://api4.successfactors.com/odata/v2/Position" }
            type: { type: string, example: SFOData.Position }
        code: { type: string, example: "30012044" }
        effectiveStartDate: { type: string, format: date-time }
        effectiveEndDate: { type: string, format: date-time }
        externalName_defaultValue: { type: string }
        effectiveStatus: { type: string, enum: [A, I] }
        vacant: { type: boolean }
        company: { type: string }
        department: { type: string }
        jobCode: { type: string }
        jobTitle: { type: string }
        location: { type: string }
        parentPosition: { type: string }
        targetFTE: { type: number }
        positionCriticality: { type: string, enum: ["1", "2", "3"] }
        createdDateTime: { type: string, format: date-time, readOnly: true }
        createdBy: { type: string }
        lastModifiedDateTime: { type: string, format: date-time, readOnly: true }
        lastModifiedBy: { type: string }
    PositionCollection:
      type: object
      properties:
        d:
          type: object
          properties:
            results: { type: array, items: { $ref: "#/components/schemas/Position" } }
            __next: { type: string, description: "Next page link when server-side paging applies, e.g. https://api4.successfactors.com/odata/v2/Position?$skiptoken=..." }
    UserEntity:
      type: object
      properties:
        d: { $ref: "#/components/schemas/User" }
    PerPersonEntity:
      type: object
      properties:
        d: { $ref: "#/components/schemas/PerPerson" }
