The API described here allows you to automate actions between Mobility Work CMMS and any other system you use, whether you want to be notified when something happened in Mobility Work CMMS (with the webhooks), or update it with information coming from a different source (with API HTTP endpoints).
The use of the API is subject to the terms of services and fair usage.
To be able to access its functionalities, you need an API key
that can be provided upon request (see later for details).
Some features are available with a limited usage or only to specific subscription plans. Each endpoint will indicate which subscription plan.
For instance, an endpoint available to all plans:
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
For instance, an endpoint limited to some plans:
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
You can request an API key or subscribe to a higher plan:
Any endpoint listed in this documentation with the label POST
, PUT
or GET
can be called directly to execute a single action.
POST
endpoints will generally create a new object in the CMMS.PUT
endpoints will generally update information already in the CMMS.GET
endpoints will allow you to retrieve information from the CMMS.You'll want to use these endpoints when you want to update information inside Mobility Work CMMS from a different system or application (update your stock or create a task for example), or want to retrieve information from Mobility Work CMMS.
To call one of these endpoints, you'll need to send an HTTPS request to https://api.mobility-work.com
followed
by the path of the endpoint you want to reach.
Each call to an HTTP endpoint must provide a valid API key for authentication purposes (see Authentication for more information).
For example, if you want to schedule a task, as stated by the endpoint documentation, you'll need to make a POST
call to https://api.mobility-work.com/partners/v1/tasks/
providing a valid payload for the call.
Using a cURL call, it would look like:
curl -i -X POST \
https://api.mobility-work.com/partners/v1/tasks \
-H 'Api-Key: YOUR_API_KEY_HERE' \
-H 'Content-Type: application/json' \
-d '{
"equipment": <your-equipment-identifier>,
"description": "My task",
"startDateTime": "2022-01-11T09:00:00+00:00",
"endDateTime": "2022-01-11T10:00:00+00:00",
"allDay": false,
"assignees": [
3,
"john.doe@example.com"
]
}'
Every endpoint lists the mandatory and optional parameters you'll need to include in your payload to be able to perform the task.
Note that, for some fields, different formats of data or identifiers can be given, depending on what's the most convenient to you. (For example, in the previous call, you can see that users can be represented by an id or an e-mail address).
For POST
and PUT
requests, once sent, and if no error was met, the server should respond with a simple 201
http code response, with no payload, unless stated otherwise in the endpoint documentation.
For GET
requests, the server should respond with a 200
http code and the payload should contain the requested
information in the format provided in the endpoint documentation.
The exact format and headers needed by the endpoints will be discussed later in this documentation.
Any endpoint with the label Event
is a webhook. It allows you to be notified when a specific event happens on
Mobility Work CMMS when subscribed to it.
You'll need to use webhooks whenever you need a different system or application to be updated with information originating from Mobility Work CMMS.
To be able to use webhooks, you will need to create an HTTPS endpoint that Mobility Work CMMS API will be able to call whenever the event happens, and implement, on your side, the desired behavior upon reception, on your other system or application.
To configure a webhook, you'll then need to go to the integrations settings for your network, select the event you want to subscribe to, and provide the URL of the endpoint the webhook will send the information to.
For example, if you want to be notified for every spare part consumption, you can configure a webhook that will call your endpoint every time it happens, providing the following data:
{
"_type": "SparePartWasConsumedWebhook",
"_event": "SparePartWasConsumed",
"_sentAt": "2022-06-02T14:31:06+00:00",
"emittedAt": "2023-02-08T23:00:00+00:00",
"_metadata": "",
"task": { [...] },
"sparePart": { [...] },
"location": { [...] },
"initiator": { [...] },
"consumed": {
"_type": "SparePartConsumption",
"quantity": 3,
"previousStock": 116
},
"networkId": <your-network-uuid>
}
Your endpoint must then respond with the HTTP code 200
, otherwise, the webhook call will be marked as failed and
retried afterwards.
Every webhook can be sent with a signature allowing you to verify the source of the call.
To identify resources, you are often given a choice between providing the "native" ID or an "external reference" (also called "item code") for equipments.
Native IDs are the internal IDs used and generated by Mobility Work CMMS. The can be numbers or UUIDS. You can retrieve them in the CMMS web app in the URL, but you have no control over them and they can't be modified.
External References are a string of characters you can specify for some of the resources available in the API. These can be automatically generated by the system, but can be modified by you so that it can reflect a more common reference for you, for example the ID the same resource has in a different system you use.
⚠️ For some endpoints, the external reference field can hold a different name, but works as listed before (eg.
for Equipments, external references are named item code
).
When given the choice (every endpoint can give you different options), it is often more relevant to use the
external reference
as it is easier for you to keep track of it.
Furthermore, for some endpoints, you are given the choice of the format in which sending the identifier of the
resource : when available, you should favor the object
format, as it allows to specify the type of the reference
you are providing the API and prevent confusion.
For example:
{
"type": "externalReference",
"value": "<your-external-reference"
}
All requests day must be sent using JSON format. To make sure the server understands it correctly, add a Content-Type
header to your request with the value application/json
.
For example:
POST /partners/v1/tasks
Content-Type: application/json
{
"description": "Replace motor part"
}
While not mandatory, it's highly recommended to provide a User-Agent
header which includes your network name.
For instance, for network Factory Inc.
, using cURL, the request should look like:
POST /partners/v1/tasks
User-Agent: curl/1.2.3 Factory Inc.
[...]
The format of the request is documented for every endpoint and must be followed. All required parameters must be provided. Optional parameters can be omitted.
If a request does not follow the expected schema, a 400
http code response will be returned providing every
invalid or missing information in its payload.
Requests can be sent using a minified format or a pretty/beautify format. The API won't make any difference of processing as long as the request is valid. However, it is recommended to use the minified format to reduce bandwidth usage.
It means that:
{
"description": "Replace motor part"
}
and:
{"description":"Replace motor part"}
hold strictly the same information and can be used interchangeably.
All responses will be sent using JSON format.
If a request is successful, the following status codes can be returned :
200
or 201
when the request is treated immediately202
when the request is accepted and will be processed asynchronouslyIf a request does not follow the expected format, contains invalid data or any other reason that results in an error,
a 4xx
response code will be returned. The response will provide information about what is missing or invalid.
For example:
{
"http_status_code": 400,
"code": "400044",
"message": "The request payload is not valid.",
"extended_message": {
"global_errors": [],
"property_errors": {
"/description": [
{
"messageKey": "error.payload.min_length",
"parameters": {
"min": 3,
"length": 1
}
}
],
"/equipment": [
{
"messageKey": "error.payload.equipment.unknown",
"parameters": {
"type": "native",
"value": 99999
}
}
],
"/assignees/0": [
{
"messageKey": "error.payload.assignees.unknown",
"parameters": {
"type": "email",
"value": "jason.doe@example.com"
}
}
],
"/assignees/1": [
{
"messageKey": "error.payload.assignees.unknown",
"parameters": {
"type": "email",
"value": "john.doe@example.com"
}
}
]
}
},
"more_info_url": null
}
informs that:
jason.doe@example.com
and john.doe@example.com
are not members of the networkand:
{
"http_status_code": 401,
"code": "401001",
"message": "Authentication error",
"extended_message": {
"global_errors": [
{
"messageKey": "Invalid Api Key.",
"parameters": {}
}
],
"property_errors": {}
},
"more_info_url": null
}
informs that the given credentials (API key) are not valid.
⚠️ If the http response code is 5xx
, the error is on the Mobility Server side, and should not happen.
However, if that happens to you, please re-try the exact same call a few minutes later, or contact the support
for help at help@mobility-work.com.
The documentation will always show JSON using a pretty/beautify format for readability. However, the API will always returns using a minified format to reduce the response size.
Some API tools like Postman or Insomnia can show responses in pretty/beautify format by default.
Every HTTP request must be performed providing a valid API Key. Each API Key is associated to a single network providing an access to all features available on the network subscription plan.
To authenticate against the API endpoints with your API key, you need to send your API key using the Api-Key
HTTP header.
For example :
POST /partners/v1/tasks
Api-Key: 913a8f7cef6ff084f1635511b9c7d07c3bab2816
[...]
To get an API Key, send an email to sales@mobility-work.com or contact your CSM.
The documentation is also available on every endpoints in the security section under the section Security/ApiKey
.
Note that when calling any endpoint of this documentation using the request tool in the right side-bar, the API Key field needs to be filled with a valid API key.
Your API Key must remain completely secret and taken care of as any other authentication secret, like a password. It is considered as a major vulnerability if it were to be divulgated to an unauthorized party.
If you think your API key is compromized, contact your CSM or Support directly to invalidate your API key and get a new one that will need to be provided for your API calls instead of the compromized one.
When using webhooks, you'll likely need to be sure the calls made to your endpoint come from an authorized source.
To answer this necessity, every webhook call performed by Mobility Work CMMS API contains a signature that allows your endpoint to verify the origin of the request it received, as long as you have enabled the feature by setting a secret key when configuring your webhook.
The signature is sent using the HTTP header X-MW-Signature
and provides a timestamp, a nonce, and the signature
allowing you to compute it on your side, compare it, and make sure it originated from Mobility Work.
For example:
POST <your-endpoint-url>
Api-Key: t=1660338149,nonce=752c14ea195c460bac3c3b7896975ee9fd15eeb7,signature=0b218e3166231b8b44ed11b5401d4de5e7e79d3e7d51415338a3e76df29372ba
[...]
The details on how to use it and some examples of implementation are provided on every endpoint documentation under
the section Security/WebhookSigningKey
.
When deploying your integrations with the Mobility Work API, it is always a good idea to keep logs of the calls you made to the API (and responses sent by our server) or the calls the API sent to your webhook endpoints. It allows you to track directly errors that could have happened, and be able to fix any problem that have been found. And if that's an error on the API side, it allows you to send us information that are critical to resolve the issue.
When you want to update several resources, you should always do it in the least amount of requests possible. Each bulk update API endpoint will give you the maximum of resources you can include in your request.
If the number of updates you want to make is lower than this number, you should do it in just one request. If it's greater than it, split it in different requests.
If, before deploying your integrations with our API on your production data, you need a testing environment, contact your CSM who will be able to set-up a sandbox network to experiment on before using your real network data.
If you have any issue with the API, the first step is to analyze the response to your request sent by the API. As described in "API Responses & Errors", if your request is malformed, you'll have all the necessary information to debug your request and be able to fix it.
Tools like Postman or Insomnia can greatly help you during the debug phase as they allow you to send your requests and see the responses in a more human readable way and provide tooling to make it easy for you to sens requests.
If, despite the response message, you have any issue with the API, you can contact the support.
Note that, when contacting support, it is deeply appreciated to provide any log, request or response
(including headers but without the API key) to help us resolve your issue in the fastest way. If you're not able
to provide these information to us, at least try to send us the Request-Id
returned in the response HTTP headers.
We list here recent changes made to the API or its documentation.
Date | Modification made to the API |
---|---|
2024-10-01 | Add API maintenance plan endpoint and docs |
2024-07-17 | Add new API to search for tasks |
2024-06-13 | Add new API to recount spare parts stock and mark the old one as deprecated |
2024-04-18 | Add new API to create equipments |
2024-04-09 | Add spare part cost center and location to spare parts canceled consumption webhook |
2024-03-08 | Add new webhook for spare parts canceled consumption |
2024-02-29 | Add new api to relocate spare parts |
2024-02-28 | Added tags of task on sparePartWasConsumed webhook |
2024-02-23 | Add new api to create storage locations |
2024-02-23 | New sections for the API documentation |
2024-02-08 | Added tags and requiredSpareParts fields for Tasks webhooks |
2023-12-21 | More context has been added to error messages |
Anything related to equipments and spare parts (including stock management, etc.).
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Creation of spare part(s)
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
Unit price amount must be passed as an integer in the lowest unit of the currency. For example, EUR and USD have a cent unit, 10 EUR = 1000 cents, 10 USD = 1000 pennies.
⚠️ A maximum of 10.000 creations can be processed in a single request. You need to split in several requests if you have more.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
Multi spare part creation, one with the minimum data and another with all available information
[- {
- "name": "SP min",
- "description": "New spare part with minimum info",
- "externalReference": "my-ref-sp-min",
- "unitPrice": {
- "amount": 42000,
- "currency": "EUR"
}, - "currentStock": {
- "location": "building #1",
- "quantity": 33
}
}, - {
- "name": "SP complete",
- "description": "New spare part with all info",
- "externalReference": "my-ref-sp-all",
- "unitPrice": {
- "amount": 9000,
- "currency": "USD"
}, - "currentStock": {
- "location": "building #1",
- "quantity": 806
}, - "minimumStock": 10,
- "maximumStock": 1000,
- "gtin": "9782070363513",
- "costCenter": "stock"
}
]
null
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Update all spare parts stock (e.g. inventory) at once. Stock amount will replaced by the given quantity. If multiple spare parts exists with the same article code, then the stock will be replaced on every spare parts with that article code.
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
The spare part identifier can be provided in two way:
For instance, that format:
[
{
"id": "MW-417304e0-2ff0-410d-a7cd-de20439140c8"
}
]
is equivalent to:
[
{
"id": {
"type": "externalReference",
"value": "MW-417304e0-2ff0-410d-a7cd-de20439140c8"
}
}
]
Article code is automatically generated when a spare part is referenced on the CMMS. You can replace it by your own identifier in the UI or by using the API to update spare parts attributes.
⚠️ A maximum of 10.000 stock changes can be processed in a single request. You need to split in several requests if you have more changes.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Subscription plan does not allow to use that API
[- {
- "id": "MW-417304e0-2ff0-410d-a7cd-de20439140c8",
- "quantity": 9
}
]
null
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Update all spare part(s) by replacing information with the provided information.
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
Omit the property if you do not want to make any changes to the attribute. For instance, the following request will only update the spare part name:
[
{
"id": {
"type": "externalReference",
"value": "c6d6f829-6c36-30cc-93be-d5202ca28aa4"
},
"name": "Rotor"
}
]
To unset an attribute, set it to null. For instance, the following request will remove the minimum stock:
[
{
"id": {
"type": "externalReference",
"value": "c6d6f829-6c36-30cc-93be-d5202ca28aa4"
},
"minimumStock": null
}
]
Unit price amount must be passed as an integer in the lowest unit of the currency. For example, EUR and USD have a cent unit, 10 EUR = 1000 cents, 10 USD = 1000 pennies.
For instance, if one spare part has a unit price of €35.00 and another has a unit price of $499.99, the request to update unit price should be:
[
{
"id": {
"type": "externalReference",
"value": "c6d6f829-6c36-30cc-93be-d5202ca28aa4"
},
"unitPrice": {
"amount": 3500,
"currency": "EUR"
}
},
{
"id": {
"type": "externalReference",
"value": "d8194f1f-050d-4f74-a592-2d541e6127aa"
},
"unitPrice": {
"amount": 49999,
"currency": "USD"
}
}
]
⚠️ A maximum of 10.000 updates can be processed in a single request. You need to split in several requests if you have more changes.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
update on several spare parts with different fields updated and different way to specify the identifier
[- {
- "id": {
- "type": "externalReference",
- "value": "my-ref-sp-min"
}, - "minimumStock": 10,
- "maximumStock": 100,
- "replenishmentLot": 10,
- "gtin": "5654534534545"
}, - {
- "id": "my-ref-sp-all",
- "name": "SIRIUS Innovation 3RT2 3 Pole Contactor - 9 A, 24 V dc Coil, 3NO, 4 kW",
- "customFields": [
- {
- "field": "$manufacturer",
- "value": "Siemens"
}, - {
- "field": "$manufacturer-reference",
- "value": "3RT2016-1BB41"
}, - {
- "field": "valuation-class",
- "value": "P"
}
]
}, - {
- "id": "my-ref-sp-custom",
- "description": "Rotor Mk. I",
- "customFields": [ ]
}, - {
- "id": {
- "type": "externalReference",
- "value": "NCC-1701-E"
}, - "description": "Rotor NCC-1701-E",
- "tags": [ ]
}, - {
- "id": {
- "type": "externalReference",
- "value": "NX-01"
}, - "tags": [
- {
- "operation": "add",
- "values": [
- "transport",
- "heavy"
]
}, - {
- "operation": "remove",
- "values": [
- "rubber"
]
}
]
}, - {
- "id": {
- "type": "externalReference",
- "value": "NCC-2893"
}, - "tags": [
- {
- "operation": "replace",
- "values": [
- "transport",
- "heavy"
]
}
], - "costCenter": "stock"
}
]
null
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Update all spare parts stock (e.g. inventory) at once. Stock amount will replaced by the given quantity. If multiple spare parts exists with the same article code, then the stock will be replaced on every spare parts with that article code.
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
The spare part identifier can be provided in two way:
For instance, that format:
[
{
"id": "MW-417304e0-2ff0-410d-a7cd-de20439140c8"
}
]
is equivalent to:
[
{
"id": {
"type": "externalReference",
"value": "MW-417304e0-2ff0-410d-a7cd-de20439140c8"
}
}
]
Article code is automatically generated when a spare part is referenced on the CMMS. You can replace it by your own identifier in the UI or by using the API to update spare parts attributes.
⚠️ A maximum of 10.000 stock changes can be processed in a single request. You need to split in several requests if you have more changes.
required | string or object (SparePartIdentifier) |
required | object |
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Subscription plan does not allow to use that API
[- {
- "id": {
- "type": "externalReference",
- "value": "my-ref-sp"
}, - "movement": {
- "quantity": 15,
- "type": "physical-recount"
}
}, - {
- "id": "external-reference-2",
- "movement": {
- "quantity": 15,
- "type": "physical-recount"
}
}, - {
- "id": "external-reference-3",
- "movement": {
- "quantity": 15,
- "type": "physical-recount",
- "target": {
- "location": "foobar"
}
}
}
]
null
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Creation of equipment(s)
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
⚠️ A maximum of 10.000 creations can be processed in a single request. You need to split in several requests if you have more.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
Multi equipments creation
[- {
- "name": "My equipment all info",
- "description": "my equipment with all info",
- "globalTradeItemNumber": "00012345678905",
- "costCenter": "Outpost",
- "itemCode": "EQ-0001",
- "private": true,
- "tags": [
- "$preventive"
], - "customFields": [
- {
- "field": "custom-field-code",
- "value": "Siemens"
}
]
}
]
null
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Update all equipment(s) by replacing information with the provided information.
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
The equipment identifier can be provided in two way:
For instance, that format:
[
{
"id": 2507
}
]
is equivalent to:
[
{
"id": {
"type": "native",
"value": 2507
}
}
]
Omit the property if you do not want to make any changes to the attribute. To unset an attribute, set it to null.
⚠️ A maximum of 10.000 updates can be processed in a single request. You need to split in several requests if you have more changes.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
update all info of an equipment and clear custom fields of another equipment
[- {
- "id": {
- "type": "native",
- "value": 2507
}, - "name": "My equipment all info",
- "description": "my equipment with all info",
- "gtin": "00012345678905",
- "costCenter": "Outpost",
- "tags": [
- "$preventive"
], - "itemCode": "EQ-0001",
- "customFields": [
- {
- "field": "custom-field-code",
- "value": "Siemens"
}
]
}, - {
- "id": 2508,
- "description": "remove all existing custom fields",
- "customFields": [ ]
}, - {
- "id": {
- "type": "externalReference",
- "value": "my-item-code"
}, - "description": "My equipment identified by item code"
}, - {
- "id": "my-other-item-code",
- "description": "My equipment identified by item code"
}
]
null
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Creation of storage location(s)
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
⚠️ A maximum of 10.000 creations can be processed in a single request. You need to split in several requests if you have more.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
[- {
- "name": "The name of the storage location to add"
}, - {
- "name": "The name of the second storage location to add"
}, - {
- "name": "The name of the third storage location to add"
}
]
null
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Relocate spare parts from a location to another one
⚠️ The request is processed in background. It can takes up to several minutes to see the change if there is a lot of changes.
⚠️ It is not possible to define a quantity to transfer. All stock from the source location is moved to the target location ⚠️ It is only possible to relocate spare parts to existing locations in the network. If the locations do not exist, please use the dedicated API to create these locations beforehand ⚠️ A maximum of 10.000 creations can be processed in a single request. You need to split in several requests if you have more.
Request accepted (e.g. all changes will be processed as soon as possible)
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
[- {
- "sparePartId": "MW-6c4540b9-e8fd-4980-b10c-1b9325fcb643",
- "source": {
- "locationName": "Location 1"
}, - "target": {
- "locationName": "Location 2"
}
}, - {
- "sparePartId": "MW-04934063-0dca-4e66-a8be-75797ebc77a5",
- "source": {
- "locationName": "Location 11"
}, - "target": {
- "locationName": "Location 21"
}
}
]
null
Anything related to maintenance operations (e.g. task, activities, maintenance plans, etc.).
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Pragmatically schedule a new task to be executed by the given assignees.
For some properties, we support providing several kind of identifiers.
native
are type auto-generated by Mobility Workexternal
are type that you provide from an import or manually through the Web interfaceemail
are e-mails that are associated with your user accountcode
are type auto-generated by Mobility Work or manually through the Web interfaceFor each type, we support type inference, it means that we automatically detect the type from the value.
assignees
you can mix both native
and email
identifiers.tags
you can mix both native
and code
identifiers.equipment
you can mix both native
and external
identifiers.If type cannot be inferred, an error will be generated. You can still force the type by providing a more typed property:
{
"assignees": [
3,
"john.doe@example.com"
]
}
is equivalent to:
{
"assignees": [
{
"type": "native",
"value": 3
},
{
"type": "email",
"value": "john.doe@example.com"
}
]
}
The property metadata
can be used to send any arbitrary data to associate with the task you create. For example,
on task creation, you can define the following metadata:
{
"metadata": {
"internalIdentifier": 1234
}
}
It will be sent back through webhooks. You can set it to set a custom identifier to further correlate a task with any internal value.
Task successfully scheduled
Request contains invalid data or does not have all required data
Missing or invalid Api Key (e.g. revoked or non-existent)
{- "equipment": 9,
- "description": "API Task creation",
- "startDateTime": "2022-01-11T09:00:00+00:00",
- "endDateTime": "2022-01-11T10:00:00+00:00",
- "allDay": false,
- "assignees": [
- 3,
- "john.doe@example.com"
]
}
null
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Search for your tasks using several criteria.
⚠️ Query parameters must be encoded
Tasks search
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
{- "_links": [
- {
- "href": "string",
- "rel": "string"
}
], - "_items": [
- {
- "taskId": "string",
- "taskShortId": "string",
- "description": "string",
- "taskState": "pending",
- "estimateDurationInMinutes": 0,
- "regulatory": true,
- "createdAt": "2019-08-24T14:15:22Z",
- "completedAt": "2019-08-24T14:15:22Z",
- "plannedMaintenanceTimeInMinutes": 0,
- "plannedStoppedTimeInMinutes": 0,
- "networkId": "string",
- "schedule": {
- "from": "2019-08-24T14:15:22Z",
- "to": "2019-08-24T14:15:22Z",
- "allDay": true
}, - "associatedTo": {
- "externalReference": "string",
- "name": "string",
- "costCenter": "string",
- "tags": [
- {
- "code": "string",
- "name": "string",
- "groupId": 0,
- "groupName": "string"
}
]
}, - "maintenancePlan": {
- "id": "string",
- "description": "string",
- "state": "in_progress",
- "tags": [
- {
- "code": "string",
- "name": "string",
- "groupId": 0,
- "groupName": "string"
}
], - "additionalProperties": null
}, - "tags": [
- {
- "code": "string",
- "name": "string",
- "groupId": 0,
- "groupName": "string"
}
], - "assignees": {
- "individuals": [
- {
- "firstName": "string",
- "lastName": "string",
- "email": "string"
}
], - "teams": [
- {
- "code": "string",
- "name": "string",
- "members": [
- {
- "firstName": null,
- "lastName": null,
- "email": null
}
]
}
]
}, - "sparePartRequirements": [
- {
- "locations": [
- {
- "name": "string"
}
], - "quantity": 0,
- "externalReference": "string",
- "name": "string",
- "costCenter": "string"
}
]
}
], - "_pagination": {
- "totalItemCount": 0,
- "totalPageCount": 0,
- "itemCountPerPage": 0,
- "currentPage": 0,
- "currentItemCount": 0
}
}
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Each API call creates a task corresponding to the selected maintenance plan ID.
Maintenance Plan api triggered
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
{- "metadata": { }
}
null
Starter | Premium | Ultimate |
---|---|---|
✔️ | ✔️ | ✔️ |
Get information about the network associated to the API Key.
Network settings
Missing or invalid Api Key (e.g. revoked or non-existent)
Access denied
{- "networkId": "4d4b9269-db6b-4b8f-8577-d01ef451d291",
- "legacyNetworkId": 686,
- "name": "Mobility Work",
- "timezone": "Europe/Paris",
- "currency": "EUR"
}
"Webhooks allow you to be notified in real-time of any events occurring in the application.
A webhook must have been configured with that event to receive it. Administrators can configure webhooks here. If you want to test webhooks, you can use a service like RequestBin.com to receive webhooks and inspect it.
If the webhook fails (http code bigger than 399), the call to the webhook is retried twice. If the call is still in error, an e-mail is sent."
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a task was marked as completed by an user.
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "TaskWasCompleted",
- "_idempotencyKey": "i6WeIdxywu",
- "legacyId": "32828f62",
- "id": "32828f62",
- "doneAt": "2021-11-02T16:32:38+00:00",
- "initiator": {
- "id": "ee84d563-da9c-47ee-a79f-7147814509e0",
- "firstName": "John",
- "lastName": "Doe"
}, - "associatedTo": {
- "_type": "equipment",
- "type": "equipment",
- "id": "ff77ef5b-19d4-4c50-96da-6a16f9c43644",
- "legacyId": 7111,
- "itemCode": "EQ-0001",
- "name": "Machine Tool #1"
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
], - "requiredSpareParts": [
- {
- "name": "Spare part name",
- "description": "Spare part description",
- "itemCode": "SP-0001",
- "costCenter": "CC-0001",
- "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}
], - "metadata": {
- "internalIdentifier": 1234
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a task was scheduled by an user.
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "TaskWasScheduled",
- "_idempotencyKey": "i6WeIdxywu",
- "taskId": "32828f62",
- "scheduled": {
- "by": {
- "userId": "ee84d563-da9c-47ee-a79f-7147814509e0",
- "firstName": "John",
- "lastName": "Doe"
}, - "on": "2021-11-02T16:32:38+00:00"
}, - "associatedTo": {
- "_type": "equipment",
- "type": "equipment",
- "id": "ff77ef5b-19d4-4c50-96da-6a16f9c43644",
- "legacyId": 7111,
- "itemCode": "EQ-0001",
- "name": "Machine Tool #1"
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
], - "requiredSpareParts": [
- {
- "name": "Spare part name",
- "description": "Spare part description",
- "itemCode": "SP-0001",
- "costCenter": "CC-0001",
- "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
], - "availableStorageLocations": [
- {
- "name": "A1A1A1"
}, - {
- "name": "B2B2B2"
}
], - "chosenStorageLocation": {
- "name": "A1A1A1"
}
}
], - "metadata": {
- "internalIdentifier": 1234
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a task was canceled by an user.
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "TaskWasCanceled",
- "_idempotencyKey": "i6WeIdxywu",
- "taskId": "32828f62",
- "canceled": {
- "by": {
- "userId": "ee84d563-da9c-47ee-a79f-7147814509e0",
- "firstName": "John",
- "lastName": "Doe"
}, - "on": "2021-11-02T16:32:38+00:00"
}, - "associatedTo": {
- "_type": "equipment",
- "type": "equipment",
- "id": "ff77ef5b-19d4-4c50-96da-6a16f9c43644",
- "legacyId": 7111,
- "itemCode": "EQ-0001",
- "name": "Machine Tool #1"
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
], - "requiredSpareParts": [
- {
- "name": "Spare part name",
- "description": "Spare part description",
- "itemCode": "SP-0001",
- "costCenter": "CC-0001",
- "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}
], - "metadata": {
- "internalIdentifier": 1234
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a task was started by an user.
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "TaskWasStarted",
- "_idempotencyKey": "i6WeIdxywu",
- "taskId": "32828f62",
- "started": {
- "by": {
- "userId": "ee84d563-da9c-47ee-a79f-7147814509e0",
- "firstName": "John",
- "lastName": "Doe"
}, - "on": "2021-11-02T16:32:38+00:00"
}, - "associatedTo": {
- "_type": "equipment",
- "type": "equipment",
- "id": "ff77ef5b-19d4-4c50-96da-6a16f9c43644",
- "legacyId": 7111,
- "itemCode": "EQ-0001",
- "name": "Machine Tool #1"
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
], - "requiredSpareParts": [
- {
- "name": "Spare part name",
- "description": "Spare part description",
- "itemCode": "SP-0001",
- "costCenter": "CC-0001",
- "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}
], - "metadata": {
- "internalIdentifier": 1234
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when an activity was reported on a task by an user
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "ActivityWasAddedOnTask",
- "_idempotencyKey": "i6WeIdxywu",
- "_type": "ActivityWasAddedOnTaskWebhook",
- "_sentAt": "2023-06-13T15:23:48+00:00",
- "_metadata": [ ],
- "emittedAt": "2023-06-13T15:23:43+00:00",
- "task": {
- "_type": "Task",
- "taskId": "941c77dc",
- "description": "corrective maintenance of the FREDS machine",
- "metadata": {
- "internalIdentifier": 1234
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}, - "equipment": {
- "_type": "equipment",
- "type": "equipment",
- "equipmentId": "d1e569da-f996-4554-a335-12278873ae42",
- "itemCode": "mw-ref-poz-01",
- "name": "FREDS"
}, - "activity": {
- "_type": "Activity",
- "activityId": 19823,
- "description": "replacement lamps",
- "timeSpentInMinutes": 120,
- "completedAt": "2023-06-13T14:00:00+00:00",
- "reporter": {
- "_type": "User",
- "userId": "2e9aadc1-8b7a-46f7-bd27-85983d97357d",
- "firstName": "John",
- "lastName": "Doe"
}
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff",
- "requiredSpareParts": [
- {
- "name": "Spare part name",
- "description": "Spare part description",
- "itemCode": "SP-0001",
- "costCenter": "CC-0001",
- "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}
]
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a spare part is out of stock after consumption or stock update
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "SparePartWasOutOfStock",
- "_idempotencyKey": "i6WeIdxywu",
- "_date": "2022-06-02T14:31:06+00:00",
- "_metadata": null,
- "stock": {
- "location": {
- "locationId": "78a70e7e-f80c-45e9-863a-cd71f6395c9b",
- "name": "Allée 2 - Rang 3 - Étagère 4"
}
}, - "sparePart": {
- "sparePartId": "e68243dd-cc9c-499c-8556-16c0215b719b",
- "name": "SP all info",
- "articleCode": "SP987678",
- "costCenter": "cost center #1"
}, - "movement": {
- "on": "2022-06-02T14:31:06+00:00"
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when the stock amount of a spare part has gone bellow the minimum stock threshold
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_event": "SparePartStockWasUnderMinThreshold",
- "_idempotencyKey": "i6WeIdxywu",
- "_date": "2022-06-02T14:31:06+00:00",
- "_metadata": null,
- "stock": {
- "location": {
- "locationId": "78a70e7e-f80c-45e9-863a-cd71f6395c9b",
- "name": "Allée 2 - Rang 3 - Étagère 4"
}, - "threshold": 100,
- "value": 98
}, - "sparePart": {
- "sparePartId": "e68243dd-cc9c-499c-8556-16c0215b719b",
- "name": "SP all info",
- "articleCode": "SP987678",
- "costCenter": "cost center #1"
}, - "movement": {
- "on": "2022-06-02T14:31:06+00:00"
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when the stock of a spare part was manually modified
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_type": "SparePartWasManuallyRecountedWebhook",
- "_event": "SparePartWasManuallyRecounted",
- "_idempotencyKey": "i6WeIdxywu",
- "_sentAt": "2022-06-02T14:31:06+00:00",
- "emittedAt": "2023-02-08T23:00:00+00:00",
- "_metadata": "",
- "sparePart": {
- "_type": "sparePart",
- "name": "Equipment with spare part # 18",
- "sparePartId": "88b0b0f1-f5d0-4eeb-8b3c-c936b2c8a3b9",
- "articleCode": "whr484zb",
- "stock": 119,
- "costCenter": "cost center #1"
}, - "location": {
- "_type": "Location",
- "locationId": "2d6e80f6-3608-3daf-935c-7533536863e8",
- "name": "consequatur"
}, - "initiator": {
- "_type": "User",
- "userId": "e1fff3f1-aabd-4d82-8c3e-2cc75d1f4d7f",
- "firstName": "Monty",
- "lastName": "Watsica"
}, - "recounted": {
- "_type": "StockRecount",
- "quantity": 3,
- "previousStock": 116
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a spare part has been replenished
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_type": "SparePartWasRestockedWebhook",
- "_event": "SparePartWasRestocked",
- "_idempotencyKey": "i6WeIdxywu",
- "_sentAt": "2022-06-02T14:31:06+00:00",
- "emittedAt": "2023-02-08T23:00:00+00:00",
- "_metadata": "",
- "task": null,
- "sparePart": {
- "_type": "sparePart",
- "name": "Equipment with spare part # 18",
- "sparePartId": "88b0b0f1-f5d0-4eeb-8b3c-c936b2c8a3b9",
- "articleCode": "whr484zb",
- "stock": 119,
- "costCenter": "cost center #1"
}, - "location": {
- "_type": "Location",
- "locationId": "2d6e80f6-3608-3daf-935c-7533536863e8",
- "name": "consequatur"
}, - "initiator": {
- "_type": "User",
- "userId": "e1fff3f1-aabd-4d82-8c3e-2cc75d1f4d7f",
- "firstName": "Monty",
- "lastName": "Watsica"
}, - "restocked": {
- "_type": "SparePartRestock",
- "quantity": 3,
- "previousStock": 116
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a spare part is consumed
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_type": "SparePartWasConsumedWebhook",
- "_event": "SparePartWasConsumed",
- "_idempotencyKey": "i6WeIdxywu",
- "_sentAt": "2022-06-02T14:31:06+00:00",
- "emittedAt": "2023-02-08T23:00:00+00:00",
- "_metadata": "",
- "task": {
- "_type": "Task",
- "taskId": "dfe1da12",
- "equipment": {
- "itemCode": "EQ-0001",
- "costCenter": "Outpost"
}, - "tags": [
- {
- "code": "tag-name",
- "name": "Tag Name"
}
]
}, - "sparePart": {
- "_type": "sparePart",
- "name": "Equipment with spare part # 18",
- "sparePartId": "88b0b0f1-f5d0-4eeb-8b3c-c936b2c8a3b9",
- "articleCode": "whr484zb",
- "stock": 119,
- "costCenter": "cost center #1"
}, - "location": {
- "_type": "Location",
- "locationId": "2d6e80f6-3608-3daf-935c-7533536863e8",
- "name": "consequatur"
}, - "initiator": {
- "_type": "User",
- "userId": "e1fff3f1-aabd-4d82-8c3e-2cc75d1f4d7f",
- "firstName": "Monty",
- "lastName": "Watsica"
}, - "consumed": {
- "_type": "SparePartConsumption",
- "quantity": 3,
- "previousStock": 116
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}
Starter | Premium | Ultimate |
---|---|---|
❌ | ✔️ | ✔️ |
Triggered when a spare part consumption has been canceled from an activity or an activity deletion
The endpoint should return 200 status to indicate that the data was received successfully.
{- "_type": "SparePartConsumptionWasCanceledWebhook",
- "_event": "SparePartConsumptionWasCanceled",
- "_idempotencyKey": "i6WeIdxywu",
- "_sentAt": "2022-06-02T14:31:06+00:00",
- "emittedAt": "2023-02-08T23:00:00+00:00",
- "_metadata": "",
- "task": {
- "_type": "Task",
- "taskId": "dfe1da12",
- "equipment": {
- "itemCode": "EQ-0001",
- "costCenter": "Outpost"
}
}, - "sparePart": {
- "_type": "sparePart",
- "name": "Equipment with spare part # 18",
- "sparePartId": "88b0b0f1-f5d0-4eeb-8b3c-c936b2c8a3b9",
- "articleCode": "whr484zb",
- "quantity": 10,
- "costCenter": "cost center #1"
}, - "activity": {
- "_type": "Activity",
- "name": "Equipment with spare part # 18",
- "activityId": 1,
- "description": "Activity description",
- "timeSpentInMinutes": 120,
- "completedAt": 10,
- "reporter": {
- "_type": "User",
- "userId": "e1fff3f1-aabd-4d82-8c3e-2cc75d1f4d7f",
- "firstName": "Monty",
- "lastName": "Watsica"
}
}, - "location": {
- "_type": "Location",
- "locationId": "2d6e80f6-3608-3daf-935c-7533536863e8",
- "name": "consequatur"
}, - "networkId": "17df9a0f-5c04-43c8-b010-b48e1237e6ff"
}