# PartnerCompanyIngressService

Endpoints taken on behalf of a company. `CreateCompany` expects only the base Authorization header; all other company endpoints require the target company UUID.

```http
Authorization: Bearer <token>
x-identity-uuid: <company_uuid>
x-identity-type: COMPANY
```

## CreateCompany

Main endpoint to begin company onboarding. Further actions on this company will require using the returned UUID in the auth header.

```protobuf
service PartnerCompanyIngressService {
  rpc CreateCompany(CreateCompanyRequest) returns (CreateCompanyResponse);
}

message CreateCompanyRequest {
  string external_id = 1;
  string business_name = 2;
  optional string business_phone = 3;
  string email = 4;
  com.basiccapital.common.external.Address address = 5;

  EntityType entity_type = 6;
  string ein = 7;
  optional string state_of_organization = 8;
}

message CreateCompanyResponse {
  Company company = 1;
}
```

**Data types:** [Company](/core-data-types/company-and-plan#company), [EntityType](/core-data-types/company-and-plan#entitytype)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/CreateCompany`](/openapi/partnercompanyingressservice/createcompany)

## GetCompany

```protobuf
service PartnerCompanyIngressService {
  rpc GetCompany(GetCompanyRequest) returns (GetCompanyResponse);
}

message GetCompanyRequest {
}

message GetCompanyResponse {
  Company company = 1;
}
```

**Data types:** [Company](/core-data-types/company-and-plan#company)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetCompany`](/openapi/partnercompanyingressservice/getcompany)

## UpdateCompany

```protobuf
service PartnerCompanyIngressService {
  rpc UpdateCompany(UpdateCompanyRequest) returns (UpdateCompanyResponse);
}

message UpdateCompanyRequest {
  optional com.basiccapital.common.external.Address address = 1;
  optional string business_name = 2;
  optional string business_phone = 3;
  optional string state_of_organization = 4;
  optional string email = 5;
}

message UpdateCompanyResponse {
  Company company = 1;
}
```

**Data types:** [Company](/core-data-types/company-and-plan#company)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/UpdateCompany`](/openapi/partnercompanyingressservice/updatecompany)

## GetOnboardingStatus

This is the main re-entry point into company onboarding.

```protobuf
service PartnerCompanyIngressService {
  rpc GetOnboardingStatus(GetOnboardingStatusRequest) returns (GetOnboardingStatusResponse);
}

message GetOnboardingStatusRequest {}

message GetOnboardingStatusResponse {
  SectionStatus plan_configuration_status = 1;
  SectionStatus sign_agreements_status = 2;
  SectionStatus bank_linking_status = 3;

  bool ready_to_enroll_employees = 4;
  bool ready_to_start_deductions = 5;

  enum SectionStatus {
    UNKNOWN_SECTION_STATUS = 0;
    BLOCKED = 1;
    PENDING = 2;
    IN_PROGRESS = 3;
    COMPLETE = 4;
  }

  enum OnboardingStatus {
    UNKNOWN_ONBOARDING_STATUS = 0;
    ONBOARDING_IN_PROGRESS = 1;
    ONBOARDING_COMPLETE = 2;
  }

  OnboardingStatus status = 6;

  SectionStatus trustee_kyc_status = 7;
  SectionStatus kyb_status = 8;
  SectionStatus link_hris_status = 9;
}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetOnboardingStatus`](/openapi/partnercompanyingressservice/getonboardingstatus)

## BeginBankLink

Starts the bank linking process and returns the token that the client side Plaid widget will need.

```protobuf
service PartnerCompanyIngressService {
  rpc BeginBankLink(BeginBankLinkRequest) returns (BeginBankLinkResponse);
}

message BeginBankLinkRequest {}

message BeginBankLinkResponse {
  string link_token = 1;
}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/BeginBankLink`](/openapi/partnercompanyingressservice/beginbanklink)

## CompleteBankLink

This will throw a `HAS_MAX_LINKED_BANK_ACCOUNTS` error if there is already an account linked for this company.

The `BankAccount` object will include an `is_verified`. Plaid may require a micro-deposit to verify the bank account. When this is complete, the company can be verified via the `VerifyBankLink` endpoint.

```protobuf
service PartnerCompanyIngressService {
  rpc CompleteBankLink(CompleteBankLinkRequest) returns (CompleteBankLinkResponse);
}

message CompleteBankLinkRequest {
  string public_token = 1;
}

message CompleteBankLinkResponse {
  BankAccount bank_account = 1;
}
```

**Data types:** [BankAccount](/core-data-types/company-and-plan#bankaccount)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/CompleteBankLink`](/openapi/partnercompanyingressservice/completebanklink)

## VerifyBankLink

This endpoint is used to verify bank link, either if the initial setup requires verification, or if the link expires. The United States requires ACH credentials to be re-verified every 12 months; but individual states and territories may have a shorter expiry period.

```protobuf
service PartnerCompanyIngressService {
  rpc VerifyBankLink(VerifyBankLinkRequest) returns (VerifyBankLinkResponse);
}

message VerifyBankLinkRequest {
  string bank_account_uuid = 1;
}

message VerifyBankLinkResponse {
  string link_token = 1;
}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/VerifyBankLink`](/openapi/partnercompanyingressservice/verifybanklink)

## ListBankAccounts

```protobuf
service PartnerCompanyIngressService {
  rpc ListBankAccounts(ListBankAccountsRequest) returns (ListBankAccountsResponse);
}

message ListBankAccountsRequest {}

message ListBankAccountsResponse {
  repeated BankAccount accounts = 1;
  int32 max_linked_bank_accounts = 2;
}
```

**Data types:** [BankAccount](/core-data-types/company-and-plan#bankaccount)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListBankAccounts`](/openapi/partnercompanyingressservice/listbankaccounts)

## UnlinkLinkedAccount

```protobuf
service PartnerCompanyIngressService {
  rpc UnlinkLinkedAccount(UnlinkLinkedAccountRequest) returns (UnlinkLinkedAccountResponse);
}

message UnlinkLinkedAccountRequest {
  string linked_account_uuid = 1;
}

message UnlinkLinkedAccountResponse {}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/UnlinkLinkedAccount`](/openapi/partnercompanyingressservice/unlinklinkedaccount)

## SetTrustee

While this will not block plan configuration, we strongly recommend partners place setting the trustee at the beginning of their onboarding flow. If the partner is also serving as the identity provider, the `external_id` should be the identifier we use when pulling KYC for the trustee.

```protobuf
service PartnerCompanyIngressService {
  rpc SetTrustee(SetTrusteeRequest) returns (SetTrusteeResponse);
}

message SetTrusteeRequest {
  string external_id = 1;
  string email = 2;
  string given_name = 3;
  string surname = 4;
}

message SetTrusteeResponse {}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SetTrustee`](/openapi/partnercompanyingressservice/settrustee)

