LogicMonitor recognized as a Customers' Choice by Gartner Peer Insights™ in 2024 Gartner Voice of the Customer for Observability platforms.

Read More

REST API v1 Examples

Last updated on 24 April, 2023

The following examples illustrate LMv1 Authentication for LogicMonitor REST API v1.

NOTE: These examples are provided for illustration purposes. Before you use them, you may need to edit parameters for your implementation.

Python 2.7 Examples

Example 1: POST

The following script illustrates LMv1 Authentication for a POST request in Python version 2.7.  Specifically, the following request adds a service to the account apiAccount.logicmonitor.com:

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac

#Account Info
AccessId ='API-ACCESS-ID'
AccessKey ='API-ACCESS-KEY'
Company = 'apiAccount'

#Request Info: Add a service
httpVerb ='POST'
resourcePath = '/service/services'
data = '{"type":"ping","name":"LMCertification","disableAlerting":false,"pollingInterval":5,"host":"www.logicmonitor.docebosaas.com"}'

#Construct URL 
url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath

#Get current time in milliseconds
epoch = str(int(time.time() * 1000))

#Concatenate Request details
requestVars = httpVerb + epoch + data + resourcePath

#Construct signature
signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
headers = {'Content-Type':'application/json','Authorization':auth}

#Make request
response = requests.post(url, data=data, headers=headers)

#Print status and body of response
print 'Response Status:',response.status_code
print 'Response Body:',response.content

Example 2: GET

The following script illustrates LMv1 Authentication for a GET request in Python version 2.7.  Specifically, the following request gets details for all services in apiAccount.logicmonitor.com:

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac

#Account Info
AccessId ='API-ACCESS-ID'
AccessKey ='API-ACCESS-KEY'
Company = 'apiAccount'

#Request Info: Get Services
httpVerb ='GET'
resourcePath = '/service/services'
queryParams = '?filter=name~QA'

#Construct URL 
url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath + queryParams

#Get current time in milliseconds
epoch = str(int(time.time() * 1000))

#Concatenate Request details
requestVars = httpVerb + epoch + resourcePath

#Construct signature
signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
headers = {'Content-Type':'application/json','Authorization':auth}

#Make request
response = requests.get(url, headers=headers)

#Print status and body of response
print 'Response Status:',response.status_code
print 'Response Body:',response.content

Python 3 Examples

Example 1: GET

The following script illustrates LMv1 Authentication for a GET request in Python version 3.5.  Specifically, the following request gets details for all devices in apiAccount.logicmonitor.com:

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac
import getpass

#Account Info: LogicMonitor recommends to NEVER hardcode the credentials. Instead, retrieve the values from a secure storage.
#Note: The below is provided for illustration purposes only.
AccessId = getpass.getpass("Enter your AccessId: ")
AccessKey = getpass.getpass("Enter your AccessKey: ")
Company = 'apiAccount' 

#Request Info
httpVerb ='GET'
resourcePath = '/device/devices'
queryParams =''
data = ''

#Construct URL 
url = 'https://'+ Company +'.logicmonitor.com/santaba/rest' + resourcePath +queryParams

#Get current time in milliseconds
epoch =str(int(time.time() * 1000))

#Concatenate Request details
requestVars = httpVerb + epoch + data + resourcePath

#Construct signature
digest = hmac.new(
        AccessKey.encode('utf-8'),
        msg=requestVars.encode('utf-8'),
        digestmod=hashlib.sha256).hexdigest()
signature = base64.b64encode(digest.encode('utf-8')).decode('utf-8')

# Construct headers
auth = 'LMv1 ' + AccessId + ':' + str(signature) + ':' + epoch 
headers = {'Content-Type':'application/json','Authorization':auth}

#Make request
response = requests.get(url, data=data, headers=headers)

#Print status and body of response
print ('Response Status:',response.status_code)
print ('Response Body:',response.content)

Groovy Examples

Example 1: GET

The following script illustrates LMv1 Authentication for a GET request in Groovy.  Specifically, the following request gets details for all services in apiAccount.logicmonitor.com:

import org.apache.http.HttpEntity
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
	
//define credentials and url
def accessId = 'API-ACCESS-ID';
def accessKey = 'API-ACCESS-KEY'';
def account = 'apiAccount';
def resourcePath = "/service/services"
def url = "https://" + account + ".logicmonitor.com" + "/santaba/rest" + resourcePath;

//get current time
epoch = System.currentTimeMillis();

//calculate signature
requestVars = "GET" + epoch + resourcePath;

hmac = Mac.getInstance("HmacSHA256");
secret = new SecretKeySpec(accessKey.getBytes(), "HmacSHA256");
hmac.init(secret);
hmac_signed = Hex.encodeHexString(hmac.doFinal(requestVars.getBytes()));
signature = hmac_signed.bytes.encodeBase64();

