Create a Scripted Rest API to fetch RITM Variables

Mujahid Sharief
Tera Contributor

Requirement is to "Create a Scripted Rest API to fetch RITM Variables"
API should accept RITM number or sys_id as input.
API should fetch all associated catalog variables and values.
response should include : 1. variable name 2. variable label 3. variable value.
To implement this we have used multiple scripts, but when in case of variable type as reference, select box or list collector it is fetching the sys_id instead of display value.
First script : 

(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

var ritmNumber = request.queryParams.ritm_number;
var ritmSysId = request.queryParams.ritm_sys_id;

// Validate input
if (!ritmNumber && !ritmSysId) {
response.setStatus(400);
response.setBody({
error: "Missing required parameter: ritm_number or ritm_sys_id"
});
return;
}

// Retrieve the RITM record
var ritmGR = new GlideRecord('sc_req_item');

if (ritmSysId) {
ritmGR.addQuery('sys_id', ritmSysId);
ritmGR.query();

if (!ritmGR.next()) {
response.setStatus(404);
response.setBody({
error: "RITM not found for sys_id: " + ritmSysId
});
return;
}

} else if (ritmNumber) {
ritmGR.addQuery('number', ritmNumber);
ritmGR.query();

if (!ritmGR.next()) {
response.setStatus(404);
response.setBody({
error: "RITM not found for number: " + ritmNumber
});
return;
}
}

// Fetch ONLY variables
var varList = [];
var grVar = new GlideRecord('sc_item_option_mtom');
grVar.addQuery('request_item', ritmGR.sys_id);
grVar.query();

while (grVar.next()) {
varList.push({
name: grVar.sc_item_option.item_option_new.name.toString(),
label: grVar.sc_item_option.item_option_new.question_text.toString(),
value: grVar.sc_item_option.value.getDisplayValue()
});
}

response.setStatus(200);

if (ritmSysId) {
response.setBody({
ritm_sys_id: ritmGR.getUniqueValue(),
variables: varList
});

} else if (ritmNumber) {
response.setBody({
ritm_number: ritmGR.getValue('number'),
variables: varList
});
}

})(request, response);
-------------------------------------------------------------------------------------------------------
Second script :

(function process( /*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) {

    var ritmNumber = request.queryParams.ritm_number;
    var ritmSysId = request.queryParams.ritm_sys_id;

    // Validate input
    if (!ritmNumber && !ritmSysId) {
        response.setStatus(400);
        response.setBody({
            error: "Missing required parameter: ritm_number or ritm_sys_id"
        });
        return;
    }

    // Retrieve the RITM record
    var ritmGR = new GlideRecord('sc_req_item');

    if (ritmSysId) {
        ritmGR.addQuery('sys_id', ritmSysId);
        ritmGR.query();

        if (!ritmGR.next()) {
            response.setStatus(404);
            response.setBody({
                error: "RITM not found for sys_id: " + ritmSysId
            });
            return;
        }

    } else if (ritmNumber) {
        ritmGR.addQuery('number', ritmNumber);
        ritmGR.query();

        if (!ritmGR.next()) {
            response.setStatus(404);
            response.setBody({
                error: "RITM not found for number: " + ritmNumber
            });
            return;
        }
    }

    // Fetch ONLY variables
    var varList = [];
    var grVar = new GlideRecord('sc_item_option_mtom');
    grVar.addQuery('request_item', ritmGR.sys_id);
    grVar.query();

    while (grVar.next()) {

        var option = grVar.sc_item_option.getRefRecord();
        if (!option.isValidRecord()) continue;

        var question = option.item_option_new.getRefRecord();
        if (!question.isValidRecord()) continue;

        var name = question.getValue('name');
        var label = question.getValue('question_text');

        var rawValue = option.getValue('value');
        var displayValue = rawValue;

        var type = question.getValue('type'); // variable type
        var refTable = question.getValue('reference'); // reference table (if any)

        // 🔥 1. Reference variable
        if (refTable && rawValue) {
            var refGR = new GlideRecord(refTable);
            if (refGR.get(rawValue)) {
                displayValue = refGR.getDisplayValue();
            }
        }

        // 🔥 2. Select Box (choice)
        else if (type == '5') {
            displayValue = option.getDisplayValue('value');
        }

        // 🔥 3. List Collector
        else if (type == '21' && refTable && rawValue) {

            var ids = rawValue.split(',');
            var values = [];

            var lcGR = new GlideRecord(refTable);

            for (var i = 0; i < ids.length; i++) {
                if (lcGR.get(ids[i])) {
                    values.push(lcGR.getDisplayValue());
                }
            }

            displayValue = values.join(', ');
        }

        // 🔥 4. Fallback (text, boolean, etc.)
        else {
            displayValue = option.getDisplayValue('value') || rawValue;
        }

        varList.push({
            name: name,
            label: label,
            value: displayValue
        });
    }
    response.setStatus(200);

    if (ritmSysId) {
        response.setBody({
            ritm_sys_id: ritmGR.getUniqueValue(),
            variables: varList
        });

    } else if (ritmNumber) {
        response.setBody({
            ritm_number: ritmGR.getValue('number'),
            variables: varList
        });
    }

})(request, response);


-------------------------------------------------------------------
First script is returning sys_id instead of display value completely in case of reference fields or list collector.
Second script is returning display value in some cases, and failing in some cases of reference fields and list collector as well.
Please help identify, what changes are required in the script to fetch display value instead of sys_id.




10 REPLIES 10

Ankur Bawiskar
Tera Patron

@Mujahid Sharief 

check this link

SN Pro Tips — Scripted REST APIs & Retrieving RITM Variables via SRAPI

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader

 

 Hi @Ankur Bawiskar 

But the example script is returning sys_id for requested_for field in the article you mentioned.
we need display value of it.
please check screenshot

 

 

 

@Mujahid Sharief 

enhance the logic to get the display value

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader

Tanushree Maiti
Kilo Patron

Hi @Mujahid Sharief 

 

this line returning sys _id

 

displayValue = refGR.getDisplayValue();

 

Instead of it mention field name

 

displayValue = refGR.getDisplayValue('number');  //display value of required field

 

refer: How to use getDisplayValue() and getValue() for GlideRecord or GlideElement

 

 

Please mark this response as Helpful & Accept it as solution if it assisted you with your question.
Regards
Tanushree Maiti
ServiceNow Technical Architect
Linkedin: