REST API
UCS poskytuje backend REST API prostřednictvím služby ucs-api, routing zajišťuje NGINX.
Pro přístup je vyžadováno OAuth přihlášení prostřednictvím existujícího uživatele (uživatel
musí být členem role, která má oprávnění superuser a uživatel nesmí být public).
Pro testování je možné OAuth vypnout v souboru /etc/ucs.api.conf
, v sekci [oauth]
,
parametrem enabled = 0
.
Komunikační protokol
Volání iniciovaná směrem do UCS REST API jsou realizována s následujícími parametry:
- Přenosový protokol: HTTPS
- Zabezpečení: OAuth 2.0 (client_credentials, access token)
- Architektura rozhraní: REST
- Formát dat: JSON
- Kódování: UTF-8
- URL: https://ucs.example.com/api/v1.0
Úspěšná volání i očekávané chyby jsou potvrzovány odpovědí s HTTP status 2XX. Výjimky:
- OAuth vrací HTTP status 400 v případě špatného požadavku nebo 401 v případě špatných credentials
- Neočekávané výjimky (exception na straně UCS) vrací HTTP status 500
OAuth přihlášení
POST /login/oauth2/token
Pro volání API metod je požadován B2B OAuth token. Metoda pro získání tokenu vyžaduje jako payload
client_id, client_secret a grant_type. V odpovědi se vrátí access token, který je platný 1 hodinu
(resp. jak je nastaveno v /etc/ucs.api.conf
, v sekci [oauth]
, parametrem expires = 3600
).
Příklad získání OAuth tokenu
Request
POST https://ucs.example.com/login/oauth2/token
Content-Type: application/json
{
"client_id": "jmeno_servisniho_uctu_v_ucs",
"client_secret": "heslo_servisniho_uctu_v_ucs",
"grant_type": "client_credentials"
}
Response
200 OK
Content-Type: application/json
{
"access_token": "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz",
"token_type": "Bearer",
"expires_in": "3610"
}
Další endpointy REST API vyžadují Authorization hlavičku s platným access tokenem.
Příklad volání metody se získaným access tokenem
Request
GET https://ucs.example.com/api/v1.0/status
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Pokud selže pokus o získání OAuth tokenu, pak je vrácen HTTP status 400 nebo 401.
Příklad neúspěšného pokusu o získání access tokenu
Odpověď na špatný požadavek
400 Bad Request
Content-Type: application/json
{
"error": "invalid_request",
"error_description": "We support only \"client_credentials\" grant type",
"error_uri": "https://www.oauth.com/oauth2-servers/access-tokens"
}
Odpověď na špatné credentials
401 Unauthorized
Content-Type: application/json
{
"error": "invalid_client",
"error_description": "Invalid username or password",
"error_uri": "https://www.oauth.com/oauth2-servers/access-tokens"
}
Stav a číselníky
Následující metody poskytují aktuální stav UCS a číselníky pro získání interních ID objektů v UCS, které jsou požadovány jako atributy dalších metod.
Status
GET /api/v1.0/status
Stav systému UCS, SIP trunků a telefonů.
Příklad získání stavu systému UCS
Request
GET https://ucs.example.com/api/v1.0/status
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"trunks": {
"1": {
"name": "SIPY",
"status": 1,
"rtt": 1
},
"2": {
"name": "external",
"status": 0,
"rtt": 0
}
},
"phones": {
"1": {
"name": "System",
"configured": 279,
"configured_ipphones": 16,
"configured_softphones": 263,
"available": 0,
"available_ipphones": 0,
"available_softphones": 0,
"dead": 11,
"dead_ipphones": 2,
"dead_softphones": 9,
"paired": 11,
"paired_ipphones": 2,
"paired_softphones": 9
},
"3": {
"name": "Testik",
"configured": 2,
"configured_ipphones": 1,
"configured_softphones": 1,
"available": 0,
"available_ipphones": 0,
"available_softphones": 0,
"dead": 0,
"dead_ipphones": 0,
"dead_softphones": 0,
"paired": 0,
"paired_ipphones": 0,
"paired_softphones": 0
}
},
"ucs": 0,
"api": 0,
"postgres": 14,
"asterisk": 1,
"light-log": 0,
"tftp": 1,
"stunserver": 1,
"webserver": 3,
"nats-server": 1
}
Fronty
GET /api/v1.0/queues
Výpis nastavených front (příchozích i odchozích kampaní) a jejich aktuální stav. Metoda neakceptuje žádné parametry. Odpověď je pole asociativních polí.
Příklad získání přehledu front
Request
GET https://ucs.example.com/api/v1.0/queues
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"data": [
{
"id": 74,
"active": true,
"group_id": 11,
"type": 1,
"number": "10099",
"name": "NONLIFE CZ",
"callers_waiting": 0,
"callers_ringing": 0,
"callers_talking": 0,
"agents_idle": 0,
"agents_ringing": 0,
"agents_talking": 0,
"agents_acw": 0,
"agents_aux": 0,
"answered": 1567,
"overflowed": 1,
"abandoned": 336,
"talktime": 314549,
"waittime": 270986,
"answered_wait_time": 227409.22137379646,
"answered_in_service": 740,
"answered_in_work_hours": 0,
"answered_in_work_and_sl": 0,
"abandoned_in_threshold": 140,
"abandoned_in_work_hours": 0,
"abandoned_in_work_and_sl": 0,
"abandoned_full": 0,
"sl": {
"day": [
740,
1763
],
"week": [
4184,
9405
],
"month": [
17929,
28297
],
"quarter": [
44922,
69392
]
},
"sl_work": {
"day": [
0,
0
],
"week": [
0,
0
],
"month": [
0,
0
],
"quarter": [
0,
0
]
},
"last_call_enter": 1724428798.475978,
"last_call_answer": 1724428717.4761183,
"callers": []
},
...
]
}
Skupiny
GET /api/v1.0/groups
Skupiny v UCS slouží pro organizaci nastavení (odráží organizační strukturu společnosti) a řízení přístupu (na základě rolí). Většina objektů (uživatelé, telefony, fronty, atd.) má atribut group_id, který určuje do jaké skupiny daný objek patří. Pokud objekt nemá tento atribut, pak je pro jeho editaci vyžadováno superuser oprávnění. UCS garantuje, že vždy existuje skupina ID 1. Metoda neakceptuje žádné parametry. Odpověď je pole asociativních polí.
Příklad získání číselníku organizačních skupin UCS
Request
GET https://ucs.example.com/api/v1.0/groups
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"data": [
{
"id": 1,
"name": "System",
"external_id": null
},
{
"id": 3,
"name": " Testik",
"external_id": "1234"
},
{
"id": 7,
"name": " Test2",
"external_id": "2222"
},
{
"id": 9,
"name": " NN - Brokerska",
"external_id": "broker1"
},
{
"id": 10,
"name": " Markuv Servicedesk",
"external_id": "service1"
}
]
}
Role
GET /api/v1.0/roles
Role je sada oprávnění, která dovoluje uživatelům využívat služby UCS (a případně editovat nastavení). Typickým příkladem role je např. Administrátor, Běžný uživatel, Supervizor, Agent, atp. Metoda neakceptuje žádné parametry. Odpověď je pole asociativních polí.
Příklad získání číselníku uživatelských rolí UCS
Request
GET https://ucs.example.com/api/v1.0/roles
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"data": [
{
"id": 1,
"group_id": 1,
"name": "Administrator"
},
{
"id": 6,
"group_id": 1,
"name": "Alice"
},
{
"id": 7,
"group_id": 1,
"name": "Bob"
},
{
"id": 9,
"group_id": 10,
"name": "Bot"
},
{
"id": 8,
"group_id": 1,
"name": "Charlie"
}
]
}
Týmy
GET /api/v1.0/teams
Tým je sada nastavení vlastností call centra, nastavují se zde barvy jednotlivých stavů, důvody neodstupnosti agentů, výchozí hodnoty pro členství ve frontách, atd. Metoda neakceptuje žádné parametry. Odpověď je pole asociativních polí.
Příklad získání číselníku týmů call centra UCS
Request
GET https://ucs.example.com/api/v1.0/teams
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"data": [
{
"id": 8,
"group_id": 1,
"name": "Markuv Team",
"note": "Team TEAM TEAM!!!!",
"aux_reasons": [
{
"reason": "Nemám rád šmouly",
"break": false,
"color": "ff0000",
"limit": null,
"hidden": false
}
],
"contacts": [],
"tasks": {
"person": 0,
"person_url": null,
"call": 0,
"call_url": null,
"email": 0,
"email_url": null
},
"maximum_assigned_emails": null,
"default_inbound_priority": 100,
"default_inbound_acw": false,
"default_inbound_acw_timeout": null,
"default_inbound_busy": null,
"default_inbound_busy_timeout": null,
"default_outbound_acw": false,
"default_outbound_acw_timeout": null,
"default_email_priority": 100,
"default_email_languages": {
"cs_CZ": 100,
"en_US": 100,
"de_DE": 100,
"ru_RU": 100
},
"default_email_assigned": null,
"default_task_priority": 100,
"color_agent_offline": null,
"color_agent_ready": "188b35",
"color_agent_acw": "ffda1f",
"color_agent_aux": "ff9500",
"color_agent_ringing": "a1ff2e",
"color_agent_talking": "a1ff29",
"color_phone_offline": null,
"color_phone_idle": "00bfff",
"color_phone_ringing": "ff00ea",
"color_phone_talking": "ff00ea",
"breaks_limit": null,
"transfer_to_agent": false,
"transfer_to_queue": false,
"channels": {
"inbound": false,
"task": false,
"email": false,
"chat": false,
"dialer": false
}
},
...
]
}
Hovory
UCS poskytuje CDR (Call Detail Records) o proběhlých hovorech. Každý hovor má stringové unikátní ID, které se skládá z UNIX timestampu zahájení hovoru a tečkou odděleným číslem hovoru od restartu komponenty Asterisk.
Informace o hovoru
GET /api/v1.0/call/{uniqueid}
Metoda umožňuje získání všech uložených dat o proběhlém hovoru. Směr hovoru je dán kombinací atributů src_internal a dst_internal. Detailní informace o tom, jak hovor procházel ústřednou je zaznamenána v atributu path. Pokud byl hovor přepojen, pak dst_ atributy odpovídají cílovému číslu. Pozor, pokud přepojí volající, pak je založen další CDR záznam pro daný hovor.
Příklad získání informací o proběhlém hovoru (Call Detail Record)
Request
GET https://ucs.example.com/api/v1.0/call/1723018607.115
Authorization: Bearer AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz
Response
200 OK
Content-Type: application/json
{
"success": true,
"data": {
"price": 0,
"duration": 524,
"src_number": "+420776000001",
"src_name": "",
"dst_number": "1800",
"dst_name": " Bob",
"src_internal": false,
"dst_internal": true,
"calldate": "2024-08-07 10:17:04",
"connected": "2024-08-07 10:17:07",
"disconnected": "2024-08-07 10:25:51",
"src_extension_id": null,
"dst_extension_id": 75,
"src_user_id": null,
"dst_user_id": 11,
"src_type": "trunk",
"dst_type": "phone",
"xfer_users": null,
"trunk_id": null,
"uniqueid": "1723018607.115",
"metadata": {
"ucrm_interaction_id": 30391,
"outbound_id": 0
},
"src_group_id": 1,
"dst_group_id": 1,
"pilot_number": "0776000001",
"ring_time": 4,
"talk_time": 524,
"hold_time": 0,
"cause": 3,
"recording": true,
"recording_duration": 523,
"path": [
{
"date": "2024-08-07 10:16:47",
"type": 1,
"number": "0776000001",
"name": "SIPY"
},
{
"date": "2024-08-07 10:17:04",
"type": 10000,
"number": "1800",
"name": "Bob SP"
},
{
"date": "2024-08-07 10:17:04",
"type": 10711,
"number": "1800",
"name": " Bob"
},
{
"date": "2024-08-07 10:17:04",
"type": 10001,
"number": "1800",
"name": "Bob SP"
},
{
"date": "2024-08-07 10:17:07",
"type": 10002,
"number": "1800",
"name": "Bob SP"
},
{
"date": "2024-08-07 10:25:51",
"type": 10720,
"number": "0776000001",
"name": ""
},
{
"date": "2024-08-07 10:25:51",
"type": 10,
"number": "0776000001",
"name": ""
}
]
}
}