// HTTP Get
CloseableHttpClient httpclient = HttpClients.createDefault();
httpGet = new HttpGet(url);
httpGet.addHeader("Authorization" , "LMv1 " + accessId + ":" + signature + ":" + epoch);
response = httpclient.execute(httpGet);
responseBody = EntityUtils.toString(response.getEntity());
code = response.getStatusLine().getStatusCode();

// Print Response
println "Status:" + code;
println "Body:" + responseBody;

httpclient.close();

Example 2: PUT

The following script illustrates LMv1 Authentication for a PUT request in Groovy.  Specifically, the following request updates a device in account apiAccount.logicmonitor.com:

import org.apache.http.HttpEntity
import org.apache.http.client.methods.CloseableHttpResponse
import org.apache.http.client.methods.HttpPut
import org.apache.http.impl.client.CloseableHttpClient
import org.apache.http.impl.client.HttpClients
import org.apache.http.util.EntityUtils
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Hex;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;

//define credentials and url
def accessId = 'API-ACCESS-ID';
def accessKey = 'API-ACCESS-KEY';
def account = 'apiAccount';

def resourcePath = "/device/devices/4"

def url = "https://" + account + ".logicmonitor.com" + "/santaba/rest" + resourcePath

def data = '{"name":"10.14.35.210","displayName":"ProdServer","preferredCollectorId":12,"hostGroupIds":1,"description":"a server in the production environment"}'
StringEntity params = new StringEntity(data,ContentType.APPLICATION_JSON);

epoch = System.currentTimeMillis(); //get current time

requestVars = "PUT" + epoch + data + resourcePath;

// construct signature
hmac = Mac.getInstance("HmacSHA256");
secret = new SecretKeySpec(accessKey.getBytes(), "HmacSHA256");
hmac.init(secret);
hmac_signed = Hex.encodeHexString(hmac.doFinal(requestVars.getBytes()));
signature = hmac_signed.bytes.encodeBase64();

// HTTP PUT
CloseableHttpClient httpclient = HttpClients.createDefault();
http_request = new HttpPut(url);
http_request.setHeader("Authorization" , "LMv1 " + accessId + ":" + signature + ":" + epoch);
http_request.setHeader("Accept", "application/json");
http_request.setHeader("Content-type", "application/json");
http_request.setEntity(params);
response = httpclient.execute(http_request);
responseBody = EntityUtils.toString(response.getEntity());
code = response.getStatusLine().getStatusCode();

// Print Response
println "Status:" + code;
println "Response body:" + responseBody;
httpclient.close(); 

PowerShell Examples

Example 1: GET

The following script illustrates LMv1 Authentication for a GET request in PowerShell.  Specifically, the following request gets details for all services in apiAccount.logicmonitor.com:

<# Use TLS 1.2 #>
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

<# account info #>
$accessId = 'API-ACCESS-ID'
$accessKey = 'API-ACCESS-KEY'
$company = 'apiAccount'

<# request details #>
$httpVerb = 'GET'
$resourcePath = '/service/services'

<# Construct URL #>
$url = 'https://' + $company + '.logicmonitor.com/santaba/rest' + $resourcePath

<# Get current time in milliseconds #>
$epoch = [Math]::Round((New-TimeSpan -start (Get-Date -Date "1/1/1970") -end (Get-Date).ToUniversalTime()).TotalMilliseconds)

<# Concatenate Request Details #>
$requestVars = $httpVerb + $epoch + $resourcePath

<# Construct Signature #>
$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($accessKey)
$signatureBytes = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($requestVars))
$signatureHex = [System.BitConverter]::ToString($signatureBytes) -replace '-'
$signature = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($signatureHex.ToLower()))

<# Construct Headers #>
$auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization",$auth)
$headers.Add("Content-Type",'application/json')

<# Make Request #>
$response = Invoke-RestMethod -Uri $url -Method Get -Header $headers 

<# Print status and body of response #>
$status = $response.status
$body = $response.data| ConvertTo-Json -Depth 5

Write-Host "Status:$status"
Write-Host "Response:$body"

Example 2: POST

The following script illustrates LMv1 Authentication for a POST request in PowerShell.  Specifically, the following request adds a service in apiAccount.logicmonitor.com:

<# Use TLS 1.2 #>
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

<# account info #>
$accessId = 'API-ACCESS-ID'
$accessKey = 'API-ACCESS-KEY'
$company = 'apiAccount'

<# request details #>
$httpVerb = 'POST'
$resourcePath = '/service/services'
$data = '{"type":"ping","name":"LMCertification","disableAlerting":false,"pollingInterval":5,"host":"www.logicmonitor.docebosaas.com"}'