## GetTrustee

```protobuf
service PartnerCompanyIngressService {
  rpc GetTrustee(GetTrusteeRequest) returns (GetTrusteeResponse);
}

message GetTrusteeRequest {}

message GetTrusteeResponse {
  message TrusteeInfo {
    string external_id = 1;
    string email = 2;
    string given_name = 3;
    string surname = 4;
  }

  optional TrusteeInfo trustee_info = 1;
}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetTrustee`](/openapi/partnercompanyingressservice/gettrustee)

## CreatePlanConfiguration

This starts off the plan configuration. It requires a management option because this determines which objects Basic Capital will prefill in the `PlanConfiguration`. For example if the user selects `PARTNER_FULLY_MANAGED` Basic Capital will fill in the `InvestmentConfig`.

```protobuf
service PartnerCompanyIngressService {
  rpc CreatePlanConfiguration(CreatePlanConfigurationRequest) returns (CreatePlanConfigurationResponse);
}

message CreatePlanConfigurationRequest {
  ManagementOptionType management_option_type = 1;
}

message CreatePlanConfigurationResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [ManagementOptionType](/core-data-types/company-and-plan#managementoptiontype), [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/CreatePlanConfiguration`](/openapi/partnercompanyingressservice/createplanconfiguration)

## GetPlanConfiguration

