Skip to main content
Skip table of contents

Custom Import of Adherence Data Using API

Purpose of this guide: This page describes the API of the WFM application, which can be used to upload adherence data.

Audience: The network admin or technical employee with knowledge of how to use curl requests or dedicated tools to send HTTP requests to the API.

Previous steps: There are no previous steps.

When: When there is a need to upload adherence data from ACD systems into the WFM application.

Next steps: There are no next steps.

Overview

As an alternative to using the Eleveo Data Providers, adherence data can be imported using the provided API. This page describes the API, its endpoints, and its use case.

The API requires authentication. As a result, the upload of adherence data to WFM consists of two steps:

  1. Requesting and getting an authentication token,

  2. Uploading data (with the token) to the API in the following order:

    1. Agent Event Types

    2. Reason Codes

    3. Agent Events (adherence history).

Prerequisites

The following prerequisites must be met before proceeding with the import:

  • Users need to be imported to User Management.

  • A Provider Client needs to be added to User Management. Follow the procedure described on the page: Configuring Client for WFM Data Importer. Make sure to write down the Client ID and Secret values (they will be used when requesting the token).

Please note that you can use the same Provider Client as for Custom Import of Historical Data Using API.

API Endpoints

The following API endpoints exist:

  • Get Access Token – http://sso.<host>:<port>/auth/realms/<tenant>/protocol/openid-connect/token

  • Send Agent Event Types data to WFM – http://<tenant>.<host>:<port>/_rest/scheduling/adherence/event-types

  • Send Reason Codes data to WFM – http://<tenant>.<host>:<port>/_rest/scheduling/adherence/reason-codes

  • Send Push Agent Events data to WFM – http://<tenant>.<host>:<port>/_rest/scheduling/adherence/agent-events

where:

  • <host> is an address or a name of the server where WFM is running

  • <port> is a port opened on the server where WFM is running

  • <tenant> is the name of the realm (If not sure what the tenant name is, check the URL of the Eleveo applications: <tenant>.myeleveo.com).

Requesting and Getting the Token

The table below shows an example of the HTTP request, as well as the relevant header attributes and body which are needed to get an access token. The provided JSON body contains examples of configured parameters, replace them with relevant settings.

Action

HTTP Method

Endpoint

Header

Body

Get Access Token

POST

http://sso.<host>:<port>/auth/realms/<tenant>/protocol/openid-connect/token 

Content-Type: application/x-www-form-urlencoded


{

grant_type:  client_credentials

client_id: <Client ID from Client Provider in User Management>

client_secret: <Secret from Client Provider in User Management>}

Sample response:

