NAV

Introduction

This document outlines the requirements of connecting Jellyvision’s Partner Integration API for Jellyvision partners looking to provide their end users with a more personalized ALEX experience and seamless enrollment process.

Certain capabilities of the Jellyvision Partner Integration are optional; therefore, the connection requirements can vary.

Streamlining the ALEX experience

End-user demographic information

End-user demographic data such as zip code, date of birth, or union status can be provided to the Jellyvision Partner Integration API to pre-answer eligibility and demographic information necessary for the experience.

End-user eligibility mapping

ALEX can be set up via the Jellyvision Integration API to automatically know which medical, dental, and vision plans as well as employer health fund contributions an end-user is eligible for without asking for demographic information.

However, some demographic information will still be asked in order to provide end users with an accurate breakdown of their benefits.

Making enrollment easy

End-user selections

The Jellyvision Integration API also exposes certain choices made by end users during the ALEX experience including selected medical plan, dental plan, HSA contribution, and more.

Where coverage tiers apply, they are also made available via the API. In other words, whether the end user has chosen to only cover themselves, themself and a spouse, their entire family, etc.

Authentication

API Authentication

Establishing a connection

To authenticate with the Jellyvision Partner Integration API, two API keys are provided, one for each environment (see the Appendix for more information).

These API keys come in the form of a Bearer Token, specifically a signed JSON Web Token (JWT).

A POST request to the following URLs is necessary to obtain the API keys, depending on the environment you’re accessing:

Jellyvision will assist if you are unsure which environment to access.

{
  "client_id": "<your-client-id-here>",
  "client_secret": "<your-secret-here>",
  "audience": "https://integrated-partner.myalex.com",
  "grant_type": "client_credentials"
}

Response example

{
  "access_token":"eyJz93a...k4laUWw",
  "token_type":"Bearer",
  "expires_in":86400
}

Example of a decoded JWT access_token (this is purely informational and not necessary to connect to the API)

{
  "iss": "https://login.myalex.com/",
  "sub": "<your-client-id-here>@clients",
  "aud": "https://integrated-partner.myalex.com",
  "exp": 1489715431,
  "iat": 1489679431,
  "scope": "rw:self"
}
Name Example Description
client_id your-client-id-here Jellyvision will provide the value for this parameter.
client_secret your-secret-here Jellyvision will provide the value for this parameter.
audience https://integrated-partner.myalex.com Jellyvision will provide the value for this parameter.
grant_type client_credentials This value will always be client_credentials.

Once you’ve obtained an access token, you are able to connect to the Jellyvision Integration Partner API.

Making an API request

The following headers must be included in every API request:

Name Example Description
Authorization Bearer eyJz93a…k4laUWw The authorization token prepended with Bearer.
Partner-Id test-partner An ID that is unique to each partner.
Partner-Client-Id test-client An ID that is unique to each customer.
Partner-User-Id a6v845s96v4a9s6dv9 An ID that is unique to each end user.
Product-Key 2025 Jellyvision will provide the value for this attribute.
Accept-Version v1 The version of the Jellyvision Partner Integration API chosen. If omitted, v1 is chosen as default.

Guardrails

Without the following guardrails in place, Jellyvision cannot guarantee the performance of the ALEX experience:

  1. Automatically request a new access token when the API call recieves a “401 Unauthorized” response
  2. Request a new access token every 24 hours

If an access token is requested with each API call, rate limiting errors will occur.

Single sign-on (SSO)

Overview

The Jellyvision Integration API follows a standard SAML authentication flow. By default, it supports IdP-initiated SSO authentication.

SP-initiated authentication can be supported upon request and at Jellyvision’s discretion.

Authorization

The following is necessary for each environment (see Appendix for more details):

openssl genrsa -out test-partner.key 4096
openssl req -new -key test-partner.key -out test-partner.csr
openssl x509 -req -days 1825 -in test-partner.csr -signkey test-partner.key -out test-partner.crt

SAML attributes

