NAV
cURL Ruby Nodejs JS Dart

Introduction

Welcome to the DSS Keesa API! You can use this API to access Keesa API endpoints.

We have language bindings in Shell, Ruby, JavaScript (using fetch), Nodejs, and Dart! You can view code examples in the dark area to the right, and you can switch the programming language of the examples with the tabs in the top right.

Authentication

Login

To authorize, use bellow code:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/auth?user=user@example.com&password=Password")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/x-www-form-urlencoded"
form_data = []
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

var axios = require('axios');
var FormData = require('form-data');
var data = new FormData();

var config = {
  method: 'post',
  url: 'https://dss.mv/api/v1/auth?user=user@example.com&password=Password',
  headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

# With shell, you can make a post request 
# with content-type header set as application/x-www-form-urlencoded
# user(email address) and password params are required
curl --location --request \
POST 'https://dss.mv/api/v1/auth?user=user@example.com&password=Password' \
--header 'Content-Type: application/x-www-form-urlencoded'
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");

var formdata = new FormData();

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/auth?user=user@example.com&password=Password", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Content-Type': 'application/x-www-form-urlencoded'
};
var request = http.MultipartRequest('POST', Uri.parse('https://dss.mv/api/v1/auth?user@example.com&password=Password'));

request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON structured as bellow:

{
  "csrf": "nM8kfbW0EskewvNY0Mr3/0VFJ1FqrS7puG9TBmeDA78YQGvVxh5hYSx3d6eooEDTliZeCCFocU9XOSNetgSpeg==",
  "access": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyODU5NzUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNiNmQ2MjBkLWZlZTctNGQ4NS04ZjdkLWY3ZWY2YTAwNjk5ZSIsImV4cCI6MTYxNDI4NTk3NSwicnVpZCI6IjUyMjRmZTI2LTI4NTYtNDgyZi1iNjgzLWIxYjkxNTA2YzEzMSJ9.GwLlsszpt6lDf5awskjxBBj1DDE",
  "access_expires_at": "2021-01-26T01:46:15.000+05:00",
  "refresh": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyODU5NzUsInVzZXJfaWQiOjQsInVpZCI6IjUyMjRmZTI2LTI4NTYtNDgyZi1iNjgzLWIxYjkxNTA2YzEzMSIsImV4cCI6MTYxNTE0NjM3NX0.xuG0OvYpzS2dvaZiyle4lrOpOu",
  "refresh_expires_at": "2021-02-08T00:46:15.000+05:00"
}

Keesa uses JWT to authenticate and authorize access to all endpoints (except login).

The "access" token from this endpoint must be used in all subsequent requests to the API. Once the access token has expired, the "refresh" token can be used to request a new access token

The access token must be sent in the Authorization header as the Bearer token

Authorization: Bearer <token>

Endpoint

https://dss.mv/api/v1/auth

HTTP Headers

Header Description
Content-Type set to 'application/x-www-form-urlencoded'

URL Parameters

Parameter Required Description
user true email address of the user
password true password of the user

Refresh Token

To receive a new access token, use bellow code:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/auth/refresh_token")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Content-Type"] = "application/x-www-form-urlencoded"
request["X-Refresh-Token"] = "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjA0MzEsInVzZXJfaWQiOjQsInVpZCI6Ijk5ZTQ5MTk4LTg2NTctNGYwMS1iMjY2LTMxYTk4YWM0YzhlMCIsImV4cCI6MTYxNTEyMDgzMX0.vk87uAEsGFl8bwlWnDBW4DncvkhTq4IqkaRAKElX_7Y"
form_data = []
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body

var axios = require('axios');
var FormData = require('form-data');
var data = new FormData();