Top-level value used as a re-entry point to plan configuration.

```protobuf
service PartnerCompanyIngressService {
  rpc GetPlanConfiguration(GetPlanConfigurationRequest) returns (GetPlanConfigurationResponse);
}

message GetPlanConfigurationRequest {}

message GetPlanConfigurationResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetPlanConfiguration`](/openapi/partnercompanyingressservice/getplanconfiguration)

## UpdatePlanConfiguration

This can be used to update any part of the plan configuration.

Will return one of the following errors in these cases:

- `EDIT_LOCKED_SECTION`: If you attempt to update any sections that have a `LOCKED` status; this will also error if another part of the update locks a previously unlocked section that you then attempt to edit.
- `INVALID_INVESTMENT_CONFIGURATION`: If you provide an incorrect QDIA + ticker_symbol combo e.g. VANGUARD with no Vanguard TDF included when setting `InvestmentConfig`
- `INVALID_CORE_CONFIGURATION`:
  - If you set `enable_mega_backdoor_roth` to `true` and `enable_roth` to `false`. The latter must be true for `enable_mega_backdoor_roth` to be `true`.
  - If you are setting the hour eligibility rule on the config there is a max you can set the hour requirement at for a given period.


```protobuf
service PartnerCompanyIngressService {
  rpc UpdatePlanConfiguration(UpdatePlanConfigurationRequest) returns (UpdatePlanConfigurationResponse);
}

message UpdatePlanConfigurationRequest {
  optional SetManagementOptionTypeRequest management_option = 1;
  optional SetInvestmentConfigRequest investment_config = 2;
  optional UpdateCoreConfigRequest core_config = 3;
}

message UpdatePlanConfigurationResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/UpdatePlanConfiguration`](/openapi/partnercompanyingressservice/updateplanconfiguration)

## ListManagementOptions

> **Note:** Bearer token only


Provides the list of management options available to that company.

```protobuf
service PartnerCompanyIngressService {
  rpc ListManagementOptions(ListManagementOptionsRequest) returns (ListManagementOptionsResponse);
}

message ListManagementOptionsRequest {}

message ListManagementOptionsResponse {
  repeated ManagementOption management_options = 1;
}
```

**Data types:** [ManagementOption](/core-data-types/company-and-plan#managementoption)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListManagementOptions`](/openapi/partnercompanyingressservice/listmanagementoptions)

## SetManagementOptionType

This updates your management option and might also have the side effect of setting your `InvestmentConfig` if you switch from `PARTNER_EMPLOYER_MANAGED` to `PARTNER_FULLY_MANAGED`.

```protobuf
service PartnerCompanyIngressService {
  rpc SetManagementOptionType(SetManagementOptionTypeRequest) returns (SetManagementOptionTypeResponse);
}

message SetManagementOptionTypeRequest {
  ManagementOptionType management_option_type = 1;
}

message SetManagementOptionTypeResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [ManagementOptionType](/core-data-types/company-and-plan#managementoptiontype), [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SetManagementOptionType`](/openapi/partnercompanyingressservice/setmanagementoptiontype)

## SetInvestmentConfig

Updates only the `InvestmentConfig`.

Errors:

- `INVALID_INVESTMENT_CONFIGURATION`: If you provide an incorrect QDIA + ticker_symbol combo i.e. VANGUARD with no Vanguard TDF included.
- `EDIT_LOCKED_SECTION`: If this section is locked