Name Example Description
partner_id test-partner An ID that is unique to each partner. Jellyvision will provide the value for this attribute.
partner_client_id test-client An ID that is unique to each customer. Jellyvision will provide the value for this attribute.(can be equivalent to partner_id if necessary).
partner_user_id a6v845s96v4a9s6dv9 An ID that is unique to each end user associated with a given partner_id. The partner provides the value for this attribute.
product_key 2020 An ID that represents the Plan Year a user is accessing. Jellyvision will provide the value for this attribute.
session_id 9b62c998c5…c3edcbecbz Defines a unique visit to the ALEX experience, per user. This parameter must be generated by the partner and passed to Jellyvision as a SAML attribute, unless Jellyvision has indicated otherwise.
target https://qa.myalex.com The ALEX environment in which the connection is established (see Appendix for more details).

End-users

Streamlining the end-user experience

Overview

The /api/partner/user endpoint allows for POST requests to populate or update user data. If a user does not exist with the provided partner-id, partner-user-id, and partner-client-id, the user will be created.

curl "http://example.com/api/partner/user"
  --request POST
  -d '{ "salary": 49500, "postalCode": "10002" }'
  -H "Authorization: meowmeowmeow"
  -H "Content-Type: application/json"
  -H "Partner-Id: test-partner"
  -H "Partner-Client-Id: test-client"
  -H "Partner-User-Id: a1b2c3f3b334abbafg332a3486bad"
  -H "Product-Key: 2025"

JSON Example:

{
  "salary": 49500,
  "postalCode": "10002",
}

Response:

{
  "userId": "string",
  "requestId": "string",
  "success": true,
  "warnings": null,
  "errors": null,
  "data": {
    "Global": {
      "moduleWhitelist": [],
      "language": 1,
      "salary": "49500",
      "zipCode": "10002",
      "EGInput": {
        "_108399": "_158518",
        "_0": "_130"
      }
    }
  }
}

The data object that is returned on a user call represents the ALEX data model and may be useful for troubleshooting. It does not need to be stored.

{
  "userId": "string",
  "requestId": "string",
  "success": true,
  "warnings": [
    {"salary": "provided value is not a number"},
    {"custom":
      [ {"ATR": "attr key ATR could not be mapped to known property"} ]
    }
  ],
  "errors": null,
  "data": {
    "Global": {
      "moduleWhitelist": [],
      "language": 1,
      "EGInput": {
        "_108299": "_158618"
      }
    }
  }
}
{
  "userId": null,
  "requestId": "string",
  "success": false,
  "warnings": null,
  "errors": ["provided client-id is unknown", "no user-id was provided"]
}

HTTP request

POST http://example.com/api/partner/user

Parameters

Please note that all parameters are optional. The user will be prompted to supply any information required to determine their eligibility for benefits or enable the product to provide benefits recommendations that are not included in the POST request. Similarly, any information that is not required to determine a user’s eligibility for benefits or enable the product to provide benefits recommendations will not be used. For example, if the benefits offered do not differ based upon their full-time status, full-time status does not need to be included in the POST request and, if it is, it will not be utilized within the product.

Most parameters that populate or update user data will be concealed and cannot be edited by users (see descriptions below).

Internal parameters

Internal parameters are universal. They follow strict validation guidelines and must be used as defined. See “Custom” parameters if unable to supply the following parameters in their defined format.

The following internal parameters are supported by default:

Parameter Type Example Example Constraint Description
salary numeric 32000 64550.45 >= 0 The user’s salary. If populated or updated via the POST request, editing this parameter will not be supported.
eligiblePay numeric 29000 61000.33 >= 0 The user’s eligible pay. This often will be the same value as salary, but some benefits require the distinction. If populated or updated via the POST request, editing this parameter will not be supported.
postalCode string 00458 60601-1000 Length 5, 9, 10 The user’s postal or zip code. While zip+4 may be supplied, only the first 5 digits will be used. If populated or updated via the POST request, concealing or editing this parameter is supported.
stateProvince string IL VI Length 2 The state the user lives in. Guam (GU), Puerto Rico (PR) and Virgin Islands (VI) are also accepted. If populated or updated via the POST request, editing this parameter will not be supported.
fullTimeStatus boolean true false boolean true if the user is considered a full-time employee. If populated or updated via the POST request, editing this parameter will not be supported.
birthDate ISO8601 date 1983-06-25T00:00:00+00:00 1983-06-25 Must result in an age >= 0 and <= 90 The employee’s date of birth. If populated or updated via the POST request, concealing this parameter is will not be supported.
spouseType string spouse partner Can only be spouse, partner, or none Indicates whether the user has a spouse or a domestic partner. If populated or updated via the POST request, concealing this parameter is not be supported.
spouseBirthDate ISO8601 date 1983-06-25T00:00:00+00:00 1983-06-25 Must result in an age >= 0 and <= 90 The date of birth of the employee’s spouse or domestic partner. If populated or updated via the POST request, concealing this parameter is not be supported.

