Base URL
https://frontline.redshoresolutions.com/api/v1
API Usage Guide
Use this guide for frontend integration, automation scripts, and partner system integrations across core FrontLine modules.
https://frontline.redshoresolutions.com/api/v1
Authorization: Bearer <ACCESS_TOKEN>
application/json
API errors return JSON with error.code and error.message.
/auth/login (OIDC flow), then open /auth/session to verify your
authenticated session.
frontline.accessToken.
curl -X POST "https://frontline.redshoresolutions.com/api/v1/auth/dev-token" \
-H "Content-Type: application/json" \
-d '{"role":"tenant_admin","tenantId":"root-tenant","userId":"dev-user"}' GET /api/v1/health
Use this endpoint for uptime checks and environment diagnostics.
curl -X GET "https://frontline.redshoresolutions.com/api/v1/health" const response = await fetch("https://frontline.redshoresolutions.com/api/v1/health", {
method: "GET"
});
const data = await response.json();
console.log(data); import requests
response = requests.get("https://frontline.redshoresolutions.com/api/v1/health", timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Threading.Tasks;
using var http = new HttpClient();
var response = await http.GetAsync("https://frontline.redshoresolutions.com/api/v1/health");
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"status": "ok",
"version": "v1",
"tenantId": "tenant-id",
"requestId": "7fd205c4-a2f9-41f2-a8bc-0d2f26f8a9f2"
} GET /api/v1/auth/me
Returns current user identity, tenant context, and effective permissions.
curl -X GET "https://frontline.redshoresolutions.com/api/v1/auth/me" \
-H "Authorization: Bearer <ACCESS_TOKEN>" const response = await fetch("https://frontline.redshoresolutions.com/api/v1/auth/me", {
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
});
const profile = await response.json();
console.log(profile); import requests
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/auth/me", headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var response = await http.GetAsync("https://frontline.redshoresolutions.com/api/v1/auth/me");
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"userId": "EMP-1001",
"tenantId": "tenant-id",
"role": "tenant_admin",
"permissions": [
"employee.read",
"employee.write",
"inventory.read",
"inventory.write"
]
} GET /api/v1/employee-directory
Query employees with pagination and filters for directory and HR workflows.
curl -G "https://frontline.redshoresolutions.com/api/v1/employee-directory" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "page=1" \
--data-urlencode "pageSize=10" \
--data-urlencode "q=serge" \
--data-urlencode "departmentId=dept-ops" const url = new URL("https://frontline.redshoresolutions.com/api/v1/employee-directory");
url.searchParams.set("page", "1");
url.searchParams.set("pageSize", "10");
url.searchParams.set("q", "serge");
const response = await fetch(url, {
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
});
const directory = await response.json();
console.log(directory); import requests
params = {
"page": 1,
"pageSize": 10,
"q": "serge",
"departmentId": "dept-ops",
}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/employee-directory", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/employee-directory?page=1&pageSize=10&q=serge&departmentId=dept-ops";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"page": 1,
"pageSize": 10,
"total": 115,
"items": [
{
"id": "FL-1026",
"name": "John Smith",
"department": "Operations",
"position": "Manager",
"status": "active"
}
]
} GET /api/v1/recruiting/candidates
Fetch candidates for recruiter queues and candidate review screens.
curl -G "https://frontline.redshoresolutions.com/api/v1/recruiting/candidates" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "page=1" \
--data-urlencode "pageSize=10" \
--data-urlencode "status=new" const response = await fetch(
"https://frontline.redshoresolutions.com/api/v1/recruiting/candidates?page=1&pageSize=10&status=new",
{
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
}
);
const candidates = await response.json();
console.log(candidates); import requests
params = {"page": 1, "pageSize": 10, "status": "new"}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/recruiting/candidates", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/recruiting/candidates?page=1&pageSize=10&status=new";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"page": 1,
"pageSize": 10,
"total": 73,
"items": [
{
"id": "CAND-2044",
"name": "Maria Jensen",
"status": "new",
"score": 0.87,
"role": "Customer Support Agent"
}
]
} GET /api/v1/workforce/shifts
Load shift data for schedule views, swap workflows, and capacity planning.
curl -G "https://frontline.redshoresolutions.com/api/v1/workforce/shifts" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "clientId=client-redshore" \
--data-urlencode "lobId=lob-support" const response = await fetch(
"https://frontline.redshoresolutions.com/api/v1/workforce/shifts?clientId=client-redshore&lobId=lob-support",
{
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
}
);
const shifts = await response.json();
console.log(shifts); import requests
params = {"clientId": "client-redshore", "lobId": "lob-support"}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/workforce/shifts", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/workforce/shifts?clientId=client-redshore&lobId=lob-support";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"items": [
{
"id": "SHIFT-9002",
"employeeId": "FL-1109",
"clientId": "client-redshore",
"lobId": "lob-support",
"startUtc": "2026-03-02T12:00:00Z",
"endUtc": "2026-03-02T20:00:00Z",
"status": "scheduled"
}
]
} GET /api/v1/service-desk/tickets
Read ticket queues scoped by tenant, project/client, and role permissions.
curl -G "https://frontline.redshoresolutions.com/api/v1/service-desk/tickets" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "status=open" \
--data-urlencode "priority=high" const response = await fetch(
"https://frontline.redshoresolutions.com/api/v1/service-desk/tickets?status=open&priority=high",
{
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
}
);
const tickets = await response.json();
console.log(tickets); import requests
params = {"status": "open", "priority": "high"}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/service-desk/tickets", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/service-desk/tickets?status=open&priority=high";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"items": [
{
"id": "TCK-12031",
"summary": "VPN access issue",
"status": "open",
"priority": "high",
"assigneeId": "FL-1008",
"slaState": "at_risk"
}
]
} GET /api/v1/inventory/assets
Load inventory registry records and filter by category, status, and assignment.
curl -G "https://frontline.redshoresolutions.com/api/v1/inventory/assets" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "status=in_use" \
--data-urlencode "category=laptop" const response = await fetch(
"https://frontline.redshoresolutions.com/api/v1/inventory/assets?status=in_use&category=laptop",
{
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
}
);
const assets = await response.json();
console.log(assets); import requests
params = {"status": "in_use", "category": "laptop"}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/inventory/assets", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/inventory/assets?status=in_use&category=laptop";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"items": [
{
"id": "AST-33018",
"assetTag": "LPT-33018",
"category": "laptop",
"status": "in_use",
"assignedTo": "FL-1050",
"location": "Remote"
}
]
} GET /api/v1/notifications
Read user-scoped notifications for the header dropdown and full alerts view.
curl -G "https://frontline.redshoresolutions.com/api/v1/notifications" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
--data-urlencode "page=1" \
--data-urlencode "pageSize=20" const response = await fetch(
"https://frontline.redshoresolutions.com/api/v1/notifications?page=1&pageSize=20",
{
headers: {
Authorization: "Bearer <ACCESS_TOKEN>"
}
}
);
const notifications = await response.json();
console.log(notifications); import requests
params = {"page": 1, "pageSize": 20}
headers = {"Authorization": "Bearer <ACCESS_TOKEN>"}
response = requests.get("https://frontline.redshoresolutions.com/api/v1/notifications", params=params, headers=headers, timeout=15)
response.raise_for_status()
print(response.json()) using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "<ACCESS_TOKEN>");
var url = "https://frontline.redshoresolutions.com/api/v1/notifications?page=1&pageSize=20";
var response = await http.GetAsync(url);
response.EnsureSuccessStatusCode();
var body = await response.Content.ReadAsStringAsync();
Console.WriteLine(body); {
"page": 1,
"pageSize": 20,
"unreadCount": 12,
"items": [
{
"id": "NTF-7762",
"title": "Approval required",
"type": "profile_change",
"createdAt": "2026-03-01T10:12:41Z",
"read": false
}
]
}