API GuidesIntegrationsOverview

Integrations

SALLY’s integration framework connects your fleet operations with external services — ELD providers for HOS data, TMS platforms for load management, fuel price feeds, and weather services. Integrations run as managed adapters that SALLY syncs on your behalf.

Supported Vendors

SALLY provides pre-built adapters for the following vendor categories:

CategoryVendorAdapterData Provided
ELD / HOSSamsarasamsaraReal-time driver HOS, vehicle location, diagnostics
TMSMcLeodmcleodLoad data, dispatch assignments, customer info
TMSProject44project44Shipment visibility, ETA predictions, tracking
FuelGasBuddygasbuddyReal-time fuel prices by station and location
WeatherOpenWeatheropenweatherCurrent conditions, forecasts, severe weather alerts

Integration Lifecycle

Every integration follows a standard lifecycle:

StatusDescription
CONFIGUREDIntegration created with credentials, not yet tested
TESTINGConnection test in progress
ACTIVEIntegration is live and syncing data
SYNCINGA data sync is currently in progress
DISABLEDIntegration is paused (credentials preserved)
ERRORLast sync or test failed (check error details)

List Integrations

View all configured integrations for your tenant:

curl https://sally-api.apps.appshore.in/api/v1/integrations \
  -H "X-API-Key: $SALLY_API_KEY"

JavaScript (fetch):

const response = await fetch(
  "https://sally-api.apps.appshore.in/api/v1/integrations",
  {
    headers: { "X-API-Key": process.env.SALLY_API_KEY },
  }
);
 
const { data: integrations } = await response.json();

Response:

{
  "data": [
    {
      "id": "int_s1a2m3s4",
      "vendor": "samsara",
      "category": "ELD",
      "name": "Samsara ELD",
      "status": "ACTIVE",
      "lastSyncAt": "2026-02-10T16:00:00Z",
      "nextSyncAt": "2026-02-10T16:15:00Z",
      "syncIntervalMinutes": 15,
      "createdAt": "2026-01-15T10:00:00Z"
    },
    {
      "id": "int_g5b6u7d8",
      "vendor": "gasbuddy",
      "category": "FUEL",
      "name": "GasBuddy Fuel Prices",
      "status": "ACTIVE",
      "lastSyncAt": "2026-02-10T12:00:00Z",
      "nextSyncAt": "2026-02-10T18:00:00Z",
      "syncIntervalMinutes": 360,
      "createdAt": "2026-01-20T14:00:00Z"
    }
  ]
}

Vendor Registry

Retrieve the complete list of supported vendors and their configuration requirements:

curl https://sally-api.apps.appshore.in/api/v1/integrations/vendors \
  -H "X-API-Key: $SALLY_API_KEY"

JavaScript (fetch):

const response = await fetch(
  "https://sally-api.apps.appshore.in/api/v1/integrations/vendors",
  {
    headers: { "X-API-Key": process.env.SALLY_API_KEY },
  }
);
 
const { data: vendors } = await response.json();

Response:

{
  "data": [
    {
      "vendor": "samsara",
      "name": "Samsara",
      "category": "ELD",
      "description": "Electronic Logging Device and fleet telematics",
      "requiredFields": ["apiToken"],
      "optionalFields": ["orgId", "syncIntervalMinutes"],
      "defaultSyncInterval": 15,
      "documentationUrl": "https://developers.samsara.com"
    },
    {
      "vendor": "mcleod",
      "name": "McLeod Software",
      "category": "TMS",
      "description": "Transportation Management System",
      "requiredFields": ["apiUrl", "apiKey", "companyId"],
      "optionalFields": ["syncIntervalMinutes"],
      "defaultSyncInterval": 30
    },
    {
      "vendor": "project44",
      "name": "project44",
      "category": "TMS",
      "description": "Advanced visibility and tracking platform",
      "requiredFields": ["clientId", "clientSecret"],
      "optionalFields": ["environment", "syncIntervalMinutes"],
      "defaultSyncInterval": 15
    },
    {
      "vendor": "gasbuddy",
      "name": "GasBuddy",
      "category": "FUEL",
      "description": "Real-time fuel price data",
      "requiredFields": ["apiKey"],
      "optionalFields": ["searchRadiusMiles", "syncIntervalMinutes"],
      "defaultSyncInterval": 360
    },
    {
      "vendor": "openweather",
      "name": "OpenWeather",
      "category": "WEATHER",
      "description": "Weather data and severe weather alerts",
      "requiredFields": ["apiKey"],
      "optionalFields": ["syncIntervalMinutes"],
      "defaultSyncInterval": 60
    }
  ]
}