var config = {
  method: 'post',
  url: 'https://dss.mv/api/v1/auth/refresh_token',
  headers: { 
    'Content-Type': 'application/x-www-form-urlencoded', 
    'X-Refresh-Token': 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjA0MzEsInVzZXJfaWQiOjQsInVpZCI6Ijk5ZTQ5MTk4LTg2NTctNGYwMS1iMjY2LTMxYTk4YWM0YzhlMCIsImV4cCI6MTYxNTEyMDgzMX0.vk87uAEsGFl8bwlWnDBW4DncvkhTq4IqkaRAKElX_7Y', 
    ...data.getHeaders()
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

# Make a post request 
# with content-type header set as application/x-www-form-urlencoded
# with X-Refresh-Token header set as the refresh token from the login endpoint
curl --location --request POST 'https://dss.mv/api/v1/auth/refresh_token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'X-Refresh-Token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjA0MzEsInVzZXJfaWQiOjQsInVpZCI6Ijk5ZTQ5MTk4LTg2NTctNGYwMS1iMjY2LTMxYTk4YWM0YzhlMCIsImV4cCI6MTYxNTEyMDgzMX0.vk87uAEsGFl8bwlWnDBW4DncvkhTq4IqkaRAKElX_7Y'
var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
myHeaders.append("X-Refresh-Token", "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjA0MzEsInVzZXJfaWQiOjQsInVpZCI6Ijk5ZTQ5MTk4LTg2NTctNGYwMS1iMjY2LTMxYTk4YWM0YzhlMCIsImV4cCI6MTYxNTEyMDgzMX0.vk87uAEsGFl8bwlWnDBW4DncvkhTq4IqkaRAKElX_7Y");

var formdata = new FormData();

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: formdata,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/auth/refresh_token", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Content-Type': 'application/x-www-form-urlencoded',
  'X-Refresh-Token': 'eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjA0MzEsInVzZXJfaWQiOjQsInVpZCI6Ijk5ZTQ5MTk4LTg2NTctNGYwMS1iMjY2LTMxYTk4YWM0YzhlMCIsImV4cCI6MTYxNTEyMDgzMX0.vk87uAEsGFl8bwlWnDBW4DncvkhTq4IqkaRAKElX_7Y'
};
var request = http.MultipartRequest('POST', Uri.parse('https://dss.mv/api/v1/auth/refresh_token'));

request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON structured as bellow:

{
  "csrf": "YGmUWUnFQL9bpAOkpizAWm1tI1hd9GJ7Dlwu8CJSBkIcc/GtmxCE8qMzMSNJ14zpqQV9+ZtYMIdOhsRAvTdsFg==",
  "access": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyODcyMDMsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImMxNDAxNzM5LWFiNTAtNDBjNS04NzZlLTBlMDc4YmNmZDhjYyIsImV4cCI6MTYxNDI4NzIwMywicnVpZCI6IjUyMjRmZTI2LTI4NTYtNDgyZi1iNjgzLWIxYjkxNTA2YzEzMSJ9.820jJ3JIg-W_lpEeZ1ixkyHwL4VKivYFu5f4PRLQA3c",
  "access_expires_at": "2021-02-26T02:06:43.000+05:00"
}

The refresh token must be used to request for a new access token once the previous access token expires.

Endpoint

https://dss.mv/api/v1/auth/refresh_token

HTTP Headers

Header Description
Content-Type set to 'application/x-www-form-urlencoded'
X-Refresh-Token use the 'refresh' token from login response

Tickets

Raise a Ticket

To raise a new Ticket, use below code:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/tickets")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI"
request["Content-Type"] = "application/json"
request.body = "{\r\n    \"ticket\": {\r\n        \"title\": \"example title\",\r\n        \"description\": \"example description\",\r\n        \"reference\": \"example reference\",\r\n        \"ticket_type\": \"eco_support\",\r\n        \"customer_id\": 20,\r\n        \"priority\": 1,\r\n        \"product_id\": 4,\r\n        \"customer_name\": \"john doe\",\r\n        \"customer_contact\": 7735241,\r\n        \"category\": \"fault\"\r\n    },\r\n    \"eco_id\": 1\r\n}"

response = http.request(request)
puts response.read_body


var axios = require('axios');
var data = JSON.stringify({"ticket":{"title":"example title","description":"example description","reference":"example reference","ticket_type":"eco_support","customer_id":20,"priority":1,"product_id":4,"customer_name":"john doe","customer_contact":7735241,"category":"fault"},"eco_id":1});

var config = {
  method: 'post',
  url: 'https://dss.mv/api/v1/tickets',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI', 
    'Content-Type': 'application/json'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

curl --location --request POST 'https://dss.mv/api/v1/tickets' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI' \
--header 'Content-Type: application/json' \
--data-raw '{
    "ticket": {
        "title": "example title",
        "description": "example description",
        "reference": "example reference",
        "ticket_type": "eco_support",
        "customer_id": 20,
        "priority": 1,
        "product_id": 4,
        "customer_name": "john doe",
        "customer_contact": 7735241,
        "category": "fault"
    },
    "eco_id": 1
}'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"ticket":{"title":"example title","description":"example description","reference":"example reference","ticket_type":"eco_support","customer_id":20,"priority":1,"product_id":4,"customer_name":"john doe","customer_contact":7735241,"category":"fault"},"eco_id":1});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/tickets", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI',
  'Content-Type': 'application/json'
};
var request = http.Request('POST', Uri.parse('https://dss.mv/api/v1/tickets'));
request.body = '''{\r\n    "ticket": {\r\n        "title": "example title",\r\n        "description": "example description",\r\n        "reference": "example reference",\r\n        "ticket_type": "eco_support",\r\n        "customer_id": 20,\r\n        "priority": 1,\r\n        "product_id": 4,\r\n        "customer_name": "john doe",\r\n        "customer_contact": 7735241,\r\n        "category": "fault"\r\n    },\r\n    "eco_id": 1\r\n}''';
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON array structured as bellow:

{
    "success": {
        "ticket_number": "2102001"
    }
}

Post Ticket as a JSON object in the body of the request to raise a new ticket.

Endpoint

https://dss.mv/api/v1/tickets/

Method

POST

JSON Object

Key Value Type Required Details
Ticket Object True Main object
Title String True Title for the ticket
Description String True Description of the ticket
Reference String False Reference for ticket
Customer ID Integer - Customer ID (required if Eco ID is not provided)
Priority Integer False 1 or 5
Product ID Integer True Product ID (Check product list for ID)
Customer Name String True Customer contact name
Customer Contact Integer True Customer contact number
Category String True Ticket Category (Check Ticket Category list)
Ticket Type String True Ticket Ticket Type (Check Ticket Ticket Type list)
Eco ID Integer - Eco ID (required if Customer ID is not provided)

HTTP Headers

Header Description
Authorization Bearer token set to access token
Content-Type application/json

Get All Tickets

To fetch all tickets for a user, use below code:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/tickets")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4"

response = http.request(request)
puts response.read_body

var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://dss.mv/api/v1/tickets',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

curl --location --request GET 'https://dss.mv/api/v1/tickets' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4");

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/tickets", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
};
var request = http.Request('GET', Uri.parse('https://dss.mv/api/v1/tickets'));

