RoadBays REST API
Base URL: https://www.roadbays.com/api

Getting Started

All API requests must be sent over HTTPS. Authentication is handled via a Bearer token in the Authorization header of every request.

Welcome to the RoadBays API. To get started, sign into your account, navigate to Company Settings → API, and generate your API key.

Include your key as a Bearer token on every request:

bash
curl --location --request GET 'https://www.roadbays.com/api/v1_Cases' \
--header 'Authorization: Bearer YOUR_API_KEY_HERE'

Rate Limits

The following limits apply per API key. They are set well above the volume a typical integration needs, and are published so you can design against a known ceiling.

Standard Limits
LimitValueApplies To
Sustained requests 300 / minute All endpoints
Daily volume 250,000 / day All endpoints
Write operations 60 / minute POST, PUT, DELETE
Concurrent requests 10 Simultaneous in-flight requests
Page size 500 records List endpoints

Requests beyond these limits are throttled and receive a 429 Too Many Requests response. Honor the Retry-After header and back off exponentially rather than retrying immediately.

Integration partners: elevated limits are available and are set in your agreement. If you are building a high volume integration, contact us before you go live so capacity can be provisioned for your account.

To stay well inside the limits, pull in pages of 500 using the largest date range your process allows rather than requesting records one at a time, and cache reference data such as repair reasons, users, and PM tasks instead of refetching it on every run.

Cases
GET

List Cases

GET https://www.roadbays.com/api/v1_Cases?startdate={date}&enddate={date}

Retrieve a list of cases filtered by date range using the case open date.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Cases?startdate=10-1-2021&enddate=10-4-2021' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 408500,
    "dateCreated": "2021-10-03T09:07:13.84",
    "inactive": 0,
    "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
    "dateOpened": "2021-10-03T09:07:13.84",
    "dateCompleted": "2021-10-03T09:09:56.12",
    "dateClosed": "2021-10-03T09:09:56.12",
    "assignedUser": 81,
    "vendors": {
      "id": 10464,
      "name": "Shop Location 1",
      "address": "1234 Main Ave",
      "city": "Green Bay",
      "zip": "54304",
      "email": "test@email.com",
      "phone": "92012345687",
      "latitude": 47.254547,
      "longitude": -67.9403301,
      "vendorType": "CustomerShop",
      "ranking": 6
    },
    "vendorsId": 10464,
    "caseNumber": 8,
    "caseStatus": { "id": 3, "name": "Closed" },
    "caseStatusId": 3,
    "description": "Test Header",
    "units": {
      "id": 1030,
      "unitNumber": "3345",
      "description": "Mack Truck",
      "unitTypesId": 1014,
      "serialNo": "1XPBDP956AD486131",
      "engine": "MP8",
      "engineManufacturer": "MACK",
      "unitMake": "MACK",
      "unitModel": "Anthem",
      "modelYear": "2020",
      "unitSearchLabel": "3345 Tractor"
    },
    "unitsId": 1030,
    "repairReasonsId": 12,
    "priority": { "id": 5, "value": "5" },
    "priorityId": 5,
    "maintenanceBoard": 1
  }
]
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
startdateDateTimeStart date filter by case open date required
enddateDateTimeEnd date filter by case open date required
GET

Get Case

GET https://www.roadbays.com/api/v1_Cases/{caseId}

Retrieve full details for a single case by its RoadBays system-generated ID.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Cases/408500' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "id": 408500,
  "dateCreated": "2021-10-03T09:07:13.84",
  "inactive": 0,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "dateOpened": "2021-10-03T09:07:13.84",
  "dateCompleted": "2021-10-03T09:09:56.12",
  "dateClosed": "2021-10-03T09:09:56.12",
  "assignedUser": 81,
  "vendors": null,
  "vendorsId": 10464,
  "caseNumber": 8,
  "driverId": null,
  "caseStatus": null,
  "caseStatusId": 3,
  "description": "This is a case description",
  "locationDescription": null,
  "units": null,
  "unitsId": 100030,
  "repairReasonsId": 12,
  "offSet": "-05:00",
  "latitude": null,
  "longitude": null,
  "priority": null,
  "priorityId": 5,
  "maintenanceBoard": 1
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
caseIdintegerRoadBays system-generated case ID required
POST

Create Case

POST https://www.roadbays.com/api/v1_Cases