The following internal parameters can be supported upon request at Jellyvision’s discretion:

Parameter Type Example Example Constraint Description
expat boolean true false boolean true if the user is an expatriate.
hireDate ISO8601 date 2016-02-13T20:46:30+00:00 2016-02-13 >= 01/01/1990 and <= Today’s date The date the employee was hired.
hoursWorked numeric 40 31.4 >= 0 and <= 168 The number of hours per week the employee works.
numChildren numeric 1 3 >=0 and <= 100 Number of child dependents for a user.

External parameters

External parameters can be supported upon request at Jellyvision’s discretion.

The purpose of external parameters is to provide insights that support organizational initiatives.

External parameters are defined by the Jellyvision Partner API but are validated against partner-supplied values. The type for these values is always a string and strict validation is not performed before mapping is attempted. For analytical purposes, please contact Jellyvision when providing this value.

Parameter Type Example Example Description
businessUnit string operations contracting An ID associated with one or many users within an organization. The partner provides this attribute. It is important that the variables provided in this field are understood and beneficial to the organization.

Custom parameters

curl "http://example.com/api/partner/user"
  -X POST
  -d '{"custom" : {"DISC" : "OPTIN"}, "tobacco": true}'
  -H "Content-Type: application/json"
  -H "Authorization: meowmeowmeow"
  -H "Partner-Id: test-partner"
  -H "Partner-Client-Id: test-client"
  -H "Partner-User-Id: a1b2c3f3b334abbafg332a3486bad"
  -H "Product-Key: 2025"
Parameter Type Example Description
custom array [{"DISC" : "OPTIN"}, {"POS": "DRIVER"}, {"LOC": "CHI101"}] A list of custom parameters and values in JSON format. Example: The employer “Placeholder Industries” offers a “Home Office” stipend to remote employees but Commuter Benefits to in-person employees. A custom flag can be set to indicate whether the user is a remote or in-person employee. Custom parameters will have no effect on the product unless required to determine a user’s eligibility.eligibility. If populated or updated via the POST request, editing this parameter will not be supported.

Retrieving end-user data

Overview

The /api/partner/user/selections endpoint allows a partner to retrieve certain information about the the choices the user made in ALEX.

curl -k "https://example.com/api/partner/user/selections"
  --request GET
  -H "Authorization: Bearer [Base64EncodedKeyAndSecret]"
  -H "Content-Type: application/json"
  -H "Partner-Id: test-partner"
  -H "Partner-Client-Id: test-client"
  -H "Partner-User-Id: a1b2c3f3b334abbafg332a3486bad"
  -H "Product-Key: 2020"

Response:

{
  "userId": "a1b2c3f3b334abbafg332a3486bad",
  "requestId": "string",
  "success": true,
  "warnings": null,
  "errors": [],
  "plans": [{
    "name": "Gotham PPO 750",
    "alexCode": 32532,
    "partnerCode": ["P750"],
    "planType": "medical",
    "premiumTier": 30,
    "premiumTierDescription": "EE+Spouse",
    "waived": false
  },{
    "name": "Dental Plus 500",
    "alexCode": 65444,
    "partnerCode": ["DEN1", "DNT1", "NSP443"],
    "planType": "dental",
    "premiumTier": 10,
    "premiumTierDescription": "EE",
    "waived": false
  }],
  "contributions": [{
    "type": "hsa",
    "annualContribution": 1600
  }]
}
{
  "userId": null,
  "requestId": "string",
  "success": false,
  "warnings": null,
  "errors": ["Either this user does not exist or you are not authorized to retrieve data for this user"]
}