```protobuf
service PartnerCompanyIngressService {
  rpc SetInvestmentConfig(SetInvestmentConfigRequest) returns (SetInvestmentConfigResponse);
}

message SetInvestmentConfigRequest {
  QdiaType qdia_type = 1;
  repeated string ticker_symbols = 2;
}

message SetInvestmentConfigResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration), [QdiaType](/core-data-types/company-and-plan#qdiatype)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SetInvestmentConfig`](/openapi/partnercompanyingressservice/setinvestmentconfig)

## ListAvailablePlanInvestmentOptions

> **Note:** Bearer token only


Provides a list of available investment options including popular investment options and QDIA for both Vanguard and Fidelity. Each investment option has an `AssetSuggestionType`; the corresponding target date funds for the QDIA you choose will be marked as `REQUIRED` indicating to the caller these must be included in the user's selection.

```protobuf
service PartnerCompanyIngressService {
  rpc ListAvailablePlanInvestmentOptions(ListAvailablePlanInvestmentOptionsRequest) returns (ListAvailablePlanInvestmentOptionsResponse);
}

message ListAvailablePlanInvestmentOptionsRequest {
  QdiaType qdia_type = 1;
}

message ListAvailablePlanInvestmentOptionsResponse {
  repeated AssetMetadata investment_options = 1;
}
```

**Data types:** [AssetMetadata](/core-data-types/accounts-and-investments#assetmetadata), [QdiaType](/core-data-types/company-and-plan#qdiatype)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListAvailablePlanInvestmentOptions`](/openapi/partnercompanyingressservice/listavailableplaninvestmentoptions)

## ListQdiaFunds

> **Note:** Bearer token only


List all the possible QDIA funds to pick from.

```protobuf
service PartnerCompanyIngressService {
  rpc ListQdiaFunds(ListQdiaFundsRequest) returns (ListQdiaFundsResponse);
}

message ListQdiaFundsRequest {}

message ListQdiaFundsResponse {
  repeated QdiaType qdia = 1;
}
```

**Data types:** [QdiaType](/core-data-types/company-and-plan#qdiatype)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListQdiaFunds`](/openapi/partnercompanyingressservice/listqdiafunds)

## GetCuratedInvestmentConfig

Returns the preset investment config as determined by Basic Capital. This should be used if you have chosen BC as your 3(38) (`PARTNER_FULLY_MANAGED`). This may vary across companies, so must be requested on a per-company basis.

```protobuf
service PartnerCompanyIngressService {
  rpc GetCuratedInvestmentConfig(GetCuratedInvestmentConfigRequest) returns (GetCuratedInvestmentConfigResponse);
}

message GetCuratedInvestmentConfigRequest {}

message GetCuratedInvestmentConfigResponse {
  InvestmentConfig investment_config = 1;
}
```

**Data types:** [InvestmentConfig](/core-data-types/company-and-plan#investmentconfig)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetCuratedInvestmentConfig`](/openapi/partnercompanyingressservice/getcuratedinvestmentconfig)

## UpdateCoreConfig

Function to update core settings.

Errors:

- `INVALID_CORE_CONFIGURATION`:
  - If you set `enable_mega_backdoor_roth` to `true` and `enable_roth` to `false`. The latter must be true for `enable_mega_backdoor_roth` to be `true`.
  - If you are setting the hour eligibility rule on the config there is a max you can set the hour requirement at for a given period.
- `EDIT_LOCKED_SECTION`: If this section is locked


```protobuf
service PartnerCompanyIngressService {
  rpc UpdateCoreConfig(UpdateCoreConfigRequest) returns (UpdateCoreConfigResponse);
}

message UpdateCoreConfigRequest {
  repeated EmployerMatchTier employer_match_tiers = 1;
  optional bool enable_roth = 2;
  optional bool enable_plan401K_loans = 3;
  optional bool enable_mega_backdoor_roth = 4;
  optional int32 employee_auto_enrollment_bps = 5;
  optional int32 employee_auto_enrollment_increase_bps = 6;
  optional Date ideal_start_date = 7;
  optional EligibilityConfig eligibility_config = 8;
}

message UpdateCoreConfigResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [Date](/core-data-types/common#date), [EligibilityConfig](/core-data-types/company-and-plan#eligibilityconfig), [EmployerMatchTier](/core-data-types/company-and-plan#employermatchtier), [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/UpdateCoreConfig`](/openapi/partnercompanyingressservice/updatecoreconfig)

## ClearCoreConfigEmployerMatch

```protobuf
service PartnerCompanyIngressService {
  rpc ClearCoreConfigEmployerMatch(ClearCoreConfigEmployerMatchRequest) returns (ClearCoreConfigEmployerMatchResponse);
}

message ClearCoreConfigEmployerMatchRequest {}

message ClearCoreConfigEmployerMatchResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ClearCoreConfigEmployerMatch`](/openapi/partnercompanyingressservice/clearcoreconfigemployermatch)

## ClearCoreConfigEligibility

```protobuf
service PartnerCompanyIngressService {
  rpc ClearCoreConfigEligibility(ClearCoreConfigEligibilityRequest) returns (ClearCoreConfigEligibilityResponse);
}

message ClearCoreConfigEligibilityRequest {}

message ClearCoreConfigEligibilityResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ClearCoreConfigEligibility`](/openapi/partnercompanyingressservice/clearcoreconfigeligibility)