Create a new maintenance case for a unit. Identify the unit by vin or by unitsId. If a VIN isn't in your account yet, RoadBays decodes it and adds the unit automatically. If you don't send assignedUser, the case is assigned to the first active user on your account.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Cases' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'vin=1XPCEP6Y0JD486131' \
  --data-urlencode 'description=Case Description' \
  --data-urlencode 'assignedUser=81' \
  --data-urlencode 'locDescription=located in NE corner of lot' \
  --data-urlencode 'latitude=44.503807048107156' \
  --data-urlencode 'longitude=-88.0080488474994' \
  --data-urlencode 'userField1=custom field data 1' \
  --data-urlencode 'userField2=custom field data 2'
json — response
{
  "id": 4102,
  "dateCreated": "2021-10-24T20:40:44.428835-05:00",
  "inactive": 0,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "dateOpened": "2021-10-24T20:40:44.428835-05:00",
  "dateCompleted": null,
  "dateClosed": null,
  "assignedUser": 81,
  "vendorsId": null,
  "caseNumber": 39,
  "caseStatusId": 1,
  "description": "Case Description",
  "unitsId": 1030,
  "repairReasonsId": null,
  "offSet": "-05:00",
  "latitude": "44.503807048107156",
  "longitude": "-88.0080488474994",
  "priorityId": 5,
  "maintenanceBoard": 1
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstring17-character VIN; required if no unitsId
unitsIdintegerRoadBays unit ID; required if no vin
descriptionstringCase description optional
assignedUserintegerUser ID from List Users; defaults to the first active user optional
locDescriptionstringWhere the unit is located optional
latitudestringUnit latitude optional
longitudestringUnit longitude optional
userField1stringCustom field 1 optional
userField2stringCustom field 2 optional
POST

Create Case Note

POST https://www.roadbays.com/api/v1_CaseNotes

Append a text note to an existing case. Notes appear in the case communication feed visible to all assigned parties.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_CaseNotes' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'caseId=4102' \
  --data-urlencode 'noteText=Hello World'
json — response
{
  "id": 2176,
  "dateCreated": "2021-10-24T20:42:57.4429432-05:00",
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "createdBy": "Roadbays API_External",
  "createdByName": "Roadbays API_External",
  "note": "Hello World",
  "caseID": 4102,
  "offSet": "-05:00"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
caseIdintegerRoadBays system-generated case ID required
noteTextstringText to append to the case note feed required
GET

List Case Notes

GET https://www.roadbays.com/api/v1_CaseNotes?caseId={caseId}

Returns every note on a case, oldest first.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_CaseNotes?caseId=4102' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 2176,
    "dateCreated": "2021-10-24T20:42:57.443",
    "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
    "createdBy": "Roadbays API_External",
    "createdByName": "Roadbays API_External",
    "note": "Hello World",
    "caseID": 4102,
    "offSet": "-05:00"
  }
]
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
caseIdintegerRoadBays system-generated case ID required
POST

Case Notification

POST https://www.roadbays.com/api/v1CaseNotifications

Send a notification for a case via Email or SMS. Set NotificationTypesId to 2 for Email or 3 for SMS.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1CaseNotifications' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'CaseId=4102' \
  --data-urlencode 'NotificationTypesId=3' \
  --data-urlencode 'NotificationContact=9207640865' \
  --data-urlencode 'CaseHeader=True' \
  --data-urlencode 'CaseNotes=True'
json — response
{
  "id": 39,
  "caseId": 4102,
  "invoiceId": 0,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "inactive": 0,
  "dateCreated": "2021-12-05T05:59:37",
  "notificationTypesId": 3,
  "notificationContact": "9207640865",
  "caseHeader": true,
  "caseNotes": true
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
CaseIdintegerRoadBays system-generated case ID required
NotificationTypesIdintegerEmail = 2 · SMS = 3 required
NotificationContactstringEmail address or phone number required
CaseHeaderboolNotify on case header changes required
CaseNotesboolNotify on new case notes required
GET

Share Case

GET https://www.roadbays.com/api/v1_CaseShare?caseId={id}

Generate a public shareable URL for a case. Returns a signed link that can be shared with external parties who don't have a RoadBays account.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_CaseShare?caseId=4102' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{ "url": "https://www.roadbays.com/caseShared/details?key=KsOKGoz5uZLPi2&caseId=4102&invoiceId=0" }
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
caseIdintegerRoadBays system-generated case ID required
POST

Tire Alert

POST https://www.roadbays.com/api/v1/TireAlert

Send a low tire pressure reading from your TPMS or telematics system. RoadBays opens a priority 1 case on the unit and, if your account has a tire alert AI assistant set up, calls the phone number on your company profile to report it.

This endpoint takes a JSON body. The unit must already exist in your account. The case is still created if no phone number or AI assistant is set up; the message field tells you whether a call was placed.
bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1/TireAlert' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "vin": "1XPBDP956AD486131",
    "tirePosition": "Rear Right Outer",
    "pressurePsi": 78,
    "thresholdPsi": 95,
    "pressureTrend": "slow leak",
    "assignedUser": 81
  }'