request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON array structured as bellow:

{
  "data": {
    "tickets": [
      {
        "id": 2011046,
        "title": "fix our Fax line",
        "customer": "Customer X",
        "description": "Fix fax line issues ",
        "status": "open",
        "contact_number": 7000111,
        "contact_name": "John",
        "raised_on": "2020-11-07T14:04:19.033+05:00",
        "raised_by": "Jane Doe",
        "assigned_to": "Doe",
        "ticket_type": "roc_support",
        "category": "service_order",
        "image_urls": [],
        "closed_date": "not closed",
        "ticket_notes": [
          {
            "comment": "<div><strong>sample comment<br></strong>something</div><ul><li>bullets</li></ul>",
            "added_on": "2020-11-22T12:07:36.811+05:00",
            "commented_by": "John Doe (John)"
          }
        ]
      }
    ]
  }
}

To fetch all the ticket related to the logged in user, make a GET request with the access token from the login request.

This will fetch all the open tickets for the logged in user (tickets assigned to or raised by the user)

Endpoint

https://dss.mv/api/v1/tickets/

Method

GET

HTTP Headers

Header Description
Authorization Bearer token set to access token

Get Tickets by Ticket Type

To fetch tickets by ticket type, use below code:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/tickets/tickets_by_type?limit=10&order=asc")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI"
request["Content-Type"] = "application/json"
request.body = "{ \"ticket\": { \"type\": \"customer_support\", \"status\": \"open\"} }"