Create an Integration

Configure a new integration by providing vendor credentials:

curl -X POST https://sally-api.apps.appshore.in/api/v1/integrations \
  -H "X-API-Key: $SALLY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "vendor": "samsara",
    "name": "Samsara ELD - Production",
    "config": {
      "apiToken": "samsara_api_XXXXXXXXXXXXXXXXXXXX",
      "orgId": "org_12345"
    },
    "syncIntervalMinutes": 15
  }'

JavaScript (fetch):

const response = await fetch(
  "https://sally-api.apps.appshore.in/api/v1/integrations",
  {
    method: "POST",
    headers: {
      "X-API-Key": process.env.SALLY_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      vendor: "samsara",
      name: "Samsara ELD - Production",
      config: {
        apiToken: "samsara_api_XXXXXXXXXXXXXXXXXXXX",
        orgId: "org_12345",
      },
      syncIntervalMinutes: 15,
    }),
  }
);
 
const integration = await response.json();

Response:

{
  "id": "int_s1a2m3s4",
  "vendor": "samsara",
  "category": "ELD",
  "name": "Samsara ELD - Production",
  "status": "CONFIGURED",
  "syncIntervalMinutes": 15,
  "createdAt": "2026-02-10T10:00:00Z"
}

Credentials are encrypted at rest and never returned in API responses after creation.

Test a Connection

Before activating an integration, test that the credentials work:

curl -X POST https://sally-api.apps.appshore.in/api/v1/integrations/int_s1a2m3s4/test \
  -H "X-API-Key: $SALLY_API_KEY"

Response (success):

{
  "id": "int_s1a2m3s4",
  "testResult": "SUCCESS",
  "message": "Successfully connected to Samsara API. Found 12 vehicles and 8 drivers.",
  "details": {
    "vehiclesFound": 12,
    "driversFound": 8,
    "apiVersion": "v1",
    "latency": "245ms"
  },
  "testedAt": "2026-02-10T10:01:00Z"
}

Response (failure):

{
  "id": "int_s1a2m3s4",
  "testResult": "FAILED",
  "message": "Authentication failed. The provided API token is invalid or expired.",
  "error": {
    "code": "AUTH_FAILED",
    "details": "Samsara API returned 401 Unauthorized"
  },
  "testedAt": "2026-02-10T10:01:00Z"
}

If the test passes, the integration status automatically changes to ACTIVE and the first data sync begins.

Trigger a Manual Sync

Force an immediate data sync outside the scheduled interval:

curl -X POST https://sally-api.apps.appshore.in/api/v1/integrations/int_s1a2m3s4/sync \
  -H "X-API-Key: $SALLY_API_KEY"

Response:

{
  "id": "int_s1a2m3s4",
  "status": "SYNCING",
  "syncStartedAt": "2026-02-10T16:05:00Z",
  "message": "Sync initiated. This may take a few minutes depending on data volume."
}

How Data Flows

When an integration syncs, data flows into SALLY and is used by the planning and monitoring engines:

IntegrationData SyncedUsed By
Samsara (ELD)Driver HOS hours, vehicle locations, diagnosticsRoute planner (HOS validation), monitoring (HOS alerts, vehicle position)
McLeod (TMS)Loads, customers, dispatch assignmentsLoad management, route planning
Project44 (TMS)Shipment tracking, ETA visibilityMonitoring (schedule alerts)
GasBuddy (Fuel)Fuel prices by stationRoute planner (fuel stop optimization)
OpenWeatherWeather conditions, forecasts, alertsMonitoring (weather alerts), route planner (weather-adjusted ETAs)

Guides in This Section