json — response
{
  "caseId": 4188,
  "caseNumber": 52,
  "vapiCallId": "c1f7e2a4-3b9d-4f0e-8a61-2d7c9b5e4a10",
  "message": "Case created and alert call initiated."
}
Body Parameters (JSON)
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstringVIN of an existing unit in RoadBays required
tirePositionstringTire location, e.g. Front Left or Rear Right Outer required
pressurePsidecimalCurrent pressure reading required
thresholdPsidecimalPressure threshold that triggered the alert required
pressureTrendstringShort description, e.g. dropping fast optional
assignedUserintegerUser to assign the case to; defaults to the first active user optional
Billing Workbench

Billing Workbench Overview

A billing workbench groups three documents for one repair: an Estimate, a Work Order, and an Invoice. All three share a documentGroupId and are created together in a single call.

Lines (parts, labor, fees) are added to a specific document by its billingDocumentId. Each line belongs to a section. If you don't pass a section, the line goes into a section named General, which is created if needed.

Moving approved Estimate lines to the Work Order, and Work Order lines to the Invoice, is still done in the RoadBays workbench screen. Lines copied that way are refreshed on every sync, so edit the source line rather than the copy.
Part lines (invoiceLineTypeId=4) on a Work Order that include partId and inventoryLocationId deduct stock when added and restock when deleted. The quantity on those lines can't be changed; delete the line and add it again.
GET

Billing Lookups

GET https://www.roadbays.com/api/v1_Billing/lookups

Returns the IDs you need to build billing requests: document types, line types, statuses, repair reasons, and active inventory locations for your account.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Billing/lookups' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "documentTypes": [
    { "id": 1, "name": "Estimate" },
    { "id": 2, "name": "WorkOrder" },
    { "id": 3, "name": "Invoice" }
  ],
  "lineTypes": [
    { "id": 1, "name": "Labor" },
    { "id": 4, "name": "Part" }
  ],
  "statuses": [
    { "id": 1, "name": "Open" },
    { "id": 2, "name": "Complete" },
    { "id": 3, "name": "Closed" }
  ],
  "repairReasons": [ { "id": 11, "name": "Breakdown" } ],
  "inventoryLocations": [ { "id": 7, "name": "Main Shop" } ]
}
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
GET

List Billing Documents

GET https://www.roadbays.com/api/v1_Billing?startdate={date}&enddate={date}&documentType={type}

Returns Estimates, Work Orders, and Invoices opened within a date range, with their current totals. Filter by document type or case number if needed.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Billing?startdate=9-1-2026&enddate=9-30-2026&documentType=invoice' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 9123,
    "documentGroupId": "3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44",
    "documentTypeId": 3,
    "documentType": "Invoice",
    "documentNumber": "INV-1042",
    "parentDocumentId": 9122,
    "caseNumber": 39,
    "unitsId": 1030,
    "unitNumber": "3345",
    "vin": "1XPBDP956AD486131",
    "statusId": 1,
    "status": "Open",
    "description": "Brake job",
    "poNumber": "PO-7781",
    "repairReasonsId": 11,
    "odometer": 145585,
    "dateCreated": "2026-09-23T14:02:11.12",
    "dateOpened": "2026-09-23T14:02:11.12",
    "dateCompleted": null,
    "dateClosed": null,
    "taxRate": 5.5,
    "laborTotal": 450.00,
    "partsTotal": 312.40,
    "serviceTotal": 0.00,
    "subtotal": 762.40,
    "taxTotal": 41.93,
    "grandTotal": 804.33
  }
]
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
startdateDateTimeStart of the document open date range required
enddateDateTimeEnd of the document open date range, inclusive of the whole day required
documentTypestringestimate, workorder (or wo), or invoice optional
caseNumberintegerOnly documents linked to this case number optional
GET

Get Billing Document

GET https://www.roadbays.com/api/v1_Billing/{billingDocumentId}