response = http.request(request)
puts response.read_body

var axios = require('axios');
var data = JSON.stringify({"ticket":{"type":"customer_support","status":"open"}});

var config = {
  method: 'get',
  url: 'https://dss.mv/api/v1/tickets/tickets_by_type?limit=10&order=asc',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI', 
    'Content-Type': 'application/json'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});
curl --location --request GET 'https://dss.mv/api/v1/tickets/tickets_by_type?limit=10&order=asc' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI' \
--header 'Content-Type: application/json' \
--data-raw '{ "ticket": { "type": "customer_support", "status": "open"} }'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"ticket":{"type":"customer_support","status":"open"}});

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/tickets/tickets_by_type?limit=10&order=asc", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQ1MTg0NzQsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjZkNjg2YjhiLTEyOTQtNDQ1NC1hYjRhLWFmZmY5NzE3MDVlMSIsImV4cCI6MTYxNDUxODQ3NCwicnVpZCI6IjA5NzBmM2U2LTFmZWYtNGY4ZC1hNjFhLTE1NjA1NTNkMDgwZiJ9.mC8kYKA7_OE1ex4I3_fR-2YgFJr4f6dDIhtg1-w_yZI',
  'Content-Type': 'application/json'
};
var request = http.Request('GET', Uri.parse('https://dss.mv/api/v1/tickets/tickets_by_type?limit=10&order=asc'));
request.body = '''{ "ticket": { "type": "customer_support", "status": "open"} }''';
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON array structured as bellow:

{
  "data": {
    "count": 1,
    "tickets": [
      {
        "id": 2009004,
        "title": "MoE DS Monitoring",
        "customer": "Customer X",
        "description": "Check monitoring for 2 schools",
        "status": "open",
        "priority": 5,
        "contact_number": 7000111,
        "contact_name": "Mr. Doe",
        "raised_on": "2020-09-01T10:58:37.528+05:00",
        "raised_by": "John Doe",
        "assigned_to": "John Doe",
        "ticket_type": "customer_support",
        "category": null,
        "image_urls": [],
        "closed_date": "not closed",
        "ticket_notes": [
          {
            "comment": "auto discovery in progress",
            "added_on": "2020-09-01T11:06:12.223+05:00",
            "commented_by": "John Doe (John)"
          },
          {
            "comment": "N Manadhoo\r\nM Muli\r\nSh Maaungoodhoo",
            "added_on": "2020-10-13T10:07:59.727+05:00",
            "commented_by": "John Doe (John)"
          }
        ]
      }
    ]
  }
}

To fetch tickets by ticket type, make a GET request with the access token from the login request.

This will fetch the last 10 tickets with this ticket type. To fetch more tickets or to sort the tickets use limit and order parameters respectively.

Endpoint

https://dss.mv/api/v1/tickets/tickets_by_type

Method

GET

URL Parameters

Parameter Required Description
limit false specify the number of tickets to be fetched
order false order the tickets (use 'asc' or 'desc')

JSON Object

Key Value Type Required Details
Ticket Object True Main object
Type String True Ticket Ticket Type (Check Ticket Ticket Type list)
Status Integer True Status of the ticket (Check Ticket statuses list)

HTTP Headers

Header Description
Authorization Bearer token set to access token

Get Specific Ticket

To fetch details for a specific ticket, use the code below:

require "uri"
require "net/http"

url = URI("https://dss.mv/api/v1/tickets/2012001")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4"

response = http.request(request)
puts response.read_body

var axios = require('axios');

var config = {
  method: 'get',
  url: 'https://dss.mv/api/v1/tickets/2012001',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
  }
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

curl --location --request GET 'https://dss.mv/api/v1/tickets/2012001' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4");

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  redirect: 'follow'
};