<# Construct URL #>
$url = 'https://' + $company + '.logicmonitor.com/santaba/rest' + $resourcePath

<# Get current time in milliseconds #>
$epoch = [Math]::Round((New-TimeSpan -start (Get-Date -Date "1/1/1970") -end (Get-Date).ToUniversalTime()).TotalMilliseconds)

<# Concatenate Request Details #>
$requestVars = $httpVerb + $epoch + $data + $resourcePath

<# Construct Signature #>
$hmac = New-Object System.Security.Cryptography.HMACSHA256
$hmac.Key = [Text.Encoding]::UTF8.GetBytes($accessKey)
$signatureBytes = $hmac.ComputeHash([Text.Encoding]::UTF8.GetBytes($requestVars))
$signatureHex = [System.BitConverter]::ToString($signatureBytes) -replace '-'
$signature = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($signatureHex.ToLower()))

<# Construct Headers #>
$auth = 'LMv1 ' + $accessId + ':' + $signature + ':' + $epoch
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add("Authorization",$auth)
$headers.Add("Content-Type",'application/json')

<# Make Request #>
$response = Invoke-RestMethod -Uri $url -Method $httpVerb -Body $data -Header $headers 

<# Print status and body of response #>
$status = $response.status
$body = $response.data| ConvertTo-Json -Depth 5

Write-Host "Status:$status"
Write-Host "Response:$body"

Ruby Examples

Example 1: GET

The following script illustrates LMv1 Authentication for a GET request in Ruby.  Specifically, the following request gets details for all services in api.logicmonitor.com:

require 'net/http'
require 'net/https'
require 'uri'
require 'openssl'
require 'base64'
require 'json'
require 'date'

# Account Information
@account = 'api'
@access_id = 'API-ACCESS-ID'
@access_key = 'API-ACCESS-KEY'
@http_method = 'GET'
@data = ''
@resource_path = '/service/services'

# HMAC-SHA256 + Base64 Encode
def generate_token
  timestamp = DateTime.now.strftime('%Q')
  signature = Base64.strict_encode64(
    OpenSSL::HMAC.hexdigest(
      OpenSSL::Digest.new('sha256'), 
      @access_key,
      "#{@http_method}#{timestamp}#{@data}#{@resource_path}"
    )
  )
  "LMv1 #{@access_id}:#{signature}:#{timestamp}"
end

# Build and Execute HTTP Request
uri = URI.parse("https://#{@account}.logicmonitor.com/santaba/rest#{@resource_path}")
request = Net::HTTP::Get.new uri.request_uri
request['Authorization'] = generate_token
request['Content-Type'] = 'application/json'
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start
resp = http.request(request)
code = resp.code
begin
  body = JSON.parse(resp.body)
rescue JSON::ParserError => e
  body = resp.body
end

# Print HTTP Response Code and Body
puts "Response Status: %d" % code
puts "Response Body: %s" % body

Example2: POST

The following script illustrates LMv1 Authentication for a POST request in Ruby.  Specifically, the following request adds a service in api.logicmonitor.com:

require 'net/http'
require 'net/https'
require 'uri'
require 'openssl'
require 'base64'
require 'json'
require 'date'

# Account Information
@account = 'api'
@access_id = 'API-ACCESS-ID'
@access_key = 'API-ACCESS-KEY'
@http_method = 'POST'
@data = '{"type":"ping","name":"LMCertification","disableAlerting":false,"pollingInterval":5,"host":"www.logicmonitor.docebosaas.com"}'
@resource_path = '/service/services'

# HMAC-SHA256 + Base64 Encode
def generate_token
  timestamp = DateTime.now.strftime('%Q')
  signature = Base64.strict_encode64(
    OpenSSL::HMAC.hexdigest(
      OpenSSL::Digest.new('sha256'), 
      @access_key,
      "#{@http_method}#{timestamp}#{@data}#{@resource_path}"
    )
  )
  "LMv1 #{@access_id}:#{signature}:#{timestamp}"
end

# Build and Execute HTTP Request
uri = URI.parse("https://#{@account}.logicmonitor.com/santaba/rest#{@resource_path}")
request = Net::HTTP::Post.new uri.request_uri
request.body = @data
request['Authorization'] = generate_token
request['Content-Type'] = 'application/json'
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http.start
resp = http.request(request)
code = resp.code
begin
  body = JSON.parse(resp.body)
rescue JSON::ParserError => e
  body = resp.body
end

# Print HTTP Response Code and Body
puts "Response Status: %d" % code
puts "Response Body: %s" % body

PHP Examples

Example 1: POST

The following PHP script adds an alert rule to account api.logicmonitor.com:

<?php
$accessID = 'your-access-id';
$accessKEY = 'your-access-key';
$resourcePath = "/setting/alert/rules";
$url = "https://api.logicmonitor.com/santaba/rest$resourcePath";
$epoch = round(microtime(true) * 1000);
$httpVerb = "POST";
 
$data = array
(
	"name" => "test alert rule",
	"priority" => 100,
	"datasource" => "*",
	"instance" => "*",
	"datapoint" => "*",
	"escalationInterval" => 15,
	"escalatingChainId" => 1
);

$data_string = json_encode($data, true);
$requestVars = $httpVerb . $epoch . $data_string . $resourcePath;
print "REQUESTVARS: $requestVars\n\n";
 
//Generate Signature
$sig = base64_encode(hash_hmac('sha256', $requestVars, $accessKEY));
print "SIGNATURE: $sig\n\n";
 
//Setup headers
$auth = 'LMv1 '.$accessID.':'.$sig.':'.$epoch;
print "AUTH: $auth\n\n";
 
$headers = array('Content-Type: application/json',
 'Authorization: '.$auth
);
 
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 
$result = curl_exec($ch);
curl_close ($ch);
 
print_r($result);
 
?>

Node.js Examples

Example 1: GET

The following Node.js script gets the name and id of all devices with “prod” in the name from account api.logicmonitor.com:

// Account Info
var accessId = 'your-access-id';
var accessKey = 'your-access-key';
var company = 'api'

// Request Details
var httpVerb = "GET";
var epoch = (new Date).getTime();
var resourcePath = "/device/devices";

// Construct signature 
var requestVars = httpVerb + epoch + resourcePath;
var crypto = require("crypto");
var hex = crypto.createHmac("sha256", accessKey).update(requestVars).digest("hex");
var signature = new Buffer(hex).toString('base64');
  
// Construct auth header
var auth = "LMv1 " + accessId + ":" + signature + ":" + epoch;
// Configure request options 
var request = require('request');
var options = 
    {
      "method" : httpVerb,
			"uri" : "https://" + company + ".logicmonitor.com/santaba/rest" + resourcePath,
			"headers": {
			    'ContentType' : 'application/json',
			    'Authorization': auth
			  },
			"qs": {
				   'fields': 'id,name',
				   'filter': 'name~ip'
				  }	
    };

// Make request
request(options, function (error, response, body) {
		if (!error && response.statusCode == 200) {
		   // Print out the response body
		   console.log(body)
		 }
	 }); 

cURL Request

To use a cURL command or other one line request against the REST API v1, you will need to run the command in the following format:

python scriptName.py --id  --key  --method  --url  --data [Request Payload]

An example script may be:

#!/bin/env python

import requests
import json
import hashlib
import base64
import time
import hmac
import sys, getopt
from urlparse import parse_qs, urlparse

#Start with empty Account Details and populate based on arguments provided
AccessId = ''
AccessKey = ''
httpVerb = ''
url = ''
data = ''

try:
      opts, args = getopt.getopt(sys.argv[1:],"",["id=","key=","method=", "url=","data"])
except getopt.GetoptError:
      print 'Usage: python curl.py --id [Token Access Id] --key [Token Access Key] --method [HTTP Method] --url [Request URL] --data [Request Payload]'
      sys.exit(2)
for opt, arg in opts:
    if opt == "--id":
        AccessId = arg
    elif opt == "--key":
        AccessKey = arg
    elif opt == "--method":
        httpVerb = arg
    elif opt == "--url":
        url = arg
    elif opt == "--data":
        data = arg

#Construct resourcePath and remove /santaba/rest
resourcePath = urlparse(url).path

resourcePath = resourcePath[13:]

#Get current time in milliseconds
epoch = str(int(time.time() * 1000))

#Concatenate Request details
requestVars = httpVerb + epoch + data + resourcePath

#Construct signature
signature = base64.b64encode(hmac.new(AccessKey,msg=requestVars,digestmod=hashlib.sha256).hexdigest())

#Construct headers
auth = 'LMv1 ' + AccessId + ':' + signature + ':' + epoch
headers = {'Content-Type':'application/json','Authorization':auth}

#Make request
response = getattr(requests, httpVerb.lower())(url, data=data, headers=headers)

#Print status and body of response
print 'Response Status:',response.status_code
print 'Response Body:',response.content

sys.exit(2)

The following command can be run from a terminal and uses the above script to retrieve all services in api.logicmonitor.com:

python curl.py --id 'ACCESS-ID' --key 'ACCESS-KEY' --method 'GET' --url 'https://api.logicmonitor.com/santaba/rest/service/services'
In This Article