Returns one Estimate, Work Order, or Invoice with its sections, line items, and freshly calculated totals.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Billing/9122' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "document": {
    "id": 9122,
    "documentGroupId": "3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44",
    "documentTypeId": 2,
    "documentType": "WorkOrder",
    "documentNumber": "WO-1042",
    "statusId": 1,
    "status": "Open",
    "grandTotal": 804.33
  },
  "sections": [
    { "id": 551, "sectionCode": 1, "title": "Front Brakes", "billable": true, "sectionNotes": null }
  ],
  "lines": [
    {
      "id": 20871,
      "billingDocumentId": 9122,
      "billingSectionId": 551,
      "sectionCode": 1,
      "sectionTitle": "Front Brakes",
      "billable": true,
      "invoiceLineTypeId": 4,
      "invoiceLineTypeName": "Part",
      "vmrsId": null,
      "description": "Brake pad set",
      "partNumber": "BP-4471",
      "partId": 318,
      "inventoryLocationId": 7,
      "quantity": 2.0,
      "chargeAmount": 156.20,
      "totalAmount": 312.40,
      "approved": null,
      "denied": null,
      "deniedComments": null,
      "sourceLineId": 20855,
      "dateCreated": "2026-09-23T14:10:44.02"
    }
  ]
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
billingDocumentIdintegerRoadBays billing document ID required
GET

Get Workbench

GET https://www.roadbays.com/api/v1_Billing/group/{documentGroupId}

Returns the Estimate, Work Order, and Invoice for one workbench, plus a link that opens it in RoadBays.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Billing/group/3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "documentGroupId": "3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44",
  "caseNumber": 39,
  "unitsId": 1030,
  "workbenchUrl": "https://www.roadbays.com/Billing/Workbench?documentGroupId=3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44&caseNumber=39&unitsId=1030",
  "documents": [
    { "id": 9121, "documentType": "Estimate",  "documentNumber": "EST-1042", "status": "Open", "grandTotal": 804.33 },
    { "id": 9122, "documentType": "WorkOrder", "documentNumber": "WO-1042",  "status": "Open", "grandTotal": 804.33 },
    { "id": 9123, "documentType": "Invoice",   "documentNumber": "INV-1042", "status": "Open", "grandTotal": 0.00 }
  ]
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
documentGroupIdguidWorkbench group ID returned by Create Workbench required
POST

Create Workbench

POST https://www.roadbays.com/api/v1_Billing

Creates an Estimate, Work Order, and Invoice for a unit in one call. Identify the unit by vin or, for units without a VIN such as trailers and equipment, by unitsId. The unit must already exist in your RoadBays account. Pass a caseId or caseNumber to link the workbench to an existing case. The tax rate is filled in from your account settings unless you send one.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Billing' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'vin=1XPBDP956AD486131' \
  --data-urlencode 'caseNumber=39' \
  --data-urlencode 'description=Brake job' \
  --data-urlencode 'poNumber=PO-7781' \
  --data-urlencode 'repairReasonsId=11' \
  --data-urlencode 'odometer=145585'