fetch("https://dss.mv/api/v1/tickets/2012001", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MTQyNjY1NTEsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6ImFhZGE3ZGEwLWIxNWItNDEyNi05ZmVlLTAxOGUxMzliYTE0NSIsImV4cCI6MTYxNDI2NjU1MSwicnVpZCI6IjYxMWFiZmU0LWFmMzQtNDQ5NC05MjJiLWQ5YTkxZTAzMGRjYyJ9.OAE-eQzNj1PdnXYyafTLzdLlrBCmhe353urtsen8MU4'
};
var request = http.Request('GET', Uri.parse('https://dss.mv/api/v1/tickets/2012001'));

request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON structured as bellow:

{
  "data": {
    "ticket": {
      "id": 2012001,
      "title": "588 port change",
      "customer": "Customer Y",
      "description": "588 port change",
      "status": "closed",
      "contact_number": 7000011,
      "contact_name": "John",
      "raised_on": "2020-12-01T10:58:50.050+05:00",
      "raised_by": "John Doe",
      "assigned_to": "John Doe",
      "ticket_type": null,
      "category": "service_order",
      "image_urls": [],
      "closed_date": "2020-12-01T00:00:00.000+05:00",
      "ticket_notes": [
        {
          "comment": "port changed",
          "added_on": "2020-11-30T18:30:30.714+05:00",
          "commented_by": "John Doe (John)"
        }
      ]
    }
  }
}

Pass the ticket number to the endpoint to receive the details of a specific ticket.

Endpoint

https://dss.mv/api/v1/tickets/<ticket_number>

Method

GET

HTTP Headers

Header Description
Authorization Bearer token set to access token

Add Ticket Note

To add a note for a ticket, use below code:

require "uri"
require "net/http"

url = URI("http://127.0.0.1:3000/api/v1/tickets/add_ticket_note")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY"
request["Content-Type"] = "application/json"
request.body = "{\"ticket_note\": {\"note\": \"test ticket note\"},\"ticket_number\": \"2008022\"\}"

response = http.request(request)
puts response.read_body
var axios = require('axios');
var data = JSON.stringify({"ticket_note":{"note":"test ticket note"},"ticket_number":"2008022"});

var config = {
  method: 'post',
  url: 'http://127.0.0.1:3000/api/v1/tickets/add_ticket_note',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY', 
    'Content-Type': 'application/json'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});
curl --location --request POST 'http://127.0.0.1:3000/api/v1/tickets/add_ticket_note' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY' \
--header 'Content-Type: application/json' \
--data-raw '{"ticket_note": {"note": "test ticket note"},"ticket_number": "2008022"}'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"ticket_note":{"note":"test ticket note"},"ticket_number":"2008022"});

var requestOptions = {
  method: 'POST',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://127.0.0.1:3000/api/v1/tickets/add_ticket_note", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY',
  'Content-Type': 'application/json'
};
var request = http.Request('POST', Uri.parse('http://127.0.0.1:3000/api/v1/tickets/add_ticket_note'));
request.body = '''{"ticket_note": {"note": "test ticket note"},"ticket_number": "2008022"}''';
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON array structured as bellow:

{
  "success": {
    "ticket_number": "2008022",
    "comment": "test ticket note"
  }
}

To add a note to a ticket, make a POST request with the access token from the login request with the ticket number and ticket note.

This will add the supplied note to the specified ticket.

Endpoint

https://dss.mv/api/v1/tickets/add_ticket_note

Method

POST

JSON Object

Key Value Type Required Details
Ticket Note Object True Ticket Note Object
Note String True Note (attribute of ticket_note)
Ticket Number String True Ticket number

HTTP Headers

Header Description
Authorization Bearer token set to access token

Get Ticket Notes

To fetch the notes for a ticket, use below code:

require "uri"
require "net/http"

url = URI("http://127.0.0.1:3000/api/v1/tickets/get_ticket_notes")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Get.new(url)
request["Authorization"] = "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._IOzlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY"
request["Content-Type"] = "application/json"
request.body = "{\"ticket_number\": \"2008022\"}"

response = http.request(request)
puts response.read_body

var axios = require('axios');
var data = JSON.stringify({"ticket_number":"2008022"});