HTTP request

GET http://example.com/api/partner/user/selections

Parameters

Plans

Property Type Example Example Description
name string Gotham PPO 750 Savers Plan The name of the plan as communicated to employees.
alexCode integer 32154 4454 The Jellyvision-supplied plan code associated with the given plan.
partnerCode array[string] 44D32 MED1 The partner-supplied plan codes associated with the given plan. This will always be an array, even if only one code is supplied.
planType string/enum dental medical The type of plan indicated. Value is one of medical, dental, vision.
premiumTier integer 10 55 The ALEX internal premium tier code. See the appendix for the full list. Useful for debugging or custom display logic.
premiumTierDescription string “EE” “EE + Spouse + 4 or more Children” A friendly description of the chosen premium tier that can be displayed to the user or ignored for custom display logic.
waived boolean true false true if the user has indicated they will waive medical, dental, or vision coverage.

Contributions

Property Type Example Example Description
type string/enum hsa fsa The type of contribution indicated. Value is one of hsa, lfsa, fsa, dcfsa, commuter transit fsa, commuter parking fsa.
annualContribution numeric 1000 1213.43 The amount the employee indicated they would contribute to a healthfund or FSA.

ALEX Sessions

Overview

What are ALEX Sessions?

Often, the word “session” can be interpreted ambiguously. The term “ALEX Session” has a specific meaning in our context. Each experience a user has with ALEX is managed via a session. In cases where eligibility or plan information will be supplied by the partner, the ALEX Session must first be populated before taking the user to ALEX.

What’s in an ALEX Session?

An ALEX Session has multiple purposes. The first and most obvious is to collect analytics information so that Jellyvision, our partners, and our customers understand how our users interact with ALEX. Sessions also contain information specific to the user’s interaction with ALEX. In the context of an integrated customer, the user’s eligibility information as well as user-specific plan details may be stored in an ALEX Session.

Since many factors calculated by a benefits election system may affect details, this allows per-visit control over the information displayed to a user. This allows the partner or customer to leverage elections or decisions made by the user during the benefits election process to display only the most relevant information.

Creating an ALEX Session

curl "http://example.com/api/partner/session"
  --request POST
  -d '{"see": ["example", "below"]}'
  -H "Content-Type: application/json"
  -H "Authorization: meowmeowmeow"
  -H "Partner-Id: test-partner"
  -H "Partner-Client-Id: test-client"
  -H "Partner-User-Id: a1b2c3f3b334abbafg332a3486bad"
  -H "Product-Key: 2020"

Payload example (Tiers are truncated for brevity. See the appendix for more examples)

 {
   "medical" :
   {
     "plans" : [
       {
         "partnerCode": "HMO2600",
         "premiumTiers": {
           "tierCoverageTypeId": 1,
           "10": 200.00,
           "20": 400.00
         },
         "healthfund": {
           "prorated": true,
           "employerContributionTiers": {
             "tierCoverageTypeId": 7,
             "10": 350.00
           }
         }
       },
       {
         "partnerCode": "PPO1500",
         "premiumTiers": {
           "tierCoverageTypeId": 1,
           "10": 100.00,
           "20": 200.00
         }
       }
     ],
     "deductionsPerYear": 26
   },
   "dental" : {
     "plans": [
       {
         "partnerCode": "HMO100",
         "premiumTiers": {
           "tierCoverageTypeId": 1,
           "10" : 140.45,
           "20" : 280.34
         }
       },
       {
         "partnerCode": "PPO50",
         "premiumTiers": {
           "tierCoverageTypeId": 1,
           "10" : 49.45,
           "20" : 80.34
         }
       }
     ],
     "deductionsPerYear": 24
   },
   "vision" : {
     "plans": [
       {
         "partnerCode": "VIS",
         "premiumTiers": {
           "tierCoverageTypeId": 1,
           "10" : 110.00,
           "20" : 150.52
         }
       }
     ],
     "deductionsPerYear": 24
   },
   "taxSavings" : {
     "plans": [
       {
         "partnerCodeFSA": "FSA25"
       },
       {
         "partnerCodeDCFSA": "DCFSA35"
       },
       {
         "partnerCodeCommuter": "COMMUTER"
       }
     ]
   }
 }