json — response (201 Created)
{
  "documentGroupId": "3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44",
  "caseNumber": 39,
  "unitsId": 1030,
  "workbenchUrl": "https://www.roadbays.com/Billing/Workbench?documentGroupId=3f2a9c1e-6b7d-4e21-9a0c-2d5f8b7e1c44&caseNumber=39&unitsId=1030",
  "documents": [
    { "id": 9121, "documentTypeId": 1, "documentType": "Estimate",  "documentNumber": "EST-1042", "statusId": 1, "status": "Open", "taxRate": 5.5, "grandTotal": 0.00 },
    { "id": 9122, "documentTypeId": 2, "documentType": "WorkOrder", "documentNumber": "WO-1042",  "statusId": 1, "status": "Open", "taxRate": 5.5, "grandTotal": 0.00 },
    { "id": 9123, "documentTypeId": 3, "documentType": "Invoice",   "documentNumber": "INV-1042", "statusId": 1, "status": "Open", "taxRate": 5.5, "grandTotal": 0.00 }
  ]
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstringVIN of an existing unit; required if no unitsId
unitsIdintegerRoadBays unit ID from List Units; required if no vin
caseIdintegerRoadBays case ID to link optional
caseNumberintegerCase number to link, if you don't have the case ID optional
descriptionstringRepair description, applied to all three documents optional
poNumberstringPurchase order number optional
repairReasonsIdintegerID from Billing Lookups or Repair Reasons optional
odometerintegerOdometer reading; also updates the unit if higher than its current mileage optional
taxRatedecimalTax percentage (e.g. 5.5); defaults to your account rate optional
POST

Add Line

POST https://www.roadbays.com/api/v1_Billing/{billingDocumentId}/lines

Adds a part, labor, or fee line to an Estimate, Work Order, or Invoice. Lines added to an Estimate start as not approved. Totals are recalculated automatically.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Billing/9122/lines' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'invoiceLineTypeId=4' \
  --data-urlencode 'description=Brake pad set' \
  --data-urlencode 'quantity=2' \
  --data-urlencode 'chargeAmount=156.20' \
  --data-urlencode 'partNumber=BP-4471' \
  --data-urlencode 'partId=318' \
  --data-urlencode 'inventoryLocationId=7' \
  --data-urlencode 'sectionTitle=Front Brakes' \
  --data-urlencode 'sectionCode=1'
json — response (201 Created)
{
  "id": 20871,
  "billingDocumentId": 9122,
  "billingSectionId": 551,
  "sectionCode": 1,
  "sectionTitle": "Front Brakes",
  "billable": true,
  "invoiceLineTypeId": 4,
  "invoiceLineTypeName": "Part",
  "description": "Brake pad set",
  "partNumber": "BP-4471",
  "partId": 318,
  "inventoryLocationId": 7,
  "quantity": 2.0,
  "chargeAmount": 156.20,
  "totalAmount": 312.40,
  "approved": null,
  "denied": null,
  "dateCreated": "2026-09-23T14:10:44.02"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
billingDocumentIdintegerIn the URL path: the Estimate, Work Order, or Invoice ID required
invoiceLineTypeIdintegerLine type ID from Billing Lookups required
descriptionstringLine description required
quantitydecimalQuantity or hours; defaults to 1 optional
chargeAmountdecimalUnit price or hourly rate optional
partNumberstringPart number shown on the document optional
partIdintegerRoadBays part ID; send with inventoryLocationId optional
inventoryLocationIdintegerLocation to pull stock from; send with partId optional
vmrsIdintegerVMRS code ID optional
billingSectionIdintegerExisting section on this document optional
sectionTitlestringSection to find or create when no billingSectionId is sent; defaults to General optional
sectionCodeintegerSort order for a new section optional
sectionBillableboolWhether a new section is billable; defaults to true optional
PUT

Update Line

PUT https://www.roadbays.com/api/v1_Billing/lines/{lineId}

Updates a line's type, description, quantity, or price. Only the fields you send are changed. The part and inventory location can't be edited, and neither can the quantity on inventory-linked lines; delete the line and add it again instead.

bash
curl --location --request PUT \
  'https://www.roadbays.com/api/v1_Billing/lines/20872' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'quantity=3.5' \
  --data-urlencode 'chargeAmount=135.00'
json — response
{
  "id": 20872,
  "billingDocumentId": 9122,
  "billingSectionId": 551,
  "invoiceLineTypeId": 1,
  "invoiceLineTypeName": "Labor",
  "description": "Replace front pads and rotors",
  "quantity": 3.5,
  "chargeAmount": 135.00,
  "totalAmount": 472.50
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
lineIdintegerIn the URL path: the line ID required
invoiceLineTypeIdintegerNew line type optional
descriptionstringNew description optional
quantitydecimalNew quantity or hours optional
chargeAmountdecimalNew unit price or rate optional
DELETE

Delete Line

DELETE https://www.roadbays.com/api/v1_Billing/lines/{lineId}

Removes a line from its document. Part lines on a Work Order are returned to inventory automatically.

bash
curl --location --request DELETE \
  'https://www.roadbays.com/api/v1_Billing/lines/20871' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{ "ok": true, "lineId": 20871 }
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
lineIdintegerRoadBays line ID required
GET

Get Work Order PMs

GET https://www.roadbays.com/api/v1_Billing/{workOrderDocumentId}/pm-schedules

Returns the preventive maintenance schedules that have been completed on a Work Order.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Billing/9122/pm-schedules' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "workOrderDocumentId": 9122,
  "selectedPmScheduleIds": [ 214, 215 ],
  "history": [
    { "pmScheduleId": 214, "serviceDate": "2026-09-23T15:30:00", "mileageAtService": 145585, "notes": "Completed via API WO-1042" },
    { "pmScheduleId": 215, "serviceDate": "2026-09-23T15:30:00", "mileageAtService": 145585, "notes": "Completed via API WO-1042" }
  ]
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
workOrderDocumentIdintegerWork Order billing document ID required
POST

Complete PMs on a Work Order

POST https://www.roadbays.com/api/v1_Billing/{workOrderDocumentId}/pm-schedules

Records that the Work Order serviced one or more PM schedules for its unit. Each schedule's last service date and mileage are updated, and its next due mileage or date is moved forward by the PM interval.

Each call replaces the PM list for that Work Order, so send every schedule it covers. The service date is the Work Order's completed date, then its closed date, then today. The mileage is the Work Order's odometer, or the unit's current mileage if the Work Order has none.
bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Billing/9122/pm-schedules' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{ "pmScheduleIds": [214, 215] }'
json — response
{
  "workOrderDocumentId": 9122,
  "completedCount": 2,
  "schedules": [
    { "pmScheduleId": 214, "lastServiceDate": "2026-09-23T15:30:00", "lastServiceOdometer": 145585, "nextDueDate": null, "nextDueMileage": 160585 },
    { "pmScheduleId": 215, "lastServiceDate": "2026-09-23T15:30:00", "lastServiceOdometer": 145585, "nextDueDate": "2026-12-22T15:30:00", "nextDueMileage": null }
  ]
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
workOrderDocumentIdintegerIn the URL path: the Work Order billing document ID required
pmScheduleIdsinteger[]PM schedule IDs for the Work Order's unit required
Resources
GET

List Repair Reasons

GET https://www.roadbays.com/api/v1_RepairReasons

Returns all repair reasons configured for your account. Use the returned id values when creating cases.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_RepairReasons' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  { "id": 11, "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192", "inactive": 0, "dateCreated": "2021-08-20T11:01:30.07", "name": "Breakdown", "notes": null },
  { "id": 12, "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192", "inactive": 0, "dateCreated": "2021-08-20T11:01:33.757", "name": "Driver Abuse", "notes": null },
  { "id": 13, "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192", "inactive": 0, "dateCreated": "2021-08-20T11:01:37.433", "name": "Accident", "notes": null }
]
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
GET

List Users

GET https://www.roadbays.com/api/v1_CustomerUsers

Returns all users registered to your account. Use the returned id as the assignedUser value when creating cases.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_CustomerUsers' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 81,
    "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
    "inactive": 0,
    "dateCreated": "2021-08-20T11:00:10",
    "userTypesId": 2,
    "email": "demo@roadbays.com",
    "firstName": "Demo",
    "lastName": "User"
  }
]
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
GET

Get User

GET https://www.roadbays.com/api/v1_CustomerUsers/{userId}

Returns a single user on your account by ID.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_CustomerUsers/81' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "id": 81,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "inactive": 0,
  "dateCreated": "2021-08-20T11:00:10",
  "userTypesId": 2,
  "email": "demo@roadbays.com",
  "firstName": "Demo",
  "lastName": "User"
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
userIdintegerUser ID from List Users required
Drivers
GET

List Drivers

GET https://www.roadbays.com/api/v1_Drivers

Returns all drivers registered to your account.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Drivers' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 1011,
    "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
    "inactive": 0,
    "dateCreated": "2022-02-21T05:32:48.15",
    "firstName": "Demo",
    "lastName": "User",
    "email": "demo@roadbays.com",
    "employeeId": "111111",
    "balance": "1000",
    "phone": "9203141144"
  }
]
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
POST