## DeletePlanConfiguration

This can be used to delete a plan configuration. Note if any of the sections of the `PlanConfiguration` object are in `LOCKED_INCOMPLETE` state this will fail since this means the plan configuration requires manual intervention or the plan has already been submitted.

```protobuf
service PartnerCompanyIngressService {
  rpc DeletePlanConfiguration(DeletePlanConfigurationRequest) returns (DeletePlanConfigurationResponse);
}

message DeletePlanConfigurationRequest {}

message DeletePlanConfigurationResponse {}
```

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/DeletePlanConfiguration`](/openapi/partnercompanyingressservice/deleteplanconfiguration)

## SubmitPlanConfiguration

The PlanConfiguration object will already be stored in our system, so this endpoint does not take additional arguments. It will error if the status is not `READY_FOR_SUBMISSION`. Once submitted, the user cannot edit the configuration without reaching out to our Ops team.

```protobuf
service PartnerCompanyIngressService {
  rpc SubmitPlanConfiguration(SubmitPlanConfigurationRequest) returns (SubmitPlanConfigurationResponse);
}

message SubmitPlanConfigurationRequest {}

message SubmitPlanConfigurationResponse {
  PlanConfiguration plan_configuration = 1;
}
```

**Data types:** [PlanConfiguration](/core-data-types/company-and-plan#planconfiguration)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SubmitPlanConfiguration`](/openapi/partnercompanyingressservice/submitplanconfiguration)

## AddEmployees

Adds a new employee to a specific company.

```protobuf
service PartnerCompanyIngressService {
  rpc AddEmployees(AddEmployeesRequest) returns (AddEmployeesResponse);
}

message AddEmployeesRequest {
  repeated CreateEmployeeInfo create_employees_info = 1;
}

message AddEmployeesResponse {
  repeated AddEmployeeResult results = 1;
}
```

