LMS: The documentation for the StackOne Unified API - LMS
JDK 11 or later is required.
The samples below show how a published SDK artifact is used:
Gradle:
implementation 'com.stackone:stackone-client-java:0.5.0'
Maven:
<dependency>
<groupId>com.stackone</groupId>
<artifactId>stackone-client-java</artifactId>
<version>0.5.0</version>
</dependency>
After cloning the git repository to your file system you can build the SDK artifact from source to the build
directory by running ./gradlew build
on *nix systems or gradlew.bat
on Windows systems.
If you wish to build from source and publish the SDK artifact to your local Maven repository (on your filesystem) then use the following command (after cloning the git repo locally):
On *nix:
./gradlew publishToMavenLocal -Pskip.signing
On Windows:
gradlew.bat publishToMavenLocal -Pskip.signing
A logging framework/facade has not yet been adopted but is under consideration.
For request and response logging (especially json bodies) use:
SpeakeasyHTTPClient.setDebugLogging(true); // experimental API only (may change without warning)
Example output:
Sending request: http://localhost:35123/bearer#global GET
Request headers: {Accept=[application/json], Authorization=[******], Client-Level-Header=[added by client], Idempotency-Key=[some-key], x-speakeasy-user-agent=[speakeasy-sdk/java 0.0.1 internal 0.1.0 org.openapis.openapi]}
Received response: (GET http://localhost:35123/bearer#global) 200
Response headers: {access-control-allow-credentials=[true], access-control-allow-origin=[*], connection=[keep-alive], content-length=[50], content-type=[application/json], date=[Wed, 09 Apr 2025 01:43:29 GMT], server=[gunicorn/19.9.0]}
Response body:
{
"authenticated": true,
"token": "global"
}
WARNING: This should only used for temporary debugging purposes. Leaving this option on in a production system could expose credentials/secrets in logs. Authorization headers are redacted by default and there is the ability to specify redacted header names via SpeakeasyHTTPClient.setRedactedHeaders
.
Another option is to set the System property -Djdk.httpclient.HttpClient.log=all
. However, this second option does not log bodies.
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.Security;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.HrisListEmployeesQueryParamFilter;
import com.stackone.stackone_client_java.models.operations.HrisListEmployeesRequest;
import java.lang.Exception;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
HrisListEmployeesRequest req = HrisListEmployeesRequest.builder()
.xAccountId("<id>")
.fields("id,remote_id,first_name,last_name,name,display_name,gender,ethnicity,date_of_birth,birthday,marital_status,avatar_url,avatar,personal_email,personal_phone_number,work_email,work_phone_number,job_id,remote_job_id,job_title,job_description,department_id,remote_department_id,department,cost_centers,company,manager_id,remote_manager_id,hire_date,start_date,tenure,work_anniversary,employment_type,employment_contract_type,employment_status,termination_date,company_name,company_id,remote_company_id,preferred_language,citizenships,home_location,work_location,employments,custom_fields,documents,created_at,updated_at,benefits,employee_number,national_identity_number,national_identity_numbers,skills")
.filter(HrisListEmployeesQueryParamFilter.builder()
.updatedAfter("2020-01-01T00:00:00.000Z")
.build())
.expand("company,employments,work_location,home_location,groups,skills")
.include("avatar_url,avatar,custom_fields,job_description,benefits")
.build();
sdk.hris().listEmployees()
.request(req)
.callAsStream()
.forEach(item -> {
// handle item
});
}
}
Available methods
- listLinkedAccounts - List Accounts
- getAccount - Get Account
- deleteAccount - Delete Account
- updateAccount - Update Account
- getAccountMetaInfo - Get meta information of the account
- listApplications - List Applications
- createApplication - Create Application
- getApplication - Get Application
- updateApplication - Update an Application
- listApplicationsOffers - List Application Offers
- moveApplication - Move Application
- rejectApplication - Reject Application
- getApplicationOffer - Get Application Offer
- listApplicationScorecards - List Application Scorecards
- getApplicationScorecard - Get Application Scorecard
- listApplicationNotes - List Application Notes
- createApplicationNote - Create Application Note
- getApplicationNote - Get Application Note
- updateApplicationNote - Update an Application Note
- listApplicationsScheduledInterviews - List Applications scheduled interviews
- getApplicationScheduledInterview - Get Applications scheduled interview
- uploadApplicationDocument - Upload Application Document
- downloadApplicationDocument - Download Application Document
- listApplicationDocuments - List Application Documents
- getApplicationDocument - Get Application Document
- listCandidates - List Candidates
- createCandidate - Create Candidate
- getCandidate - Get Candidate
- updateCandidate - Update Candidate
- listCandidateNotes - List Candidate Notes
- createCandidateNote - Create Candidate Note
- getCandidateNote - Get Candidate Note
- listApplicationCustomFieldDefinitions - List Application Custom Field Definitions
- getApplicationCustomFieldDefinition - Get Application Custom Field Definition
- listCandidateCustomFieldDefinitions - List Candidate Custom Field Definitions
- getCandidateCustomFieldDefinition - Get Candidate Custom Field Definition
- listJobCustomFieldDefinitions - List Job Custom Field Definitions
- getJobCustomFieldDefinition - Get Job Custom Field Definition
- listDepartments - List Departments
- getDepartment - Get Department
- listInterviewStages - List Interview Stages
- getInterviewStage - Get Interview Stage
- listInterviews - List Interviews
- getInterview - Get Interview
- listJobs - List Jobs
- createJob - Create Job
- getJob - Get Job
- updateJob - Update Job
- listLists - Get all Lists
- getList - Get List
- listLocations - List locations
- getLocation - Get Location
- listRejectedReasons - List Rejected Reasons
- getRejectedReason - Get Rejected Reason
- listUsers - List Users
- getUser - Get User
- listJobPostings - List Job Postings
- getJobPosting - Get Job Posting
- listOffers - List Offers
- createOffer - Creates an offer
- getOffer - Get Offer
- listAssessmentsPackages - List Assessments Packages
- getAssessmentsPackage - Get Assessments Package
- orderAssessmentsRequest - Order Assessments Request
- getAssessmentsRequest - Get Assessments Requests
- updateAssessmentsResult - Update Assessments Result
- getAssessmentsResult - Get Assessments Results
- listBackgroundCheckPackages - List Background Check Packages
- createBackgroundCheckPackage - Create Background Check Package
- getBackgroundCheckPackage - Get Background Check Package
- deleteBackgroundCheckPackage - Delete Background Check Package
- updateBackgroundCheckPackage - Update Background Check Package
- listBackgroundCheckRequest - List Background Check Request
- orderBackgroundCheckRequest - Order Background Check Request
- getBackgroundCheckRequest - Get Background Check Request
- updateBackgroundCheckResult - Update Background Check Result
- getBackgroundCheckResult - Get Background Check Results
- listConnectorsMeta - List Connectors Meta Information for all providers
- getConnectorMeta - Get Connector Meta information for the given provider key
- createConnectSession - Create Connect Session
- authenticateConnectSession - Authenticate Connect Session
- listContacts - List Contacts
- createContact - Creates a new Contact
- getContact - Get Contact
- updateContact - Update Contact (early access)
- listAccounts - List Accounts
- getAccount - Get Account
- listLists - Get all Lists
- getList - Get List
- listContactCustomFieldDefinitions - List Contact Custom Field Definitions
- getContactCustomFieldDefinition - Get Contact Custom Field Definition
- listCompanies - List Companies
- getCompany - Get Company
- listEmployeeCustomFieldDefinitions - List employee Custom Field Definitions
- getEmployeeCustomFieldDefinition - Get employee Custom Field Definition
- listEmployees - List Employees
- createEmployee - Creates an employee
- getEmployee - Get Employee
- updateEmployee - Updates an employee
- inviteEmployee - Invite Employee
- listEmployeeTimeOffRequests - List Employee Time Off Requests
- createEmployeeTimeOffRequest - Create Employee Time Off Request
- getEmployeesTimeOffRequest - Get Employees Time Off Request
- cancelEmployeeTimeOffRequest - Cancel Employee Time Off Request
- updateEmployeeTimeOffRequest - Update Employee Time Off Request
- batchUploadEmployeeDocument - Batch Upload Employee Document
- uploadEmployeeDocument - Upload Employee Document
- downloadEmployeeDocument - Download Employee Document
- listEmployeeDocuments - List Employee Documents
- getEmployeeDocument - Get Employee Document
- listEmployeeCategories - List Employee Document Categories
- getEmployeeDocumentCategory - Get Employee Document Category
- listEmployeeWorkEligibility - List Employee Work Eligibility
- createEmployeeWorkEligibilityRequest - Create Employee Work Eligibility Request
- getEmployeesWorkEligibility - Get Employees Work Eligibility
- updateEmployeeWorkEligibilityRequest - Update Employee Work Eligibility Request
- listEmployeeTimeOffBalances - List Employee Time Off Balances
- getEmployeeTimeOffBalance - Get Employee Time Off Balance
- listEmployments - List Employments
- getEmployment - Get Employment
- listEmployeeEmployments - List Employee Employments
- createEmployeeEmployment - Create Employee Employment
- getEmployeeEmployment - Get Employee Employment
- updateEmployeeEmployment - Update Employee Employment
- listLocations - List Work Locations
- getLocation - Get Work Location
- listTimeOffRequests - List time off requests
- getTimeOffRequest - Get time off request
listTimeOffTypes- List time off types⚠️ DeprecatedgetTimeOffType- Get time off type⚠️ Deprecated- listTimeEntries - List Time Entries
- getTimeEntries - Get Time Entry
- listBenefits - List benefits
- getBenefit - Get Benefit
- listGroups - List Groups
- listDepartmentGroups - List Department Groups
- listCostCenterGroups - List Cost Center Groups
- listTeamGroups - List Team Groups
- getGroup - Get Group
- getDepartmentGroup - Get Department Group
- getCostCenterGroup - Get Cost Center Group
- getTeamGroup - Get Team Group
- listJobs - List Jobs
- getJob - Get Job
- listEmployeeSkills - List Employee Skills
- createEmployeeSkill - Create Employee Skill
- getEmployeeSkill - Get Employee Skill
- listTimeOffPolicies - List Time Off Policies
- getTimeOffPolicy - Get Time Off Policy
- listEmployeeTimeOffPolicies - List Assigned Time Off Policies
- listEmployeeTasks - List Employee Tasks
- getEmployeeTask - Get Employee Task
- listUsers - List Users
- getUser - Get User
- deleteUser - Delete User
- updateUser - Update User
- listRoles - List Roles
- getRole - Get Role
- listGroups - List Groups
- getGroup - Get Group
- listPolicies - List Policies
- getPolicy - Get Policy
- batchUpsertCourse - Batch Upsert Course
- listCourses - List Courses
- upsertCourse - Upsert Course
- getCourse - Get Course
- listUserAssignments - List User Assignments
- createUserAssignment - Create User Assignment
- getUserAssignment - Get User Assignment
- batchUpsertContent - Batch Upsert Content
- listContent - List Content
- upsertContent - Upsert Content
- getContent - Get Content
- listUserCompletions - List User Completions
- createUserCompletion - Create User Completion
- getUserCompletion - Get User Completion
- deleteUserCompletion - Delete User Completion
- listCompletions - List Completions
- getCompletion - Get Completion
- getCategory - Get Category
- listCategories - List Categories
- listUsers - List Users
- getUser - Get User
- getSkill - Get Skill
- listSkills - List Skills
- listAssignments - List Assignments
- getAssignment - Get Assignment
- createCollection - Create Collection
- updateCollection - Update Collection
- listEmailTemplates - List Email Templates
- createEmailTemplate - Create Email Templates
- getEmailTemplate - Get Email Templates
- updateEmailTemplate - Update Email Templates
- listInAppTemplates - List In-App Templates
- createInAppTemplate - Create In-App Template
- getInAppTemplate - Get In-App Template
- updateInAppTemplate - Update In-App Template
- listSmsTemplates - List SMS Templates
- createSmsTemplate - Create SMS Template
- getSmsTemplate - Get SMS Template
- updateSmsTemplate - Update SMS Template
listOmniChannelTemplates- List Omni-Channel Templates⚠️ DeprecatedcreateOmniChannelTemplate- Create Omni-Channel Template⚠️ DeprecatedgetOmniChannelTemplate- Get Omni-Channel Template⚠️ DeprecatedupdateOmniChannelTemplate- Update Omni-Channel Template⚠️ Deprecated- listPushTemplates - List Push Templates
- createPushTemplate - Create Push Template
- getPushTemplate - Get Push Template
- updatePushTemplate - Update Push Template
- listCampaigns - List campaigns
- getCampaign - Get campaign
- listContentBlocks - List Content Blocks
- createContentBlock - Create Content Block
- getContentBlock - Get Content Blocks
- updateContentBlock - Update Content Block
- proxyRequest - Proxy Request
- listStepLogs - List Step Logs
- getLog - Get a Log
- listLogs - List Logs
Some of the endpoints in this SDK support pagination. To use pagination, you make your SDK calls as usual, but the
returned response object will have a next
method that can be called to pull down the next group of results. The next
function returns an Optional
value, which isPresent
until there are no more pages to be fetched.
Here's an example of one such pagination call:
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.Security;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.HrisListCompaniesQueryParamFilter;
import com.stackone.stackone_client_java.models.operations.HrisListCompaniesRequest;
import java.lang.Exception;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
HrisListCompaniesRequest req = HrisListCompaniesRequest.builder()
.xAccountId("<id>")
.fields("id,remote_id,name,full_name,display_name,created_at,updated_at")
.filter(HrisListCompaniesQueryParamFilter.builder()
.updatedAfter("2020-01-01T00:00:00.000Z")
.build())
.build();
sdk.hris().listCompanies()
.request(req)
.callAsStream()
.forEach(item -> {
// handle item
});
}
}
Some of the endpoints in this SDK support retries. If you use the SDK without any configuration, it will fall back to the default retry strategy provided by the API. However, the default retry strategy can be overridden on a per-operation basis, or across the entire SDK.
To change the default retry strategy for a single API call, you can provide a RetryConfig
object through the retryConfig
builder method:
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.*;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.StackoneCreateConnectSessionResponse;
import com.stackone.stackone_client_java.utils.BackoffStrategy;
import com.stackone.stackone_client_java.utils.RetryConfig;
import java.lang.Exception;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
ConnectSessionCreate req = ConnectSessionCreate.builder()
.originOwnerId("<id>")
.originOwnerName("<value>")
.categories(List.of(
Categories.ATS,
Categories.HRIS,
Categories.DOCUMENTS,
Categories.CRM,
Categories.IAM,
Categories.MARKETING,
Categories.LMS,
Categories.IAM,
Categories.DOCUMENTS,
Categories.TICKETING,
Categories.SCREENING,
Categories.MESSAGING))
.build();
StackoneCreateConnectSessionResponse res = sdk.connectSessions().createConnectSession()
.request(req)
.retryConfig(RetryConfig.builder()
.backoff(BackoffStrategy.builder()
.initialInterval(1L, TimeUnit.MILLISECONDS)
.maxInterval(50L, TimeUnit.MILLISECONDS)
.maxElapsedTime(1000L, TimeUnit.MILLISECONDS)
.baseFactor(1.1)
.jitterFactor(0.15)
.retryConnectError(false)
.build())
.build())
.call();
if (res.connectSessionTokenAuthLink().isPresent()) {
// handle response
}
}
}
If you'd like to override the default retry strategy for all operations that support retries, you can provide a configuration at SDK initialization:
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.*;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.StackoneCreateConnectSessionResponse;
import com.stackone.stackone_client_java.utils.BackoffStrategy;
import com.stackone.stackone_client_java.utils.RetryConfig;
import java.lang.Exception;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.retryConfig(RetryConfig.builder()
.backoff(BackoffStrategy.builder()
.initialInterval(1L, TimeUnit.MILLISECONDS)
.maxInterval(50L, TimeUnit.MILLISECONDS)
.maxElapsedTime(1000L, TimeUnit.MILLISECONDS)
.baseFactor(1.1)
.jitterFactor(0.15)
.retryConnectError(false)
.build())
.build())
.security(Security.builder()
.username("")
.password("")
.build())
.build();
ConnectSessionCreate req = ConnectSessionCreate.builder()
.originOwnerId("<id>")
.originOwnerName("<value>")
.categories(List.of(
Categories.ATS,
Categories.HRIS,
Categories.DOCUMENTS,
Categories.CRM,
Categories.IAM,
Categories.MARKETING,
Categories.LMS,
Categories.IAM,
Categories.DOCUMENTS,
Categories.TICKETING,
Categories.SCREENING,
Categories.MESSAGING))
.build();
StackoneCreateConnectSessionResponse res = sdk.connectSessions().createConnectSession()
.request(req)
.call();
if (res.connectSessionTokenAuthLink().isPresent()) {
// handle response
}
}
}
Handling errors in this SDK should largely match your expectations. All operations return a response object or raise an exception.
By default, an API error will throw a models/errors/SDKError
exception. When custom error responses are specified for an operation, the SDK may also throw their associated exception. You can refer to respective Errors tables in SDK docs for more details on possible exception types for each operation. For example, the createConnectSession
method throws the following exceptions:
Error Type | Status Code | Content Type |
---|---|---|
models/errors/BadRequestResponse | 400 | application/json |
models/errors/UnauthorizedResponse | 401 | application/json |
models/errors/ForbiddenResponse | 403 | application/json |
models/errors/NotFoundResponse | 404 | application/json |
models/errors/RequestTimedOutResponse | 408 | application/json |
models/errors/ConflictResponse | 409 | application/json |
models/errors/UnprocessableEntityResponse | 422 | application/json |
models/errors/TooManyRequestsResponse | 429 | application/json |
models/errors/InternalServerErrorResponse | 500 | application/json |
models/errors/NotImplementedResponse | 501 | application/json |
models/errors/BadGatewayResponse | 502 | application/json |
models/errors/SDKError | 4XX, 5XX | */* |
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.*;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.StackoneCreateConnectSessionResponse;
import java.lang.Exception;
import java.util.List;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
ConnectSessionCreate req = ConnectSessionCreate.builder()
.originOwnerId("<id>")
.originOwnerName("<value>")
.categories(List.of(
Categories.ATS,
Categories.HRIS,
Categories.DOCUMENTS,
Categories.CRM,
Categories.IAM,
Categories.MARKETING,
Categories.LMS,
Categories.IAM,
Categories.DOCUMENTS,
Categories.TICKETING,
Categories.SCREENING,
Categories.MESSAGING))
.build();
StackoneCreateConnectSessionResponse res = sdk.connectSessions().createConnectSession()
.request(req)
.call();
if (res.connectSessionTokenAuthLink().isPresent()) {
// handle response
}
}
}
The default server can be overridden globally using the .serverURL(String serverUrl)
builder method when initializing the SDK client instance. For example:
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.*;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.StackoneCreateConnectSessionResponse;
import java.lang.Exception;
import java.util.List;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.serverURL("https://api.stackone.com")
.security(Security.builder()
.username("")
.password("")
.build())
.build();
ConnectSessionCreate req = ConnectSessionCreate.builder()
.originOwnerId("<id>")
.originOwnerName("<value>")
.categories(List.of(
Categories.ATS,
Categories.HRIS,
Categories.DOCUMENTS,
Categories.CRM,
Categories.IAM,
Categories.MARKETING,
Categories.LMS,
Categories.IAM,
Categories.DOCUMENTS,
Categories.TICKETING,
Categories.SCREENING,
Categories.MESSAGING))
.build();
StackoneCreateConnectSessionResponse res = sdk.connectSessions().createConnectSession()
.request(req)
.call();
if (res.connectSessionTokenAuthLink().isPresent()) {
// handle response
}
}
}
This SDK supports the following security scheme globally:
Name | Type | Scheme |
---|---|---|
username password |
http | HTTP Basic |
You can set the security parameters through the security
builder method when initializing the SDK client instance. For example:
package hello.world;
import com.stackone.stackone_client_java.StackOne;
import com.stackone.stackone_client_java.models.components.*;
import com.stackone.stackone_client_java.models.errors.*;
import com.stackone.stackone_client_java.models.operations.StackoneCreateConnectSessionResponse;
import java.lang.Exception;
import java.util.List;
public class Application {
public static void main(String[] args) throws Exception {
StackOne sdk = StackOne.builder()
.security(Security.builder()
.username("")
.password("")
.build())
.build();
ConnectSessionCreate req = ConnectSessionCreate.builder()
.originOwnerId("<id>")
.originOwnerName("<value>")
.categories(List.of(
Categories.ATS,
Categories.HRIS,
Categories.DOCUMENTS,
Categories.CRM,
Categories.IAM,
Categories.MARKETING,
Categories.LMS,
Categories.IAM,
Categories.DOCUMENTS,
Categories.TICKETING,
Categories.SCREENING,
Categories.MESSAGING))
.build();
StackoneCreateConnectSessionResponse res = sdk.connectSessions().createConnectSession()
.request(req)
.call();
if (res.connectSessionTokenAuthLink().isPresent()) {
// handle response
}
}
}
This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning usage to a specific package version. This way, you can install the same version each time without breaking changes unless you are intentionally looking for the latest version.
While we value open-source contributions to this SDK, this library is generated programmatically. Any manual changes added to internal files will be overwritten on the next generation. We look forward to hearing your feedback. Feel free to open a PR or an issue with a proof of concept and we'll do our best to include it in a future release.