Response:

{
  "userId": "string",
  "newUser": false,
  "requestId": "string",
  "sessionId": "string",
  "success": true,
  "warnings": null,
  "errors": null
}
{
  "userId": "string",
  "requestId": "string",
  "success": false,
  "warnings": null,
  "errors": ["Either this customer does not exist or you are not authorized to create a session for this customer"]
}

HTTP request

POST http://example.com/api/partner/session

Parameters

Post body

The following denote top-level properties of a JSON body optionally posted to this endpoint. The benefit object is required if there are any plans configured for that benefit, even if the user is not eligible for any plans under that benefit. If medical/dental/vision/tax savings objects are omitted entirely from the payload, unintended consequences to a user’s eligibility for that benefit will result.

Property Type Description
medical object Information related to medical plans. Passing an empty object is necessary to indicate that a user is ineligible for this module.
dental object Information related to dental plans. Passing an empty object is necessary to indicate that a user is ineligible for this module.
vision object Information related to vision plans. Passing an empty object is necessary to indicate that a user is ineligible for this module.
taxSavings object Information related to tax savings plans such as an FSA, DCFSA, or commuter benefit. Passing an empty object is necessary to indicate that a user is ineligible for this module. Healthfund information resides in the medical.plans object.

Object definitions

The following sections describe the top-level properties listed above.

Medical
Property Type Description
plans array An array of medical plans that the user is eligible for.
plans[].partnerCode string The partner-supplied plan code associated with the given plan. Can be any non-integer value.
plans[].premiumTiers Tiers The annualized premiums the employee is responsible for paying.
plans[].healthfund Healthfund Information about the healthfund associated with the plan. Do not include if the plan does not support a healthfund.
deductionsPerYear integer The number of payroll deductions per year for the purposes of paying employee premiums.
Dental
Property Type Description
plans array An array of dental plans that the user is eligible for.
plans[].partnerCode string The partner-supplied plan code associated with the given plan. Can be any non-integer value.
plans[].premiumTiers Tiers The annualized premiums the employee is responsible for paying.
deductionsPerYear integer The number of payroll deductions per year for the purposes of paying employee premiums.
Vision
Property Type Description
plans array An array of vision plans that the user is eligible for.
plans[].partnerCode string The partner-supplied plan code associated with the given plan. Can be any non-integer value.
plans[].premiumTiers Tiers The annualized premiums the employee is responsible for paying.
deductionsPerYear integer The number of payroll deductions per year for the purposes of paying employee premiums.
Tax Savings
Property Type Description
plans array An array of tax savings plans that the user is eligible for. Includes FSA, DCFSA, and commuter benefits. Healthfund information resides in the medical.plans object.
plans[].partnerCodeFSA string The partner-supplied plan code associated with the given FSA plan. Can be any non-integer value.
plans[].partnerCodeDCFSA string The partner-supplied plan code associated with the given DCFSA plan. Can be any non-integer value.
plans[].partnerCodeCommuter string The partner-supplied plan code associated with the given commuter benefit. Can be any non-integer value.
Healthfund
Property Type Description
prorated boolean True if contributions are pro-rated for new hires.
employerContributionTiers Tiers The amount the employer will contribute. Supply only tier “10” if a flat amount will be contributed regardless of individuals covered.
Tiers

Tiers are a an object with one to ten keys indicating dollars associated with a coverage tier. The same format is used for premiums and healthfund contributions. See the appendix for the list of tier codes.

Appendix

ALEX targets and environments

Overview

The integrated ALEX ecosystem comprises two environments, referred to as targets. The following chart describes the purpose of these targets.

Environment API url SAML attribute target value Description
Production https://www.myalex.com https://www.myalex.com This is the live production environment and where a customer’s final release will live. This is the environment that actual users interact with
Pre-production https://qa.myalex.com https://qa.myalex.com This is the pre-production environment used for initial testing and development.