**Data types:** [AddEmployeeResult](/core-data-types/employees#addemployeeresult), [CreateEmployeeInfo](/core-data-types/employees#createemployeeinfo)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/AddEmployees`](/openapi/partnercompanyingressservice/addemployees)

## ListEmployeeDetails

Fetches list of employees for a specific company.

```protobuf
service PartnerCompanyIngressService {
  rpc ListEmployeeDetails(ListEmployeeDetailsRequest) returns (ListEmployeeDetailsResponse);
}

message ListEmployeeDetailsRequest {
  optional com.basiccapital.common.external.PaginationRequest pagination = 1;
  repeated EmployeeDetails.ParticipationStatus statuses = 2;
  optional string search_query = 3;
}

message ListEmployeeDetailsResponse {
  repeated EmployeeDetails employees = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [EmployeeDetails](/core-data-types/employees#employeedetails)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListEmployeeDetails`](/openapi/partnercompanyingressservice/listemployeedetails)

## GetEmployeeDetails

Fetch a single employee's details.

```protobuf
service PartnerCompanyIngressService {
  rpc GetEmployeeDetails(GetEmployeeDetailsRequest) returns (GetEmployeeDetailsResponse);
}

message GetEmployeeDetailsRequest {
  string employee_uuid = 1;
}

message GetEmployeeDetailsResponse {
  EmployeeDetails employee = 1;
}
```

