# SWAN v2 ###### 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/[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. The response will always be in JSON format: header `Content-Type: application / json`. All responses have the same result format: - **error:** can `true` | `false` - **error-msg:** `null` if no error | string describing the error - **result:** request response --- # 1. STATUS ## 1.1. userStatus/{extension} [GET] Obtain the status of the user with `{extension}`. ### Result ```javascript { "error": false, "error-msg": null, "result": { "extension": user extension, "id": user id, "name": user name, "status": "available" / "unavailable" / "busy" / "ringing" / "pause", "description": status user friendly translation (E.g: "Descanso" } } ``` ## 1.2. userStatus/{extension} [POST] Change status of the user with `{extension}`. ### Params - **status:** available/busy/pause - **reason [optional]:** status description ### Result ```javascript { "error": false, "error-msg": null, "result": { "extension": user extension, "id": user id, "name": user name, "status": "available" / "unavailable" / "busy" / "ringing" / "pause", "description": status user friendly translation (E.g: "Descanso" } } ``` ## 1.3. blf-users/{company} [GET] 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 { "error": false, "error-msg": null, "result": [ { "extension": user extension, "id": user id, "name": user name, "status": "available" / "unavailable" / "busy" / "ringing" / "pause", "description": status user friendly translation (E.g: "Descanso"), "mobile [optional]": user mobile (only if withMobile = true) }, ... ] } ``` ## 1.4. queues-status [GET] Obtain status of N queues. ### Params - **queues:** queues to check with format: ```javascript { '{queueGroup}': ['{queue1}', '{queue2}', ...], ... } ``` ### Result ```javascript { "error": false, "error-msg": null, "result": { "queues": statistics of each queue or queueGroup { "{queueGroup}": { "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 } }, ... } } } ``` # 2. USER ## 2.1. username/{extension} [GET] Given an `{extension}`: get the user's name. ### Result ```javascript { "error": false, "error-msg": null, "result": { "username": name associated to the extension | null if not found } } ``` ## 2.2. web-phone-username/{extension} [GET] 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 ```javascript { "error": false, "error-msg": null, "result": { "username": null | mac of user's webphone terminal, "is_registered": true | false indicating if another tab/device is already loged in } } ``` ## 2.3 user-unregister/{extension} [POST] Given an `{extension}`: indicate to the PBX that user has logged out. ### Result ```javascript { "error": false, "error-msg": null, "result": { "success": true | false } } ``` ## 2.4. user-resume/{extension} [GET] ### 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 ```javascript { "error": false, "error-msg": null, "result": { "waiting-calls": number of waiting calls by queue { "{groupName}": number of waiting calls, ... }, "queue [optional]": queue resume { "completed": number of calls attended, "abandoned": number of abandoned calls, "totalSpeechTime": speech time formated "mm minutos ss segundos" }, "user [optional]": user resume { "completed": number of calls attended, "totalSpeechTime": speech time formated "mm minutos ss segundos", "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 } } } } ``` - VERY_BAD: if user is worst in 25 points or more in comparison with queue - BAD: if user is worst in between 25 and 5 points in comparison with queue - NORMAL: if user is in between 5 points worst and 5 points better in comparison with queue - GOOD: if user is better in between 5 and 25 in comparison with queue - VERY_GOOD: if user is better in 25 points or more in comparison with queue ## 2.5. last-calls/{extension} [GET] Obtain a list of calls made in the last `{hours}` by the `{extension}`, from recent to oldest. ### Params - **hours [optional]:** specify last amount of hours (default 24) ### Result ```javascript { "error": false, "error-msg": null, "result": [ { "uniqueid": call id, "calldate": yyyy-mm-dd hh:mm:ss, "duration": duration in seconds, "number": opponent phone number, "direction": "outgoing" | "incoming" }, ... ] } ``` ## 2.6. current-calls/{extension} [GET] Obtain a list of current calls where `{extension}` is involved, from recent to oldest. ### Result ```javascript { "error": false, "error-msg": null, "result": [ { "uniqueid": call id, "calldate": yyyy-mm-dd hh:mm:ss, "duration": duration in seconds, "number": opponent phone number, "direction": "outgoing" | "incoming" }, ... ] } ``` # 3. PBX ## 3.1. recording/{callID}/{extension} [GET] Get the audio of a call with identifier `{callID}` only if user with `{extension}` has permissions to access to the audio. ### Result ```javascript { "error": false, "error-msg": null, "result": { "processing": true | false. true means that the audio does not exists yet, "path" [optional]: if the user with `{extension}` is involved in the call: URL of the audio file in order to listen it inside Fedesk, "link" [optional]: if is not involved in the call: URL of the audio in the PBX admin. If the user has acces to the platform: he will be able to listen to it inside the PBX admin } } ``` ## 3.2. call/{destination} [POST] 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 ```javascript { "error": false, "error-msg": null, "result": { "success": true | false } } ``` # 4. AGENDA ## 4.1. delete-phones-agenda [DELETE] Delete phones in agenda with name `{name}`: - All records if field `phones` is NOT specified. - Only records specified in `phones` field. ### Params - **name:** agenda's name - **phones [optional]:** array of numbers to delete in the agenda in the format: ```javascript [ "{number}", ... ] ``` ### Result ```javascript { "error": false, "error-msg": null, "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. ### Params - **name:** agenda's name - **phones:** array of numbers to insert in the agenda in the format: ```javascript [ { "name": name of the phone, "number": number of the phone }, ... ] ``` ### Result ```javascript { "error": false, "error-msg": null, "result": { "success": true | false } } ``` # 5. TERMINAL ## 5.1. terminal-register/{mac} [POST] Given a `{mac}`, register user in all queues and terminals. Must unregister if wasn't previously unregistered. ### Result ```javascript { "error": false, "error-msg": null, "result": { "success": true | false } } ``` ## 5.2. terminal-register/{mac} [DELETE] Given a `{mac}`, unregister user in all queues and terminals. Must register if wasn't previously registered. ### Result ```javascript { "error": false, "error-msg": null, "result": { "success": true | false } } ``` # 6. COMPANY ## 6.1. company-numbers/{company} [GET] Get public numbers in `{company}`. ### Params - **in_use:** - `false` (or not set) means return all numbers, - `true` means only numbers in use ### Result ```javascript { "error": false, "error-msg": null, "result": [ { "id": identifier of the number, "name": name and number (E.g: "primari - 937060370"), "alias": alias (E.g: "ONFARMA"), "value": number }, ... ] } ```