Create Driver

POST https://www.roadbays.com/api/v1_Drivers

Register a new driver to your RoadBays account. First name, last name, and email are required.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Drivers' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'firstName=Demo' \
  --data-urlencode 'lastName=User' \
  --data-urlencode 'email=demo@roadbays.com' \
  --data-urlencode 'phone=9203141144' \
  --data-urlencode 'employeeId=1111111' \
  --data-urlencode 'balance=1000'
json — response
{
  "id": 1011,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "inactive": 0,
  "dateCreated": "2022-02-21T05:32:48.15",
  "firstName": "Demo",
  "lastName": "User",
  "email": "demo@roadbays.com",
  "employeeId": "111111",
  "balance": "1000",
  "phone": "9203141144"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
firstNamestringDriver first name required
lastNamestringDriver last name required
emailstringDriver email address required
phonestringPhone number optional
employeeIdstringInternal employee identifier optional
balancestringAccount balance optional
Units
GET

List Units

GET https://www.roadbays.com/api/v1_Units

Returns all fleet assets (units) registered to your account.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Units' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 1030,
    "dateCreated": "2021-08-20T11:04:50.503",
    "inactive": 0,
    "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
    "unitNumber": "3345",
    "description": "Mack Truck",
    "unitTypesId": 1014,
    "serialNo": "1XAPDP9X0PD486131",
    "engine": "MP8",
    "engineManufacturer": "MACK",
    "unitMake": "MACK",
    "unitModel": "Anthem",
    "modelYear": "2020"
  }
]
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
GET

Get Unit

GET https://www.roadbays.com/api/v1_Units/{unitId}

Retrieve full details for a single unit by its RoadBays system-generated ID.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_Units/1030' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
{
  "id": 1030,
  "dateCreated": "2021-08-20T11:04:50.503",
  "inactive": 0,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "unitNumber": "3345",
  "description": "Mack Truck",
  "unitTypesId": 1014,
  "serialNo": "1XAPDP9X0PD486131",
  "engine": "MP8",
  "engineManufacturer": "MACK",
  "unitMake": "MACK",
  "unitModel": "Anthem",
  "modelYear": "2020"
}
Path Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
unitIdintegerRoadBays system-generated unit ID required
POST