CODE
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJXUzRxalJCZmUxRk4xa3UxakszcWpNS1pQQUJHNzdIQzBwSXlISXgxc0tRIn0.eyJqdGkiOiIyMDMzMWRjMi00NmZlLTQxMjQtYWZmZS0yYzllNWFmMGFjYzQiLCJleHAiOjE1OTAxMzUyNjUsIm5iZiI6MCwiaWF0IjoxNTkwMTM0OTY1LCJpc3MiOiJodHRwOi8vc3NvLmRldjA2My5kZXYuem9vbWludC5jb206MzA3MTcvYXV0aC9yZWFsbXMvZGV2MSIsImF1ZCI6IndmbS1hZG1pbmlzdHJhdGlvbi1hcHAiLCJzdWIiOiI0OTRmZWNkMS00ZTZmLTQwZTAtYTQxOC00OTNlZTQzYmUzN2UiLCJ0eXAiOiJCZWFyZXIiLCJhenAiOiJ3Zm0tZm9yZWNhc3RpbmctYXBwIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiNjQ2MjRlZTctNjlmZS00YTEyLTljY2MtZjc1Y2ZiYzExY2I5IiwiYWNyIjoiMSIsInJlc291cmNlX2FjY2VzcyI6eyJ3Zm0tYWRtaW5pc3RyYXRpb24tYXBwIjp7InJvbGVzIjpbIldGTV9WSUVXX1FVRVVFIiwiV0ZNX0NSRUFURV9RVUVVRSJdfSwid2ZtLWZvcmVjYXN0aW5nLWFwcCI6eyJyb2xlcyI6WyJXRk1fREVMRVRFX0ZPUkVDQVNUIiwiV0ZNX0hJU1RPUklDQUxfREFUQV9QVVNIIiwiV0ZNX0NSRUFURV9GT1JFQ0FTVCIsIldGTV9WSUVXX0ZPUkVDQVNUIiwiV0ZNX0VESVRfRk9SRUNBU1QiLCJXRk1fRklMRV9VUExPQUQiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJjbGllbnRJZCI6IndmbS1mb3JlY2FzdGluZy1hcHAiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImNsaWVudEhvc3QiOiIxMC4zMi4wLjEiLCJwcmVmZXJyZWRfdXNlcm5hbWUiOiJzZXJ2aWNlLWFjY291bnQtd2ZtLWZvcmVjYXN0aW5nLWFwcCIsImNsaWVudEFkZHJlc3MiOiIxMC4zMi4wLjEiLCJlbWFpbCI6InNlcnZpY2UtYWNjb3VudC13Zm0tZm9yZWNhc3RpbmctYXBwQHBsYWNlaG9sZGVyLm9yZyJ9.bmcfw_Afwfek_SswhdKPAXImLigcVC3vfPjvR3TOMW1DwYSLiFtodEyzo200V-EwLVKQR2wXjCNfAFMCRYiaR3b4B3peT6cra9dVYXaU8pwfqpXmJb1IdxAxHvlu8fVjBJfiOyIZ6N2mFmTXqUqucioAFv2wD6LkrcpR1QXQcBzwKtb87xemSWL1NivAHUjz-wgg_-x5qAGfJofqQUI7F00Img2VmhkJfac1YWnBAcPaNEm0RGeVlANB1gL77C1opHrSBIUDzk56JaiR2WDjHPheSxo4CGKfTo0rp9dq3hK5jYU62KY8sAjADMy3j6dfE3zSfgehzaXVNyug2AE-7Q",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJjYzEzZmFhOS0yZmY4LTQyZjYtODQxYS0yMzY5ODIyMDQ2ZWMifQ.eyJqdGkiOiJmZGJjNTlkYi0yYzFiLTRmOTQtOTZjNC00ZDc3NjE0YzdhZmUiLCJleHAiOjE1OTAxMzY3NjUsIm5iZiI6MCwiaWF0IjoxNTkwMTM0OTY1LCJpc3MiOiJodHRwOi8vc3NvLmRldjA2My5kZXYuem9vbWludC5jb206MzA3MTcvYXV0aC9yZWFsbXMvZGV2MSIsImF1ZCI6Imh0dHA6Ly9zc28uZGV2MDYzLmRldi56b29taW50LmNvbTozMDcxNy9hdXRoL3JlYWxtcy9kZXYxIiwic3ViIjoiNDk0ZmVjZDEtNGU2Zi00MGUwLWE0MTgtNDkzZWU0M2JlMzdlIiwidHlwIjoiUmVmcmVzaCIsImF6cCI6IndmbS1mb3JlY2FzdGluZy1hcHAiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiI2NDYyNGVlNy02OWZlLTRhMTItOWNjYy1mNzVjZmJjMTFjYjkiLCJyZXNvdXJjZV9hY2Nlc3MiOnsid2ZtLWFkbWluaXN0cmF0aW9uLWFwcCI6eyJyb2xlcyI6WyJXRk1fVklFV19RVUVVRSIsIldGTV9DUkVBVEVfUVVFVUUiXX0sIndmbS1mb3JlY2FzdGluZy1hcHAiOnsicm9sZXMiOlsiV0ZNX0RFTEVURV9GT1JFQ0FTVCIsIldGTV9ISVNUT1JJQ0FMX0RBVEFfUFVTSCIsIldGTV9DUkVBVEVfRk9SRUNBU1QiLCJXRk1fVklFV19GT1JFQ0FTVCIsIldGTV9FRElUX0ZPUkVDQVNUIiwiV0ZNX0ZJTEVfVVBMT0FEIl19fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIn0.03-IhDoWsXfBCkmj1l6rv7U9XNBu_vw2zpirrEPnxPc",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "64624ee7-69fe-4a12-9ccc-f75cfbc11cb9",
    "scope": "email profile"