Response format

HTTP 200

{
  "userId": "string",
  "requestId": "string",
  "success": true,
  "warnings": [
    {"salary": "provided value is not a number"}
  ],
  "errors": null
}

HTTP 401

{
  "userId": null,
  "requestId": "string",
  "success": false,
  "warnings": null,
  "errors": ["Unauthorized"]
}

HTTP codes

The following HTTP codes are used:

Error Code Meaning
200 OK - We got your request and responded with some data.
201 Created - We got your request and the resource has been created or updated.
400 Bad Request – The request was made in an invalid format.
401 Unauthorized – The API key is not recognized or not supplied.
403 Forbidden – You are not authorized to make changes on behalf of the provided client-id.
404 Not Found – The endpoint or client could not be found.
405 Method Not Allowed – The wrong HTTP verb was used to access the resource.
500 Internal Server Error – We had a problem with our server. Try again later. We don’t really expect this to be happening and will be immediately alerted if it does.
503 Service Unavailable – The server has reached capacity. Please try again shortly. We don’t really expect this to be happening and will be immediately alerted if it does.

Warnings and errors

If the warning’s response value is populated with something other than “null”, it will be an array of issues the API had while attempting to process the request. The most common reason for this is that a provided value is invalid; for example, providing a string instead of a numeric value for the salary parameter. When warnings occur, the API will continue to process the request using any additional data it receives. The user will simply be prompted to answer a question unless the question has been previously answered either through successfully passing data through the API or because of a user’s previous session.

If the error’s value is populated in a response value, the API will halt and not proceed. No user data or plan data will be set or no user information will be returned. This indicates an unrecoverable error and Jellyvision will log these errors. The caller should implement user-friendly error handling for these cases.

Tiers

Common tier object examples

10 tiers

{
  "premiumTiers": {
    "tierCoverageTypeId": 6,
    "10": 67.50,
    "20": 135.00,
    "30": 135.00,
    "40": 202.50,
    "50": 270.00,
    "55": 337.50,
    "60": 202.50,
    "70": 270.00,
    "80": 337.50,
    "90": 405.00
  }
}

EE, EE + 1, EE + 2, Family

{
  "premiumTiers": {
    "tierCoverageTypeId": 2,
    "10": 67.50,
    "20": 135.00,
    "30": 202.50,
    "70": 270.00
  }
}

No Tiers (Flat Amount)

{
  "employerContributionTiers": {
    "tierCoverageTypeId": 7,
    "10": 500.00
  }
}

Overview

Tiers are utilized for premiums and employer healthfund contributions.

Below is a guide to the tiers that ALEX uses that a plan may be configured under. Submitting rates for all 10 tiers is recommended if possible, but plans configured with fewer tiers only require configured tiers to be submitted.

Tiers must always match one of the following configurations.

Tier names and tierCoverageTypeIds

Tier Name tierCoverageTypeId
Individual + Family 1
EE, EE + 1, EE + 2, Family 2
EE, EE + Spouse, EE + Child(ren), Family 3
Per Individual ($X/person) 4
7 Tiers 5
10 Tiers 6
No Tiers (Flat Amount) 7

Tier codes and descriptions

Tier Code 10 Tiers (id: 6) 7 Tiers (id: 5) EE, EE+ Spouse, EE+Child(ren), Family (id: 3)
10 EE EE EE
20 EE + Spouse EE + Spouse EE+ Spouse
30 EE + 1 Child EE + 1 Child EE + Child(ren)
40 EE + 2 Children EE + 2 Children
50 EE + 3 Children EE + 3 or more Children
55 EE + 4 or more Children
60 EE + Spouse + 1 Child EE + Spouse + 1 Child
70 EE + Spouse + 2 Children EE + Spouse + 2 or more Children Family
80 EE + Spouse + 3 Children
90 EE + Spouse + 4 or more Children
Tier Code EE, EE + 1, EE+2, Family (id: 2) Individual & Family (id: 1) No Tiers (Flat Amount) (id: 7) Per Individual ($X/person) (id: 4)
10 EE EE EE EE
20 EE + 1 EE + Family
40 EE + 2
70 Family