Create Unit

POST https://www.roadbays.com/api/v1_Units

Add a new fleet asset to your account. Vehicle specs are automatically decoded from the VIN via NHTSA.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Units' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'vin=1XPCEP6Y0JD486131' \
  --data-urlencode 'unitNumber=12345' \
  --data-urlencode 'unitTypeId=1001' \
  --data-urlencode 'license=1XY23Z45'
json — response
{
  "id": 1030,
  "dateCreated": "2021-08-20T11:04:50.503",
  "inactive": 0,
  "accountGUID": "b5b1032a-6336-4d51-c1z3-bad295795192",
  "unitNumber": "12345",
  "unitTypesId": 1001,
  "serialNo": "1XPCEP6Y0JD486131",
  "license": "1XY23Z45",
  "unitMake": "PETERBILT",
  "unitModel": "389",
  "modelYear": "2019"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstring17-character vehicle VIN required
unitTypeIdintegerRoadBays unit type ID required
unitNumberstringYour internal unit/fleet number required
licensestringLicense plate number optional
GET

List Fault Codes

GET https://www.roadbays.com/api/v1_FaultCodes?serialNo={vin}

Returns every fault code recorded for a unit, by VIN.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_FaultCodes?serialNo=1XPCEP6Y0JD486131' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "id": 68139,
    "externalId": "367423",
    "dateCreated": "2022-03-21T15:15:09",
    "inactive": 0,
    "accountGUID": "b6b1032b-3150-4c51-2548-f7b3b7a8e9f70",
    "unitsId": 3379,
    "caseId": 5141,
    "serialNo": "1XPCEP6Y0JD486131",
    "code": "P1401",
    "codeDescription": "Crankcase Air Pressure",
    "source": "Crankcase",
    "platform": "api",
    "status": "open",
    "firstObserved": "3/21/2022 3:15:09 PM",
    "lastObserved": "3/21/2022 3:15:09 PM"
  }
]
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
serialNostringVIN of the unit required
POST

Create Fault Code

POST https://www.roadbays.com/api/v1_FaultCodes

Push DTC fault codes into RoadBays from your telematics provider. Codes are matched to the asset by VIN and linked to open cases automatically.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_FaultCodes' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'vin=1XPCEP6Y0JD486131' \
  --data-urlencode 'code=P1401' \
  --data-urlencode 'codeDescription=Crankcase Air Pressure' \
  --data-urlencode 'status=open' \
  --data-urlencode 'source=Crankcase' \
  --data-urlencode 'platform=api' \
  --data-urlencode 'externalId=367423'