**Data types:** [EmployeeDetails](/core-data-types/employees#employeedetails)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetEmployeeDetails`](/openapi/partnercompanyingressservice/getemployeedetails)

## SetEmployeeContributionRates

Endpoint to set contribution rates when initiated by an employee.

```protobuf
service PartnerCompanyIngressService {
  rpc SetEmployeeContributionRates(CompanySetEmployeeContributionRatesRequest) returns (CompanySetEmployeeContributionRatesResponse);
}

message CompanySetEmployeeContributionRatesRequest {
  string employee_uuid = 1;
  repeated ContributionInfo employee_contribution_rates = 2;
}

message CompanySetEmployeeContributionRatesResponse {}
```

**Data types:** [ContributionInfo](/core-data-types/employees#contributioninfo)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SetEmployeeContributionRates`](/openapi/partnercompanyingressservice/companysetemployeecontributionrates)

## TerminateEmployee

Terminate an employee and stop deductions for them.

```protobuf
service PartnerCompanyIngressService {
  rpc TerminateEmployee(TerminateEmployeeRequest) returns (TerminateEmployeeResponse);
}

message TerminateEmployeeRequest {
  string employee_uuid = 1;
  Date termination_date = 2;
}

message TerminateEmployeeResponse {
  EmployeeDetails employee = 1;
}
```

**Data types:** [Date](/core-data-types/common#date), [EmployeeDetails](/core-data-types/employees#employeedetails)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/TerminateEmployee`](/openapi/partnercompanyingressservice/terminateemployee)

## ListTransactions

```protobuf
service PartnerCompanyIngressService {
  rpc ListTransactions(ListTransactionsRequest) returns (ListTransactionsResponse);
}

message ListTransactionsRequest {
  optional com.basiccapital.common.external.PaginationRequest pagination = 1;
  optional IntervalRequest interval = 2;

  optional Transaction.TransactionType transaction_type = 3;
  repeated string payroll_event_uuids = 4;
}

message ListTransactionsResponse {
  repeated Transaction transactions = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [IntervalRequest](/core-data-types/common#intervalrequest), [Transaction](/core-data-types/employees#transaction)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListTransactions`](/openapi/partnercompanyingressservice/listtransactions)

## ListEmployeeContributionDetails

```protobuf
service PartnerCompanyIngressService {
  rpc ListEmployeeContributionDetails(ListEmployeeContributionDetailsRequest) returns (ListEmployeeContributionDetailsResponse);
}

message ListEmployeeContributionDetailsRequest {
  string transaction_uuid = 1;
  optional com.basiccapital.common.external.PaginationRequest pagination = 2;
}

message ListEmployeeContributionDetailsResponse {
  message EmployeeContributionDetails {
    string employee_uuid = 1;
    ContributionDetails contribution_details = 2;
  }

  repeated EmployeeContributionDetails employee_contribution_details = 1;
  Transaction transaction = 2;
  optional string next_page_token = 4;
}
```

**Data types:** [ContributionDetails](/core-data-types/employees#contributiondetails), [Transaction](/core-data-types/employees#transaction)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListEmployeeContributionDetails`](/openapi/partnercompanyingressservice/listemployeecontributiondetails)

## GetPlanBalance

```protobuf
service PartnerCompanyIngressService {
  rpc GetPlanBalance(GetPlanBalanceRequest) returns (GetPlanBalanceResponse);
}

message GetPlanBalanceRequest {
  optional Date on_date = 1;
}

message GetPlanBalanceResponse {
  PlanBalanceDetail plan_balance_details = 1;
}
```

**Data types:** [Date](/core-data-types/common#date), [PlanBalanceDetail](/core-data-types/reporting#planbalancedetail)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetPlanBalance`](/openapi/partnercompanyingressservice/getplanbalance)

## ListEligibilityCounts

```protobuf
service PartnerCompanyIngressService {
  rpc ListEligibilityCounts(ListEligibilityCountsRequest) returns (ListEligibilityCountsResponse);
}

message ListEligibilityCountsRequest {
  NonDiscreteIntervalRequest interval = 1;
  optional com.basiccapital.common.external.PaginationRequest pagination = 2;
}

message ListEligibilityCountsResponse {
  repeated DatedEligibilityCounts eligibility_counts = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [DatedEligibilityCounts](/core-data-types/reporting#datedeligibilitycounts), [NonDiscreteIntervalRequest](/core-data-types/common#nondiscreteintervalrequest)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListEligibilityCounts`](/openapi/partnercompanyingressservice/listeligibilitycounts)

## GetEligibilityCounts

```protobuf
service PartnerCompanyIngressService {
  rpc GetEligibilityCounts(GetEligibilityCountsRequest) returns (GetEligibilityCountsResponse);
}

message GetEligibilityCountsRequest {
  optional Date on_date = 1;
}

message GetEligibilityCountsResponse {
  optional EligibilityCounts employee_eligibility_counts = 1;
}
```

**Data types:** [Date](/core-data-types/common#date), [EligibilityCounts](/core-data-types/reporting#eligibilitycounts)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetEligibilityCounts`](/openapi/partnercompanyingressservice/geteligibilitycounts)

## ListPlanBalances

```protobuf
service PartnerCompanyIngressService {
  rpc ListPlanBalances(ListPlanBalancesRequest) returns (ListPlanBalancesResponse);
}

message ListPlanBalancesRequest {
  NonDiscreteIntervalRequest interval_request = 1;
  optional com.basiccapital.common.external.PaginationRequest pagination = 2;
}

message ListPlanBalancesResponse {
  repeated DatedPlanBalanceDetail plan_balance_details = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [DatedPlanBalanceDetail](/core-data-types/reporting#datedplanbalancedetail), [NonDiscreteIntervalRequest](/core-data-types/common#nondiscreteintervalrequest)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListPlanBalances`](/openapi/partnercompanyingressservice/listplanbalances)

## ListEmployeeAverageContributionRates

```protobuf
service PartnerCompanyIngressService {
  rpc ListEmployeeAverageContributionRates(ListEmployeeAverageContributionRatesRequest) returns (ListEmployeeAverageContributionRatesResponse);
}

message ListEmployeeAverageContributionRatesRequest {
  NonDiscreteIntervalRequest interval = 1;
  optional com.basiccapital.common.external.PaginationRequest pagination = 2;
}

message ListEmployeeAverageContributionRatesResponse {
  repeated DatedEmployeeAverageContributionRates employee_average_contribution_rates = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [DatedEmployeeAverageContributionRates](/core-data-types/reporting#datedemployeeaveragecontributionrates), [NonDiscreteIntervalRequest](/core-data-types/common#nondiscreteintervalrequest)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListEmployeeAverageContributionRates`](/openapi/partnercompanyingressservice/listemployeeaveragecontributionrates)

## GetEmployeeAverageContributionRates

```protobuf
service PartnerCompanyIngressService {
  rpc GetEmployeeAverageContributionRates(GetEmployeeAverageContributionRatesRequest) returns (GetEmployeeAverageContributionRatesResponse);
}

message GetEmployeeAverageContributionRatesRequest {
  optional Date on_date = 1;
}

message GetEmployeeAverageContributionRatesResponse {
  optional EmployeeAverageContributionRates employee_average_contribution_rates = 1;
}
```

**Data types:** [Date](/core-data-types/common#date), [EmployeeAverageContributionRates](/core-data-types/reporting#employeeaveragecontributionrates)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetEmployeeAverageContributionRates`](/openapi/partnercompanyingressservice/getemployeeaveragecontributionrates)

## ListCompanySummary

```protobuf
service PartnerCompanyIngressService {
  rpc ListCompanySummary(ListCompanySummaryRequest) returns (ListCompanySummaryResponse);
}

message ListCompanySummaryRequest {
  NonDiscreteIntervalRequest interval = 1;
  optional com.basiccapital.common.external.PaginationRequest pagination = 2;
}

message ListCompanySummaryResponse {
  repeated DatedCompanySummary company_summaries = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [DatedCompanySummary](/core-data-types/reporting#datedcompanysummary), [NonDiscreteIntervalRequest](/core-data-types/common#nondiscreteintervalrequest)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListCompanySummary`](/openapi/partnercompanyingressservice/listcompanysummary)

## GetCompanySummary

```protobuf
service PartnerCompanyIngressService {
  rpc GetCompanySummary(GetCompanySummaryRequest) returns (GetCompanySummaryResponse);
}

message GetCompanySummaryRequest {
  optional Date on_date = 1;
}

message GetCompanySummaryResponse {
  optional CompanySummary company_summary = 1;
  optional CompanyYtdSummary company_ytd_summary = 2;
}
```

**Data types:** [CompanySummary](/core-data-types/reporting#companysummary), [CompanyYtdSummary](/core-data-types/reporting#companyytdsummary), [Date](/core-data-types/common#date)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/GetCompanySummary`](/openapi/partnercompanyingressservice/getcompanysummary)

## SubmitPayrollEvent

Partners should push new payroll events with just an external ID. We will pull the employee-level events from the partner.

```protobuf
service PartnerCompanyIngressService {
  rpc SubmitPayrollEvent(SubmitPayrollEventRequest) returns (SubmitPayrollEventResponse);
}

message SubmitPayrollEventRequest {
  string external_payroll_event_id = 1;
}

message SubmitPayrollEventResponse {
  PayrollEvent payroll_event = 1;
}
```

**Data types:** [PayrollEvent](/core-data-types/employees#payrollevent)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/SubmitPayrollEvent`](/openapi/partnercompanyingressservice/submitpayrollevent)

## ListCompanyPayrollEvents

This will return all payroll events for the authorized company.

```protobuf
service PartnerCompanyIngressService {
  rpc ListCompanyPayrollEvents(ListCompanyPayrollEventsRequest) returns (ListCompanyPayrollEventsResponse);
}

message ListCompanyPayrollEventsRequest {
  optional com.basiccapital.common.external.PaginationRequest pagination = 1;
  optional IntervalRequest interval = 2;
  repeated string external_ids = 3;
}

message ListCompanyPayrollEventsResponse {
  repeated PayrollEvent payroll_events = 1;
  optional string next_page_token = 2;
}
```

**Data types:** [IntervalRequest](/core-data-types/common#intervalrequest), [PayrollEvent](/core-data-types/employees#payrollevent)

**REST:** [`POST /v1/partner-rpc/com.basiccapital.systems.ingress.partner.PartnerCompanyIngressService/ListCompanyPayrollEvents`](/openapi/partnercompanyingressservice/listcompanypayrollevents)