# fsm-sdk

> Node.JS sdk to interface with SAP Field Service Management APIs.

Latest version **4.0.0** (published 2025-12-16) · Apache-2.0 license · 0 weekly downloads

## Install

```sh
npm install fsm-sdk
pnpm add fsm-sdk
yarn add fsm-sdk
bun add fsm-sdk
```

## Health

**Score 55/100 (C)** — status: stable.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

## Facts

| | |
|---|---|
| Version | 4.0.0 |
| Published | 2025-12-16 |
| First published | 2018-08-31 |
| Weekly downloads | 0 |
| License | Apache-2.0 |
| TypeScript types | bundled |
| Module format | CommonJS |
| Node | >=23 |
| Dependencies | 3 |
| Unpacked size | 265.4 KB |
| Known vulnerabilities | 0 (+1 in 1 direct dependencies) |
| Install scripts | no |
| GitHub stars | 7 |
| Author | SAP SE or an SAP affiliate company - Simon Gausmann |
| Maintainers | gausim |
| Keywords | SAP Field Service Management SDK, SAP FSM, sdk, nodejs, integration, customisation, query-api, data-api, batch-api |

## Links

- npm: https://www.npmjs.com/package/fsm-sdk
- Repository: https://github.com/sap/fsm-sdk
- Homepage: https://github.com/sap/fsm-sdk#readme
- Issues: https://github.com/sap/fsm-sdk/issues
- npm.io page: https://npm.io/package/fsm-sdk

## Dependencies (3)