Uploading Data to WFM

Agent Event Types

Action

HTTP Method

Endpoint

Header

Body

Agent Event Types import

POST

http://<tenant>.<host>:<port>/scheduling/adherence/event-types/?pushToken= <token_here>&lastChunk=true

Content-Type: application/json

Tenant-ID: string, mandatory

application/json

CODE
[
  {
    "acdType": "genesis",         #type of the source, can be the same as "sourceID", mandatory
    "eventId": "2",               #event type unique identifier, mandatory
    "eventName": "Log Out",       #event name, mandatory
    "eventType": "LOG_OUT",       #event type: LOG_OUT, NOT_READY..., if "reasonCodeRequired":true, than manadatory
    "reasonCodeRequired": true    #true/false
  }
]

Reason Codes

Action

HTTP Method

Endpoint

Header

Body

Reason Codes import

POST

http://<tenant>.<host>:<port>/scheduling/adherence/reason-codes/?pushToken= <token_here>&lastChunk=true

Content-Type: application/json

Tenant-ID: string, mandatory

application/json

CODE
[
  {
    "code": 5                     #reason code unique identifier, mandatory
    "eventType": " LOG_OUT",      #type of event for which reason code is created. Mandatory
    "label": "My reason code",    #reason code Label
    "sourceId": "genesis01"       #ID of the source from which events are imported, mandatory
  }
]

Agent Events (Adherence History)

For Agent Events (adherence history) import, data can be uploaded as chunked request.

When a large amount of data is sent to WFM (mainly in the initial upload or as a full upload), it is better to split one big upload action into smaller requests/chunks. Divide data into several parts to send them in separate requests. Use the following query parameters

  • pushToken – unique identifier of operation (UUID), can be generated using the guidelines described here

  • acdType – type of ACD from which data is uploaded, for example genesis (it can be found in the Agent Event Types request; it can be the same as sourceId - ID of the source from which events are imported)

  • lastChunk –  a flag that identifies if the chunk is the last in sequence, in such case, it should be set as 'true'

Set the parameters of the requests in the following way:

  1. All chunks related to the same upload operation have the same pushToken and acdTypeparameters (chunks of one upload request are identified based the pushToken query parameter).

  2. The lastChunk parameter equals 'true' only in the last chunk in the sequence. In other chunks, it is set to 'false'. 

The import is considered as completed (and is displayed in the import history list on the Data Import screen) after the request with the lastChunk=true parameter is sent.

Use a third party application or the curl command to send a request. Include the token obtained in the previous step.

Action

HTTP Method

Endpoint

Header

Query parameters

Body

Agent Events (adherence history) push

POST

http://<tenant>.<host>:<port>/scheduling/adherence/agent-events/?pushToken= <token_here>&acdType=<ACD_type>&lastChunk=<flag>

Content-Type: text/csv

Tenant-ID: string, mandatory

pushToken: unique identifier of operation (UUID) for each upload

acdType: type of ACD from which data is uploaded, for example genesys

lastChunk: flag that identifies if the chunk is the last in the sequence

stream (CSV) in the following format:

CODE
"<Agent Id>","<Event Start Date/Time in UTC>","<Event End Date/Time in UTC>","<Event ID>","<Reason Code ID>","<Event Source ID>","<User Source ID>"

for example:

CODE
"agent2","2020-12-15T20:00:23.142Z","2020-12-15T20:01:23.142Z","2","5","genesis01","userImporter01"
"agent3","2020-12-15T20:00:23.142Z","2020-12-15T20:01:23.142Z","2","5","genesis01","userImporter01"

where:

  • <Event Source ID> – ID of the source from which events are imported

  • <User Source ID> – ID of the source from which users are imported, it must match to the “sourceId” attribute in User Management (Custom Import of Users and Groups Using API)

  • <Reason Code ID> – even if there is no reason code, an empty string must be present (““)

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.