# SWAN ###### tags: `active` The requests will be made to a web server with the URL followed by the request that you want to make: https://10.1.1.87/-5 request]. For example: https://10.1.1.87/userStatus/200. The data is sent by `GET`,` POST` or `DELETE`. Each request has a different method as indicated in square brackets. Requests marked as ==[JWT format]==, must be encrypted with JWT. `GET` or `POST` data becomes `{ 'jwt': <encrypted requests> }`. Response is also encrypted with JWT `{ 'jwt': <encrypted response> }`. - **Header:** ```javascript { alg: 'HS256', typ: 'JWT' } ``` - **Payload:** ```javascript { iss: <path to api, for exaple: http://10.1.1.6/api/>, aud: <path to api>, iat: <current time in seconds>, exp: <expiration time in seconds, for example: iat + 60 seconds>, data: <GET or POST parameters> } ``` - **Key secret:** 7S\`\\>g&)]h9Qx2E5 :::info JWT for PHP: https://github.com/firebase/php-jwt More libraries for other languages: https://jwt.io/ ::: The response will always be in JSON format: header `Content-Type: application / json`. All responses have the same result format (once decrypted): - **error:**: can have two formats - boolean: `true` | `false` - string: error message - **result:** request response --- # 1. STATUS ## 1.1. userStatus/{extension} [GET]==[JWT format]== Obtain the status of the user with `{extension}`. ### Result ```javascript { "extension": user extension, "id": user id, "name": user name, "status": available/unavailable/busy/ringing/pause, "successStatus": available/unavailable/pause, "description": status user friendly translation } ``` ## 1.2. userStatus/{extension} [POST]==[JWT format]== Change status of the user with `{extension}`. ### Params - **status:** available/busy/pause - **reason [optional]:** status description ### Result Same as [`userStatus/{extension} [GET]`](https://hackmd.io/s0eQlY7BQUmH9dLGth1T-g#11-userStatusextension-GET) ## 1.3. blf-users/{company} [GET]==[JWT format]== List of users in `{company}` specifying the user extension's status. ### Params - **departments [optional]:** array of departments to look into - **withMobile [optional]:** `true` | `false` if user's mobile should be obtained ### Result ```javascript [ { "extension": user extension, "id": user id, "name": user name, "status": available/unavailable/busy/ringing, "successStatus": available/unavailable/pause, "description": status user friendly translation, "mobile [optional]": user mobile (only if withMobile = true) }, ... ] ``` ## 1.4. queuesStatus [GET]==[JWT format]== Obtain status of N queues. Same as [`call-center/queues/{company} [GET]`](https://hackmd.io/s0eQlY7BQUmH9dLGth1T-g#71-call-centerqueuescompany-GET) but `{company}`parameter is not defined in order to ignore users status. ## 1.5. calendarStatus/{company}/{calendar} [GET]==[JWT format]== Obtain `{calendar}` status of `{company}`. ### Result - **contestador:** - **desviament:** - **locucio:** - **numero_desviament:** - **prioritat:** - **status:** `open` | `close` | `forward` ## 1.6. terminalStatus/{mac} [GET]==[JWT format]== Check if the terminal with `{mac}` is registered and beening used by some user. ### Result ```javascript { "registered": `true` | `false` } ``` --- # 2. USER ## 2.1. username/{extension} [GET] Given an `{extension}`: get the user's name. ### Result - **username:** `null` | name of the user ## 2.2. web-phone-username/{extension} [GET]==[JWT format]== Given an `{extension}`: get the mac of the terminal of type `webphone`, that allows the login on a webphone. ==Returns an error if the user cannot login because terminal is already registered.== ### Result - **username:** `null` | mac of user's webphone terminal - **is_registered:** `true` | `false` indicatinc if another tab/device is already loged in ## 2.3. user-resume/{extension} [GET]==[JWT format]== ### Params - **company:** name of the user's company - **queues [optional]:** queues groups to load waiting calls `array('groupName' => array('queue1', 'queue2', ...), ...)` - **department [optional]:** department name to load waiting times and compare `{extension}` statistics with this department ### Result - **waiting-calls:** number of waiting calls of queues ```javascript { "{groupName}": number of waiting calls, ... } ``` - **queue [optional]:** queue resume ```javascript { "completed": number of calls attended, "abandoned": number of abandoned calls, "totalSpeechTime": speech time formated } ``` - **user [optional]:** user resume ```javascript { "completed": number of calls attended, "totalSpeechTime": speech time formated, "lastCall": last called phone number, "stats_complete": { "percentage": percentage of completed calls compared to queue "state": 1 = VERY_BAD | 2 = BAD | 3 = NORMAL | 4 = GOOD | 5 = VERY_GOOD }, "stats_time": { "percentage": percentage of speech time calls compared to queue "state": 1 = VERY_BAD | 2 = BAD | 3 = NORMAL | 4 = GOOD | 5 = VERY_GOOD } } ``` ## 2.4. last-calls/{extension} [GET] Obtain a list of calls made in the last 24hours by the `{extension}`, from more recent to more old. ### Params - **hours [optional]:** specify last amount of hours (default 24) ### Result ```javascript [ { "uniqueid": call id, "calldate": yyyy-mm-dd hh:mm:ss, "duration": duration in seconds, "number": opponent phone number, "direction": "outgoing" | "incoming" }, ... ] ``` ## 2.5. current-calls/{extension} [GET] Obtain a list of current calls by the `{extension}`, from more recent to more old. ### Result Same as [`last-calls/{extension} [GET]`](https://hackmd.io/s0eQlY7BQUmH9dLGth1T-g#24-last-callsextension-GET) --- # 3. PBX ## 3.1. recording/{callID}/{extension} [GET] Get the audio of a call with identifier `{callID}`. ### Result - **processing:** `true` | `false` to know if the audio file already exists or not - **path [optional]:** if the `{extension}` is in the call: URL of the audio file - **link [optional]:** if is not in the call: URL of the link to Swan to listen to the audio ## 3.2. call/{destination} [POST]==[JWT format]== Place a call to `{private_source}` in `{company}` and connects call (when answered) to `{destination}`. `{private_source}` should exist in `{company}` for this feature to work ### Params - **private_source:** extension that will receive the first call. - **company:** that will receive the first call. ### Result - **success:** `true` | `false` --- # 4. AGENDA ## 4.1. delete-phones-agenda [DELETE] Delete phones in agenda with name `{name}`: - All phones if field `phones` is NOT specified. - Only phones specified in `phones` field. - If all goes well: changes to the agendas are applied. ### Params - **name:** agenda's name - **phones [optional]:** array of phones to delete in the agenda in the format: ```javascript [ "{number}", ... ] ``` ### Result - **success:** `true` | `false` ## 4.2. update-agenda [POST] Add new phones in an agenda: - If there is no agenda with that name: it creates it. - New phones are created, repeated ones are updated. - If all goes well: changes to the agendas are applied. ### Params - **name:** agenda's name - **phones:** array of phones to insert in the agenda in the format: ```javascript [ { "name": name of the phone, "number": number of the phone }, ... ] ``` ### Result - **success:** `true` | `false` --- # 5. TERMINAL ## 5.1. terminal-register/{mac} [POST] Log terminal registration on database. Must unregister if wasn't previously unregistered. ### Result - **success:** `true` | `false` ## 5.2. terminal-register/{mac} [DELETE] If it wasn't previously unregistration: log terminal unregistration on database. ### Result - **success:** `true` | `false` --- # 6. COMPANY ## 6.1. company-departments/{company} [GET] Get departments in `{company}`. ### Result - **items:** array of departments: ```javascript [ { "id": identifier of the department, "name": name of the department }, ... ] ``` ## 6.2. company-incoming-agenda/{company} [GET] Get phones of incoming-agenda in `{company}`. If icoming agenda is "all": all phones are loaded. ### Result - **items:** array of phones: ```javascript [ { "id": identifier of the phone, "name": number of the phone }, ... ] ``` ## 6.3. company-ivrs/{company} [GET] Get ivrs in `{company}`. ### Result - **items:** array of ivrs: ```javascript [ { "id": identifier of the ivr, "name": name of the ivr }, ... ] ``` ## 6.4. company-numbers/{company} [GET] Get numbers in `{company}`. ### Params - **in_use:** `false` or not set means all, `true` means only in use ### Result - **items:** array of numbers: ```javascript [ { "id": identifier of the numbers, "name": name and number, "alias": alias, "value": number }, ... ] ``` ## 6.5. company-queues/{company} [GET] Get queues in `{company}`. ### Result - **items:** array of queues: ```javascript [ { "id": identifier of the queues, "name": name of the queue }, ... ] ``` ## 6.6. company-users/{company} [GET] Get users in `{company}`. ### Result - **items:** array of users: ```javascript [ { "id": identifier of the user, "name": name of the user + extension }, ... ] ``` --- # 7. CALL CENTER ## 7.1. call-center/queues | call-center/queues/{company} [GET]==[JWT format]== Obtain status of users and queues / queues specified. ### Params - **queues:** queues to check with format: ```javascript { '{queueGroup}': ['{queue1}', '{queue2}', ...], ... } ``` ### Result - **queues:** statistics of each queue or queueGroup ```javascript { '{alias}': { 'members': array of extensions of the users logged on this queue, 'alarm': `true`|`false` is alarm should sound, 'status': { 'abandoned': number of missed calls, 'abandonedRatio': 100 - (abandoned * 100 / (completed + abandoned)), 'avgRingTime': average ring time in seconds, 'avgRingTimeRatio': avgRingTime * 100 / maxRingTime, 'completed': number of completed calls, 'currentCalls': number of current calls in queue, 'maxRingTime': maximum ring time in seconds, 'ringTimeOK': number of calls with ring time < 20 seconds, 'serviceRatio': ringTimeOK * 100 / completed } }, ... } ``` - **users:** status of users (only if `{company}` is defined) ```javascript [ { 'id': identifier of the user, 'extension': extension of the user, 'name': name of the user, 'status': status of the user, 'successStatus': sub status of the user (pause), 'description': status description }, ... ] ``` ## 7.2. call-center/calls/{company} [GET]==[JWT format]== Obtain calls by hour of queues / queues specified. ### Params - **queues:** queues to check with format: ```javascript { '{alias}': ['{queue1}', '{queue2}', ...], ... } ``` - **timeRange [optional only for /queueStatus]:** hours to check completed and abandonded calls. For example [9, 10, 11, 12, 13, 14, 15, 16, 17, 18] - **hour [optional]:** obtain calls of specific hour ### Result - **calls:** completed and abandoned calls of queues ```javascript { '{alias}': { 'completed': array of completed calls divided by hour with same order as {timeRange} 'abandoned': array of abandoned calls divided by hour with same order as {timeRange} }, ... } ```