json — response
{
  "id": 68139,
  "externalId": "367423",
  "dateCreated": "2022-03-21T15:15:09",
  "inactive": 0,
  "accountGUID": "b6b1032b-3150-4c51-2548-f7b3b7a8e9f70",
  "units": null,
  "unitsId": 3379,
  "caseId": 5141,
  "serialNo": "1XPCEP6Y0JD486131",
  "code": "P1401",
  "codeDescription": "Crankcase Air Pressure",
  "source": "Crankcase",
  "platform": "api",
  "status": "open",
  "firstObserved": "3/21/2022 3:15:09 PM",
  "lastObserved": "3/21/2022 3:15:09 PM"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstringVIN of the unit in RoadBays required
codestringDTC fault code (e.g. P1401) required
codeDescriptionstringHuman-readable description of the code optional
platformstringLabel of originating platform (e.g. Samsara) optional
statusstringopen or closed optional
sourcestringSource bus or system of the code optional
externalIdstringYour external ID — use to update status later optional
PUT

Update Fault Code

PUT https://www.roadbays.com/api/v1_FaultCodes

Update the status of an existing fault code. Identify the record using either the RoadBays internal id or the externalId assigned at creation. One of the two is required.

bash
curl --location --request PUT \
  'https://www.roadbays.com/api/v1_FaultCodes' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'id=145585' \
  --data-urlencode 'externalId=1455a58s45' \
  --data-urlencode 'status=closed'
json — response
{
  "id": 68139,
  "externalId": "1455a58s45",
  "dateCreated": "2022-03-21T15:15:09",
  "inactive": 0,
  "accountGUID": "b6b1032b-3150-4c51-2548-f7b3b7a8e9f70",
  "unitsId": 3379,
  "caseId": 5141,
  "serialNo": "23TYG1EG0GFA91368",
  "code": "P054A",
  "codeDescription": "Cold Start B Camshaft Position Timing Over-Advanced Bank 1",
  "source": "CANBUS_SECONDARY_PASSENGER_15765",
  "platform": null,
  "status": "closed",
  "firstObserved": "3/20/2022 4:13:01 PM",
  "lastObserved": "3/20/2022 4:13:01 PM"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
idintegerRoadBays internal fault code ID — required if no externalId
externalIdstringYour external ID — required if no id
statusstringOpen or Closed required
POST

Update Mileage

POST https://www.roadbays.com/api/v1_Mileage

Push updated mileage for a unit by VIN. The mileage value must be greater than the current recorded value to update correctly.

bash
curl --location --request POST \
  'https://www.roadbays.com/api/v1_Mileage' \
  --header 'Authorization: Bearer YOUR_API_KEY' \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'vin=1XPCEP6Y0JD486131' \
  --data-urlencode 'mileage=145585'
json — response
{
  "id": 68139,
  "dateCreated": "2022-03-21T15:15:09",
  "inactive": 0,
  "accountGUID": "b6b1032b-3150-4c51-2548-f7b3b7a8e9f70",
  "unitsId": 3379,
  "caseId": 0,
  "serialNo": "1XPCEP6Y0JD486131",
  "mileage": "145585"
}
Body Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstringVIN of the unit to update required
mileagestringMust be greater than current recorded mileage required
Preventive Maintenance
GET

List PM Schedules

GET https://www.roadbays.com/api/v1_PmSchedules?vin={vin}&dueOnly=true

Returns PM schedules with how many miles and days remain and a due status. Filter to one unit by vin or unitsId, or leave both out to see the whole fleet. Results are sorted with overdue items first.

status is Overdue, DueSoon, OK, or NotScheduled (no next due mileage or date yet). A schedule is due soon when it is within dueSoonMiles or dueSoonDays of coming due. To mark a PM as done, use Complete PMs on a Work Order.
bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_PmSchedules?vin=1XPBDP956AD486131&dueOnly=true' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  {
    "pmScheduleId": 214,
    "unitsId": 1030,
    "unitNumber": "3345",
    "vin": "1XPBDP956AD486131",
    "currentMileage": 159900,
    "pmTaskId": 12,
    "pmTaskName": "Oil & Filter Change",
    "pmTaskDescription": "Engine oil, oil filter, fuel filters",
    "intervalType": "Miles",
    "intervalValue": 15000,
    "lastServiceDate": "2026-06-02T14:20:00",
    "lastServiceOdometer": 145585,
    "nextDueDate": null,
    "nextDueMileage": 160585,
    "milesRemaining": 685,
    "daysRemaining": null,
    "status": "DueSoon"
  }
]
Query Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
vinstringOnly schedules for this unit optional
unitsIdintegerOnly schedules for this unit; used instead of vin when both are sent optional
dueOnlyboolReturn only Overdue and DueSoon items; default false optional
dueSoonMilesintegerMiles-before-due window for DueSoon; default 1000 optional
dueSoonDaysintegerDays-before-due window for DueSoon; default 14 optional
GET

List PM Tasks

GET https://www.roadbays.com/api/v1_PmSchedules/tasks

Returns the PM task list for your account, including RoadBays system tasks, with each task's interval.

bash
curl --location --request GET \
  'https://www.roadbays.com/api/v1_PmSchedules/tasks' \
  --header 'Authorization: Bearer YOUR_API_KEY'
json — response
[
  { "id": 12, "name": "Oil & Filter Change", "description": "Engine oil, oil filter, fuel filters", "intervalType": "Miles", "intervalValue": 15000, "systemTask": false },
  { "id": 3,  "name": "DOT Annual Inspection", "description": null, "intervalType": "Days", "intervalValue": 365, "systemTask": true }
]
Parameters
ParameterTypeDescription
AuthorizationstringBearer token API key required
Reference

Error Codes

The RoadBays API uses standard HTTP status codes. Errors return a JSON body with a message field describing the issue.

CodeMeaning
400 Bad Request — A required parameter is missing or invalid. The message field explains what to fix.
401 Unauthorized — Verify your Bearer token is correct and included in the Authorization header.
403 Forbidden — Your API key is missing, invalid, or does not have permission to access this endpoint.
404 Not Found — The requested resource ID does not exist. Verify the ID and try again.
429 Too Many Requests. The rate limit has been exceeded. Pause and retry after the interval given in the Retry-After header.
500 Internal Server Error — An unexpected server error occurred. Please try again later.
503 Service Unavailable — The API is temporarily offline for maintenance. Please try again later.