- [uuid](https://npm.io/package/uuid.md) ^8.3.2
- [jwt-decode](https://npm.io/package/jwt-decode.md) ^4.0.0
- [isomorphic-fetch](https://npm.io/package/isomorphic-fetch.md) ^3.0.0

## Alternatives

- [gamedig](https://npm.io/package/gamedig.md) — 29.3K weekly downloads
- [join-monster](https://npm.io/package/join-monster.md) — 12.8K weekly downloads
- [masked](https://npm.io/package/masked.md) — 5.5K weekly downloads
- [@comunica/actor-query-process-explain-logical](https://npm.io/package/@comunica/actor-query-process-explain-logical.md) — 4.7K weekly downloads
- [@veracity/vui](https://npm.io/package/@veracity/vui.md) — 4.6K weekly downloads

## Recent versions

- 4.0.0 (latest) — 2025-12-16
- 3.0.0 — 2025-07-22
- 2.1.1 — 2021-10-13
- 2.1.0 — 2021-09-17
- 2.0.1 — 2021-08-06
- 2.0.0 — 2021-07-27
- 1.2.4 — 2021-03-25
- 1.2.3 — 2021-03-17
- 1.2.2 — 2021-01-15
- 1.2.1 — 2021-01-15
- 1.2.0 — 2021-01-15
- 1.0.1 — 2020-12-09
- 1.0.0-rc10 — 2020-03-31
- 1.0.0-rc9 — 2020-03-31
- 1.0.0-rc8 — 2020-03-31
- … 7 more at https://npm.io/package/fsm-sdk/versions

## README

# SAP Field Service Management SDK 

[![npm version](https://badge.fury.io/js/fsm-sdk.svg)](https://badge.fury.io/js/fsm-sdk) ![integration test](https://github.com/SAP/fsm-sdk/workflows/integration%20test/badge.svg) [![REUSE status](https://api.reuse.software/badge/github.com/SAP/fsm-sdk)](https://api.reuse.software/info/github.com/SAP/fsm-sdk) ![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/GauSim/ef8d97285399b9ccfd8acf9e0796cd16/raw/fsm-sdk-badge.json) 

---

## JavaScript SDK to Interface with SAP Field Service Management APIs and Services.
Find more documentation and related information at [SAP Field Service Management Documentation](https://help.sap.com/viewer/product/SAP_FIELD_SERVICE_MANAGEMENT/Cloud/en-US)


- [SAP Field Service Management SDK](#sap-field-service-management-sdk)
  - [JavaScript SDK to Interface with SAP Field Service Management APIs and Services.](#javascript-sdk-to-interface-with-sap-field-service-management-apis-and-services)
  - [Getting started](#getting-started)
    - [Examples](#examples)
  - [CoreAPIClient](#coreapiclient)
    - [Authentication & Token Management](#authentication--token-management)
    - [Account API](#account-api)
    - [Service Management API](#service-management-api)
      - [Activity Business Actions](#activity-business-actions)
      - [Activity Bulk Business Actions](#activity-bulk-business-actions)
    - [Query for objects using CoreSQL](#query-for-objects-using-coresql)
    - [CRUD object](#crud-object)
      - [Create a new object](#create-a-new-object)
      - [Read object by id](#read-object-by-id)
      - [Update object (providing full new version)](#update-object-providing-full-new-version)
      - [Update object (providing only fields to change)](#update-object-providing-only-fields-to-change)
      - [Delete object](#delete-object)
        - [lastChanged](#lastchanged)
      - [Batch Actions (Transactions)](#batch-actions-transactions)
  - [Support](#support)
  - [License](#license)


## Getting started

install from NPM
```bash
npm i fsm-sdk --save
```

using the sdk in NodeJS with credentials:
```typescript
const fsm = require('fsm-sdk');

const client = new fsm.CoreAPIClient({

  // [mandatory] your client configuration
  clientIdentifier: '<your-clientIdentifier>',
  clientSecret: '<your-clientSecret>',
  clientVersion: '<your-clientVersion>',

  // [optional] oauth grant type, default=password
  authGrantType: 'password' | 'client_credentials' | undefined

  // [optional] | [mandatory] if oauth grant type password
  authAccountName: '<your-authAccountName>',

  // [optional] | [mandatory] if oauth grant type password
  authUserName: '<your-authUserName>',

  // [optional] | [mandatory] if oauth grant type password
  authPassword: '<your-authPassword>',

  // [optional] or default=FIRST
  authCompany: '<your-authCompany>',

  // [optional] provide verbose logs
  debug: false,

  // [optional] enable using custom oauth endpoints
  oauthEndpoint: 'https://eu.fsm.cloud.sap/api/oauth2/v2',

  // [optional] client will cache token (helpful for writing integration tests)
  tokenCacheFilePath: './.myToken.json'

});
```

related doc's:
- [Field Service Management - Integration Guidelines](https://help.sap.com/viewer/fsm_integration_guidelines/Cloud/en-US/integration-guidelines-intro.html)
- [Access API (OAuth 2.0)](https://help.sap.com/viewer/fsm_access_api/Cloud/en-US)
- [Generating Client ID and Secret](https://help.sap.com/viewer/fsm_admin/Cloud/en-US/generating-client-id.html)

### Examples 
Some illustrative cases are provided in the [examples](./examples) folder.


---

## CoreAPIClient

The CoreAPIClient API actions will return a Promise and is asynchronous by default.

### Authentication & Token Management

```typescript
// Login explicitly (optional - auto-login happens on first API call)
await client.login();

// Get current OAuth token
const token = client.getToken();

// Set OAuth token manually
client.setToken(token);

// Set authentication company (for multi-company tokens)
client.setAuthCompany('COMPANY_NAME');
```

### Account API

Access account and company information:

```typescript
// Get all accessible accounts
const accounts = await client.accountAPI.getAccounts();

// Get companies by account ID
const companies = await client.accountAPI.getCompaniesByAccount(accountId);
```

### Service Management API

The Service Management API provides access to activities, service calls, and composite operations.

#### Activity Business Actions

Perform business actions on individual activities:

```typescript
// Cancel an activity
await client.serviceManagementAPI.activity.cancel('activity-id', {
  cancelServiceCallConfirmed: true,
  cancellationReason: 'Customer request'
});

// Close an activity
await client.serviceManagementAPI.activity.close('activity-id', {
  udfValues: [{ name: 'customField', value: 'completed' }]
});

// Duplicate an activity
await client.serviceManagementAPI.activity.duplicate('activity-id', {
  crew: 'crew-id',
  responsibles: ['tech-1', 'tech-2'],
  startDateTime: '2025-01-15T09:00:00Z'
});

// Plan an activity
await client.serviceManagementAPI.activity.plan('activity-id', {
  technician: { id: 'technician-id' },
  startDateTime: '2025-01-15T09:00:00Z',
  plannedDurationInMinutes: 120,
  travelTimeFromInMinutes: 15,
  travelTimeToInMinutes: 15
});

// Release an activity
await client.serviceManagementAPI.activity.release('activity-id', {
  udfValues: []
});

// Replan an activity
await client.serviceManagementAPI.activity.replan('activity-id', {
  technician: { id: 'technician-id' },
  startDateTime: '2025-01-16T09:00:00Z',
  plannedDurationInMinutes: 90
});

// Reschedule an activity
await client.serviceManagementAPI.activity.reschedule('activity-id', {
  technician: { id: 'technician-id' },
  startDateTime: '2025-01-17T09:00:00Z',
  plannedDurationInMinutes: 120
});
```

#### Activity Bulk Business Actions

Perform business actions on multiple activities at once:

```typescript
// Cancel multiple activities in bulk
await client.serviceManagementAPI.activity.bulk.cancel([
  { id: 'activity-1', cancellationReason: 'Weather conditions' },
  { id: 'activity-2', cancellationReason: 'Customer cancellation' }
]);

// Plan multiple activities in bulk
await client.serviceManagementAPI.activity.bulk.plan([
  {
    id: 'activity-1',
    technician: { id: 'tech-1' },
    startDateTime: '2025-01-15T09:00:00Z',
    plannedDurationInMinutes: 90
  },
  {
    id: 'activity-2',
    technician: { id: 'tech-2' },
    startDateTime: '2025-01-15T11:00:00Z',
    plannedDurationInMinutes: 120
  }
]);

// Duplicate multiple activities in bulk
await client.serviceManagementAPI.activity.bulk.duplicate([
  {
    id: 'activity-1',
    startDateTime: '2025-01-20T09:00:00Z',
    crew: 'crew-id'
  }
]);
```

#### Service Call Business Actions

Perform business actions on service calls:

```typescript
// Cancel a service call
await client.serviceManagementAPI.serviceCall.cancel('service-call-id', {
  cancellationReason: 'Customer request'
});

// Mark service call as technically complete
await client.serviceManagementAPI.serviceCall.technicallyComplete('service-call-id');
```

#### Composite Operations

Work with service calls and their nested activities:

```typescript
// Create service call with activities (tree structure)
const serviceCall = await client.serviceManagementAPI.composite.tree.postServiceCall({
  subject: 'Installation Service',
  businessPartner: { id: 'bp-id' },
  activities: [{
    subject: 'Installation',
    type: 'INSTALL'
  }]
}, { autoCreateActivity: true });

// Get service call with nested structure
const serviceCallTree = await client.serviceManagementAPI.composite.tree.getServiceCall('service-call-id');

// Bulk create service calls
const bulkResult = await client.serviceManagementAPI.composite.bulk.postServiceCalls([
  { subject: 'Service 1', businessPartner: { id: 'bp-id' } },
  { subject: 'Service 2', businessPartner: { id: 'bp-id' } }
], { autoCreateActivity: true });
```

### Translation API

Access translation labels and values:

```typescript
// Get translation labels
const labels = await client.translationAPI.getLabels();

// Get translation values
const values = await client.translationAPI.getValues('label-id');
```

### Rules API

Manage business rules, monitor execution, and track rule health:

```typescript
// Get all rules with filtering and pagination
const rulesPage = await client.rulesAPI.getRules({
  page: 0,
  size: 10,
});

// Get a specific rule by ID
const rule = await client.rulesAPI.getRule('rule-id');

// Create a new rule
const newRule = await client.rulesAPI.createRule({
  // <RuleDTO> 
});

// Update an existing rule (partial update)
const updatedRule = await client.rulesAPI.updateRule('rule-id', {
  enabled: false,
  description: 'Updated description'
});

// Create or replace a rule
const upsertedRule = await client.rulesAPI.createOrUpdateRule('rule-id', {
  // <RuleDTO> 
});

// Get execution records for a rule
const executionRecords = await client.rulesAPI.getRuleExecutionRecords('rule-id', {
  page: 0,
  size: 20,
  status: 'FAILED',
  executionDateFrom: '2025-01-01',
  executionDateTo: '2025-12-31'
});
```

### Legacy Data Cloud API (Deprecated)

> ⚠️ **Note**: The Data Service API (Data Cloud) is deprecated. For service calls and activities, use the Service Management API instead.

#### Query for objects using CoreSQL

Provides the [coreSQL] and the [dtos] used in the query
see [Field Service Management - Query API](https://help.sap.com/viewer/fsm_query_api/LATEST/en-US/query-api-intro.html)

```typescript
const coreSQL =
  `SELECT
    sc.id,
    sc.subject
  FROM
    ServiceCall sc
  WHERE
   sc.id = '36A5626F65A54FE7911F536C501D151A'
  `;

await client.dataServiceAPI.query(coreSQL, ['ServiceCall']);
```

#### CRUD object

related doc's:
- [Data API v4 Docs](https://help.sap.com/viewer/fsm_data_api/Cloud/en-US)
- [Data Model Documentation](https://help.sap.com/viewer/fsm_data_model/Cloud/en-US/data-model-overview.html)

#### Create a new object

```typescript
const serviceCall = {
   id: fsm.CoreAPIClient.createUUID(), // => 36A5626F65A54FE7911F536C501D151A
   ...
};

await client.post('ServiceCall', serviceCall);
```

#### Read object by id or externalId

```typescript
await client.getById('ServiceCall', '36A5626F65A54FE7911F536C501D151A');
// or
await client.getByExternalId('ServiceCall', 'my-1');
```

#### Update object (providing full new version)

```typescript
await client.put('ServiceCall', { ... });
// or
await client.putByExternalId('ServiceCall', { ... });
```

#### Update object (providing only fields to change)

```typescript
await client.patch('ServiceCall', {
    id: '36A5626F65A54FE7911F536C501D151A',
    subject: 'update-only-subject',
    lastChanged: 1535712340
  });
// or
await client.patchByExternalId('ServiceCall', { externalId: 'my-1', ... });
```

#### Delete object by id or externalId

```typescript
await client.deleteById('ServiceCall', {
    id: '36A5626F65A54FE7911F536C501D151A',
    lastChanged: 1535712340
  });
// or
await client.deleteByExternalId('ServiceCall', { externalId: 'my-1', ... });
```

##### lastChanged

The `lastChanged` field is used for optimistic locking.
It's like a version-key you must provide in order to update an object.

#### Batch Actions (Transactions)

```typescript
// actions will be executed in sequence order like in array

const actions = [ 
  new CreateAction('ServiceCall', { ... }), 
  new UpdateAction('BusinessPartner', { id, lastChanged ... }), // required for update
  new DeleteAction('Address', { id, lastChanged ... }) // required for delete
];

const response = await client.batch(actions) 
// response => [ { body: { statusCode: 200|201|400, data: { ... } } }, req1, req2 ]

// data will contain a list resp, unwrap to access first
const [[{ serviceCall }], [{ businessPartner }], ] = response.map(it => it.body.data);
```


## Support

In case you need further help, check out the [SAP Field Service Management Help Portal](https://help.sap.com/viewer/product/SAP_FIELD_SERVICE_MANAGEMENT/Cloud/en-US/) or report and incident in [SAP Support Portal](https://support.sap.com) with the component "CEC-SRV-FSM".


## License

Copyright (c) 2020 SAP SE or an SAP affiliate company. All rights reserved.
This file is licensed under the Apache Software License, v. 2 except as noted otherwise in the [LICENSE](./LICENSE) file.

---
_Source: https://npm.io/package/fsm-sdk · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