var config = {
  method: 'get',
  url: 'http://127.0.0.1:3000/api/v1/tickets/get_ticket_notes',
  headers: { 
    'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._IOzlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY', 
    'Content-Type': 'application/json'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});
curl --location --request GET 'http://127.0.0.1:3000/api/v1/tickets/get_ticket_notes' \
--header 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._IOzlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY' \
--header 'Content-Type: application/json' \
--data-raw '{"ticket_number": "2008022"}'
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY");
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"ticket_number":"2008022"});

var requestOptions = {
  method: 'GET',
  headers: myHeaders,
  body: raw,
  redirect: 'follow'
};

fetch("http://127.0.0.1:3000/api/v1/tickets/get_ticket_notes", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error));
var headers = {
  'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2MjE0Mzc3MjUsInVzZXJfaWQiOjQsInJvbGUiOiJhZG1pbiIsInVpZCI6IjNkOTdhNDQ1LTRkZWEtNGZiOC05NzI0LTE5OTdjOTRiYjMwMCIsImV4cCI6MTYyMTQzNzcyNSwicnVpZCI6Ijk3MjYyNGRkLTZmZTItNDQxZS05MGQyLTM2MmU5NGQ5ZjY1NiJ9._I0zlIGcMxSfoRSxJVQnsKSeJ8WP9gtrFBjMCoJ4RhY',
  'Content-Type': 'application/json'
};
var request = http.Request('GET', Uri.parse('http://127.0.0.1:3000/api/v1/tickets/get_ticket_notes'));
request.body = '''{\r\n    "ticket_number": "2008022"\r\n}''';
request.headers.addAll(headers);

http.StreamedResponse response = await request.send();

if (response.statusCode == 200) {
  print(await response.stream.bytesToString());
}
else {
  print(response.reasonPhrase);
}

This endpoint will return a JSON array structured as bellow:

{
  "data": {
    "count": 1,
    "notes": [
      {
        "id": 271,
        "note": "digital phone type changed",
        "user_name": "John Doe",
        "user_nick": "John",
        "commented_on": "18:30 11/08/2020"
      },
      {
        "id": 272,
        "note": "port changed",
        "user_name": "John Doe",
        "user_nick": "John",
        "commented_on": "20:30 11/08/2020"
      }
    ]
  }
}

To fetch the notes added to a ticket, make a GET request with the access token from the login request.

This will fetch all the notes for that ticket.

Endpoint

https://dss.mv/api/v1/tickets/get_ticket_notes

Method

GET

JSON Object

Key Value Type Required Details
Ticket Number String True Ticket number

HTTP Headers

Header Description
Authorization Bearer token set to access token

Response Codes

DSS Keesa API uses the following error codes:

Error Codes

Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your access token has expired or is invalid.
403 Forbidden -- You're not authorized to access this resource.
404 Not Found -- The specified resource could not be found.
418 I'm a teapot -- Keesa server refuses the attempt to brew coffee with a teapot.
422 Unprocessable Entity -- Requested data could not be processed.
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.

Success Codes

Code Meaning
200 OK -- Your request has succeeded.
201 Created -- The new resource you sent has been successfully created.
202 Accepted -- Your request has been accepted.
204 No Content -- Response has no content for the request.

Reference List

Products

ID Product
1 PABX
2 Switch
3 Router
4 WIFI
5 DATA
6 GPON
7 Networks - Admin
8 Networks - Staff
9 Networks - Guest
10 CCTV Network
11 CCTV Servers
12 iHTV
13 Survey
14 CATV
15 TEL NETWORK
16 CORE NETWORK
17 IPTV
18 GATEWAY
19 Rejected - NWR
20 Access Control
21 Pending Classification
22 School Network
23 DJA Network
24 Eco

Ticket Category

Category Key
Service Order service_order
Fault fault
Survey survey

Ticket Types

Type Key
ROC Support roc_support
Project Support project_support
Remote PMC remote_support
Cross Department Support cross_department_support
Customer Support customer_support
Eco Support eco_support
Routine Maintenance routine_maintenance