AFS/PLM Connect API Reference Guide

The AFS/PLM Connect system offers a collection of RESTful APIs designed to allow users to access and manipulate their data through their own FMIS (Farm Management Information System). The APIs offer:

  • Consistent and tested API structure which leverages standard HTTP features (such as GET and POST)
  • Data Sharing via an OAuth permissioning implementation, allowing users to easily and safely grant access to their applications without opening the door for malicious actors
  • Leverages the JSON API standard, making serializing and deserializing data transfers simple
  • Easy access to equipment lists and the Grower/Farm/Field hierarchy
  • File upload/download access for task files and boundaries, as well as basic format conversion

You may gain access to these APIs via this Developer Portal by registering to participate.

Click here to see the AFS/PLM Connect API swagger document.

Data Sharing

As a developer building an FMIS, it is important to understand the functionality offered to the users of your product by the AFS/PLM Connect API, even if there are no specific developer actions required for that portion of the process. Simply put, the API allows two types of your users, Advisers and Growers, to easily share the data they store in your FMIS with each other. This section covers what the AFS/PLM Connect API does behind the scenes of your FMIS to help your users, but is not information required build your FMIS. For an entrypoint more specifically devoted to getting you started with your FMIS, please see the Getting Started page.

What is data sharing?

The chief challenge in the realm of precision agriculture is one of data management. Simple statistics dictates that the more data points available, the more reliable the calculations and projections, so even simple applications can be overwhelmed with trying to track it all. The AFS/PLM Connect API solves this problem by creating a central store for grower data, and then allowing those growers to share the data with their Adviser or Adviser Company, who may then use specialized FMIS applications to crunch the numbers. Separating the data concerns from the analytic concerns makes the data structure agnostic, allowing its use in many different types of applications, whereas an entire enclosed ecosystem application that implements both data storage and analytics is bound by its own structure into only supporting specific operations.

While the benefits of a central data platform are obvious, the intricacies of safely sharing that data can be tricky. The AFS/PLM Connect application makes this an easy process. It's best explained though an illustration of the relationship between the two concerned parties: Growers and Advisers.

Grower

Data Sharing - Grower

The first portion of the data sharing process is for the Grower to become established in the AFS/PLM Connect system.

Create AFS/PLM Account

A Grower must create and register an account in the system in order to upload data that they may share.

Invite Adviser

Once they exist within the system, a Grower may invite an Adviser of their choice to join the AFS/PLM Connect system as well.

Share DATA

Finally, a Grower may select which GFF data they wish to share with their Adviser.

Adviser

Data Sharing - Adviser

The Adviser must also exist in the system, and then may choose from an App Store of FMIS applications to use for analytical purposes to examine the data that has been shared.

Create AFS/PLM Account

The Adviser first will follow the link in the email invitation they receive in order to register their own account within the system.

Select FMIS from the App Store

Once the Adviser has an account within the system, they may use the App Store to select an FMIS.

Link FMIS Account to AFS/PLM Connect

Finally, the Adviser logs into the FMIS they have chosen, and then uses the available features within that FMIS to link their FMIS account with their AFS/PLM Connect account. Once the FMIS and AFS/PLM Connect accounts are linked, the Adviser will have access to the data of any Growers that have shared it with them within the system.

Application Authentication

If you are building your own FMIS, and you want to use the data from CNH’s AFS/PLM Connect API, you will first need your users to give your application permission to see their data within the AFS/PLM Connect system. (This is described in the Adviser section of Data Sharing.) You may authenticate users of your application, and you know those users also have permissions on the AFS/PLM Connect API, but how do you securely pass those permissions through to your application without a messy exchange of usernames and passwords? The solution is OAuth 2.0.

OAuth 2.0

The OAuth 2.0 service is used to allow users to share their data within the AFS/PLM Connect API system with your FMIS application. It is important to note that OAuth is not an authentication service in and of itself - it has no users and will not perform any validation. It simply manages permissions between applications.

The AFS/PLM Connect system uses the three-legged approach to Oauth.

Authorization Request

To grant a user of your application permission to use their own AFS/PLM Connect data, the first step is to request authorization. Your FMIS will request authorization from the AFS/PLM Connect system, which will then require authentication from the active user. Once the active user is authenticated, the AFP/PLM Connect system will then pass the authorization request to an authentication service (in this case Auth0). Auth0 will then present the user an authorization consent form.

GET /authorize? response_type=code&client_id=<client_ID>&redirect_uri=<redirect_uri>&audience=<resource>&scope=<scopes>

Query Parameter Description Data Type
client_id Specifies the application that is requesting access string
redirect_uri The reply URL of the application string
response_type The requested response type - in an auth request this MUST be code string
state Randomly generated value provided and returned as a mitigatation against cross-site scripting string

API Call

GET 
https://stg.identity.cnhind.com/authorize?scope=offline_access&client_id=abcOy8iqB6Ak8fnc7fFs1YWz0qfS7qcC&response_type=code&audience=https://stg.api.cnhind.com&redirect_uri=http://localhost:60856/signin-auth0

Response

Return Value Description Data Type
code The provided authorization code string
state The same state that was sent in the request string
http://localhost:60856/signin-auth0?code=ry9rEJYGjGk9WtfH

Authorization Grant

The form returned by Auth0 asks the user if they consent to allow your application access to their data within the AFS/PLM system. If the user gives consent, Auth0 will provide a response to your application that includes an authorization code. Your FMIS application will then make a request to the AFS/PLM system for Access and Refresh tokens, providing the authorization code to let the AFS/PLM Connect system know that permission has been granted to access the appropriate data.

POST /oauth/token HTTP/1.1 Host: : https://host Content-Type: application/x-www-form-urlencoded grant_type=authorization_code&client_id=<client_id>&redirect_uri=<redirect_uri>&client_secret=<client_secret>

Query Parameter Description Data Type
client_id Specifies the application that is requesting access string
client_secret Equivalently the client password for the application string
redirect_uri The reply URL of the application string
grant_type The type of permission grant you need - in the case of auth requests the value is authorization code string

API Call

POST /oauth/token HTTP/1.1
Host: stg.identity.cnhind.com
Content-Type: application/json
Cache-Control: no-cache
{"grant_type":"authorization_code","client_id": "abcOy8iqB6Ak8fnc7fFs1YWz0qfS7qcC","client_secret": "ZDYtKcODy_jzEHvgXEL25AEOrEtB_SOhwjCgrjyFFwE42N5dmIWA4i8etDswS4KM","code": "ry9rEJYGjGk9WtfH","redirect_uri": "http://localhost:60856/signin-auth0"}

Response

OAuth will then issue an Access token and a Refresh token to your application. The Access token is submitted along with API calls to the AFS/PLM Connect API in order to let the AFS/PLM Connect API side know what application and user combination is requesting data, as well as letting the AFS/PLM Connect API side know that the request has been approved by the user and application creator. The Refresh token may be issued periodically by your application to renew your access grant.

Return Value Description Data Type
access_token The token passed with API calls string
expires_in Number of seconds the Access token is valid for string
expires_on The date and time the Access token expires string
id_token A token that allows your application to request information about the user who authorized the access_token string
refresh_token The token used to aquire additional Access tokens when they expire string
token_type Token type value - Bearer token. string
{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9FVTFPRVEyTkVZelJqQkRNVUpDT1RsQ1JFUTJSVEJETWpoQk4wWkZOVVUzTTBGRFEwTkdNdyJ9.eyJpc3MiOiJodHRwczovL2lkZW50aXR5LmNuaGluZC1kZXYuYXV0aDAuY29tLyIsInN1YiI6ImFkZnN8Q05ILUFERlMtQ09OTnxGNjQ1MDJBQENOSDEuQ05IR1JPVVAuQ05ILkNPTSIsImF1ZCI6Imh0dHBzOi8vbWt0LmFwaS5jbmhpbmQuY29tIiwiaWF0IjoxNTMxODQ1Mjc5LCJleHAiOjE1MzE5MzE2NzksImF6cCI6ImFiY095OGlxQjZBazhmbmM3ZkZzMVlXejBxZlM3cWNDIiwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyJ9.Owd0zqxVRE157mKkQqOjb7UhWGdP2bS5yu5KrHZkfWDbSnoJT9IfdT2SzowYWUhvR-f-4EjVajzTMx6DxjQdJZiGs97KQcokpErlvvvn_F_XDgBybMfTML4EhDwt67fDYmAsCnMFukyKbaK0Sz1iaFCERth9tOp1jxpR0qD1jUP_wTlAGt6RpwIL34i3UIksQIltCBlb4oudM13Ny5TxRWoG4E8a5DDrW9WT7bwQapkkvXWU11xEewaEFfL1gsMMEkhpil8HUIgbe1K1Gu6_DxlrujonEurl0XHY26vuuGLqiK8jN6t_woNFkklgF72GiXQ5rbYhF8kYhQQf4ONunw",
    "refresh_token": "rdLOPpdj-YEkGnWfN4Tqb5kzCLaB1F8LcaYjOLHefUsDJ",
    "expires_in": 86400,
    "token_type": "Bearer"
}

Using Your Access Token

Your Access token must be passed in the header of your API calls to the AFS/PLM Connect system.

GET /mkt/fmis/companies HTTP/1.1
Host: euevoapim010.azure-api.net
Ocp-Apim-Subscription-Key: 4ad4152e1f0f4dca90e0cf9b986be597
Cache-Control: no-cache
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9EVTFNVFpDUWpNME1qUXpNRGMxUWtORE1EVXlRVFk0TVRFM01URkJNRGhHTUVKRU9EZ3lRUSJ9.eyJpc3MiOiJodHRwczovL2NuaC1ldm8tYmV0YS5hdXRoMC5jb20vIiwic3ViIjoiYWRmc3xjZXJ0LWFkZnMtMTZ8Y25oZGVtb3VzZXIyQG1haWxpbmF0b3IuY29tIiwiYXVkIjoiaHR0cHM6Ly9leHRlcm5hbC1jbmgtZXZvLWFwaS1iZXRhLmF6dXJlLWFwaS5uZXQiLCJpYXQiOjE1MzE4NDMxNzgsImV4cCI6MTUzMTkyOTU3OCwiYXpwIjoiN1NoR01jM3pQSmtxWU5WamR2MjJwWnk3MTFXQVJ4WW0iLCJzY29wZSI6Im9mZmxpbmVfYWNjZXNzIn0.ip9TaLctI2UnotKhpxHhYtu1mX9QPtssXEYwTGorwPMFTBrFOemkrOh83doP7WI8aQGtagUf_8Xl8qlGLzzlaBWtJ3rWGgnATkqhDXpkTgmIhqFK5sNDrM5tUE1oJLy6cqd37Ke9wmBR5pu80X1wu4B_YDU6MjWQkMjplfYQdD2SxkL3hk7LeUTMEXYaRP7LFuGRlI73zxLn5XbuILv5M0_ZczmFSQeR9_qr72buh75B4v6RVnyr3CqEHO8etRua9va2kwplHCzDJoeeTqV728psRkvOn_deGTntlNkX0OIqGkLgr4n9s_SgYGVjwfps_1XnjALl0bUAov7l815ubw

Refreshing Your Access Token

When your Access token expires, you must refresh the token's lifespan with the Refresh token received in the authorization grant. You do this by making a refresh request to the authorization endpoint for the AFS/PLM Connect system.

grant_type=refresh_token&client_id=<client_id>&client_secret=<client_secre>&refresh_token=<refresh_token>

Query Parameter Description Data Type
client_id Specifies the application that is requesting access string
client_secret Equivalently the client password for the application string
grant_type The type of permission grant you need - in the case of auth requests the value is authorization code string
refresh_token The refresh token provided in your authorization grant string
POST /oauth/token HTTP/1.1
Host: stg.identity.cnhind.com
Content-Type: application/json
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9EVTFNVFpDUWpNME1qUXpNRGMxUWtORE1EVXlRVFk0TVRFM01URkJNRGhHTUVKRU9EZ3lRUSJ9.eyJpc3MiOiJodHRwczovL2NuaC1ldm8tYmV0YS5hdXRoMC5jb20vIiwic3ViIjoiYWRmc3xjZXJ0LWFkZnMtMTZ8Y25oZGVtb3VzZXIyQG1haWxpbmF0b3IuY29tIiwiYXVkIjpbImh0dHBzOi8vZXh0ZXJuYWwtY25oLWV2by1hcGktYmV0YS5henVyZS1hcGkubmV0IiwiaHR0cHM6Ly9jbmgtZXZvLWJldGEuYXV0aDAuY29tL3VzZXJpbmZvIl0sImlhdCI6MTUyOTY5MzExNSwiZXhwIjoxNTI5Nzc5NTE1LCJhenAiOiJTcGVxTHZjYjVHdDYyckdmUmc3TU9xRTVWVkxjcUF6SSIsInNjb3BlIjoib3BlbmlkIG9mZmxpbmVfYWNjZXNzIn0.q3erg_WTB0lH4eKiuNNj8t--EMQk2GqPQal-uZcOD5pcKjyGUUDj12fbGleSlAdZmV7ZXxxriGcBifkaIrdRj_3QqqIoLXAKuoVK1Cs3JKeyuthffDX34q6vdPe_EjOSqgcFTkHZQDJwMCV8WEbbYweP_RoP7a_dRRNSUMhAs8hBg5XiWNBv7m54E7WHxlvo3HDyjiTWzVGNpwFbFcpZnMFNpAir7TMCd15-PxiV-ec7JE_8QPzh2ehE_w2ASKdYI4VBPO3TCf4qp5RH37hWL8nAtJyMYjH69xsuE4sewrFODMpPn7w7Wl3nk1rR709ni8HK_EULeSjNudi9MC0euw
Cache-Control: no-cache
{ "grant_type": "refresh_token", "client_id": "Ido0lGEbvrlFuzbw1QyFpAXoHljnEQR3", "client_secret": "XRlRnlL2v0bjXHKSUB5JZjnk0VC0RaEbgFSnfw6dgoPhPeQh7YoQf6vy5bNjvmo7", "refresh_token": "horIrN7n6eiTrFQR5j6jmrCSl6aOieAGx3_OW1VEfrSzv" }

Response

Return Value Description Data Type
access_token The token passed with API calls string
expires_in Number of seconds the Access token is valid for string
scope Offline access string
refresh_token The token used to aquire additional Access tokens when they expire string
token_type Token type value - Bearer token. string
{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ik9FVTFPRVEyTkVZelJqQkRNVUpDT1RsQ1JFUTJSVEJETWpoQk4wWkZOVVUzTTBGRFEwTkdNdyJ9.eyJpc3MiOiJodHRwczovL2lkZW50aXR5LmNuaGluZC1kZXYuYXV0aDAuY29tLyIsInN1YiI6ImFkZnN8Q05ILUFERlMtQ09OTnxjbmhkZW1vdXNlcjJAbWFpbGluYXRvci5jb20iLCJhdWQiOiJodHRwczovL21vY2thcGkvbWt0IiwiaWF0IjoxNTMxNzU0NzU1LCJleHAiOjE1MzE4NDExNTUsImF6cCI6IklkbzBsR0VidnJsRnV6YncxUXlGcEFYb0hsam5FUVIzIiwic2NvcGUiOiJvZmZsaW5lX2FjY2VzcyJ9.v9gaUzTMgTgmSekRBz9kEsp034luCce_kR1VelsHhDxBxOgE5vUPemTQVcg58n_0FoHpYhjipUt0a3Opy2IviT2dRMZbBNzl1pHJMNlkrw2KMka845ZmOHO2ow84E801gATc4iLLo9evEpO7Dii-uF2qFU1KLSOJY9zsslUWc9qo08ryKcL646L66z9Ells9EAXl9nsIJSSAzpqensbPcABfQIxGe3UPqPPlzRPOs-xBnZ8BRoGtQHiqEjDR66DXu0W3bwdMsX-8hqj4ZoAP9L_X42bqim-cotYJDoTHaLyEXB3dN0HJkswhT2obEONRxamC_lz8PYeDTMrzwCg5wA",
    "scope": "offline_access",
    "expires_in": 86400,
    "token_type": "Bearer"
}

Filtering

When querying an API, we often receive far more data than we need, especially when the API is powering a mobile application where every byte is crucial. For best performance, you only want exactly as much data as you need to perform your operations. To that end, the AFS PLM Connect Data Sharing API provides easy filtering query parameters to help save you bandwidth.

Filtering is done by the API on an endpoint by endpoint basis. Each API call comes with its own set of custom filters appropriate for that particular call. We will demonstrate how to apply these filters using the Tasks call under the Company API. (For more specific information about the filters for endpoints beyond these examples, please reference the API Reference Guide).

The API call to retrieve all tasks from a Company is quite simple.

API Call

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/tasks" -H "accept: application/json"

Response Object

"tasks": [
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    },
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    }
  ]


However, we would obviously rarely want to look at every single Task for an entire Company. Instead, we would want to include some of the query parameters for the endpoint to reduce the number of results returned.

Query Parameter Description Data Type
operationType Only return tasks of a certain operation type (PLANTING, SPRAYING, SPREADING, HARVESTING, SWATHING, TILLAGE) string
startTime Only return tasks with a startTime on or after the supplied dateTime DateTime
endTime Only return task with an endTime on or before the supplied dateTime DateTime
lastModifiedStartTime Only return tasks that have been changed on the backend system on or after the dateTime supplied DateTime
filterConflictedTasks Filter out any tasks that are in the conflicted status within the system boolean

Each of the query parameters acts as a filter on the data that is returned with the API response. You can filter on just one parameter to cast a wide net in your search, or you can filter based on many different parameters to target specifically what you are looking for.

As an example, let’s look at the Operation Type query parameter. As indicated in the API Reference, the parameter accepts a string with one of several static values (Planting, Spraying, Spreading, Harvesting, Swathing, Tillage). Let’s choose Planting. (If you examine the swagger documentation for this API endpoint, you will see that it requires the companyId as part of the call. For more information on obtaining the companyId, please see the GFF Tutorial.

API Call

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/tasks?operationType=PLANTING" -H "accept: application/json"

Response Object

"tasks": [
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Planting",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    },
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Planting",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    }
  ]


By including Planting as a query parameter value, the response object returned by the API only includes the tasks for a company that have the parameter operationType set as PLANTING, instead of all tasks for the company.

It’s easy to filter on multiple query parameters as well. Let’s find all of the Planting tasks that were performed between Jan 1, 2019 and Jan 1, 2020. The startDate and endDate are query parameters that take strings formatted as dates.

API Call

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/tasks?operationType=PLANTING&startTime=01%2F01%2F2019&endTime=01%2F01%2F2020" -H "accept: application/json"

Response Object

"tasks": [
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Planting",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {"03/01/2019"},
      "vehicleId": "YJG238001",
      "endTime": {"03/01/2019"},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    },
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Planting",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {"04/25/2019"},
      "vehicleId": "YJG238001",
      "endTime": {"05/03/2019"},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    }
  ]


If we look through the entries in the JSON response object and compare it to our last call, we can see that while all of the operationType query parameters are still ‘PLANTING’, only the tasks for the year of 2019 have been returned.

By targeting your API calls using filters, you can assure that your application remains responsive and light.

Common Workflows

Locate Grower/Farm/Field (GFF) Ids

One of the most common operations you will have to perform in your FMIS is to find the id of one of the entity types of the AFS/PLM Connect API. The AFS/PLM Connect API maintains a standard hierarchy called Grower/Farm/Field (GFF). Though the Company entity sits above the GFF in the hierarchy, the GFF is a more useful grouping to use, as each Company most likely has many GFF groups, and so operates as the building block with no need of reference. (i.e. When you ARE the Company entity, it is more useful to think in terms of Grower/Farm/Field as that is the data you are you collecting and manipulating.)

Grower/Farm/Field Hierarchy

Each of the entities, whether it is a grower, farm, or field, has a name and an id associated with it. You will need to query these entities and retrieve their ids and other metadata often. Follow these steps as far down the hierarchy as you need to go for any particular operation.

Get Company Id

First, obtain your ‘companyId’. This is a simple API call with no route parameters that returns within its response object all companies the requesting user has access to view.

API Call

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies" -H "accept: application/json"

Response

This will return an array of JSON objects, with each object representing the metadata for a single company. Each individual JSON object has these return values:

Return Value Description Data Type
companies The top level of the JSON object that contains all of the data. object
companyId Unique identifier for the company string
companyName Name of the company string
description The description entered in a company’s profile string
emailAddress Email associated with the company string
"companies": [
    {
      "companyId": "ACA000000001",
      "emailAddress": "grower@test.com",
      "ownerName": "FirstName LastName",
      "companyName": "Example Ag Company 123",
      "description": "Example Ag Company 123 Description"
    },
    {
      "companyId": "ACA000000001",
      "emailAddress": "grower@test.com",
      "ownerName": "FirstName LastName",
      "companyName": "Example Ag Company 123",
      "description": "Example Ag Company 123 Description"
    }
  ],
  "response_metadata": {
    "next_cursor": "next_cursor",
    "next_link": "http://example.com/aeiou"
  }

The important response values from this call are ‘companyId’ and ‘companyName’. You will most likely use ‘companyName’ to identify which of the objects in the data array corresponds to your company. (In most cases this will be easy, as there will be a single company returned). Then simply grab the ‘companyId’.

Locate Grower Id

Now, you use use your ‘companyId’ to locate your ‘growerId’ in much the same way you located your ‘companyId’.

    curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/growers" -H "accept: application/json"

The call uses the following route parameters:

Route Parameter Description Data Type
companyId Unique identifier for the company string

Response

Similar to your call to the /company API, this returns a list of JSON objects.

Return Value Description Data Type
growers The top level of the JSON object that contains all of the data. object
created DateTime created object
name Name of the grower string
modified DateTime last modified object
growerId Unique identifier for each grower string
"growers": [
    {
      "created": {},
      "name": "Grower Dan",
      "modified": {},
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd"
    },
    {
      "created": {},
      "name": "Grower Dan",
      "modified": {},
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd"
    }
  ]

The return values you will look for this time are: ‘name’ and ‘growerId’. Again, you will most likely use the name to identify the correct grower, and then get the associated ‘growerId’.

Locate Farm Id

This process is identical to finding the ‘companyId’ and ‘growerId’. This time you will retrieve the list of farms for that ‘growerId’, and the call will be as follows:

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/growers/<GROWER ID>/farms" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string
growerId Unique identifier for the grower string

Response

Similar to your call to the /company API, this returns a list of JSON objects.

Return Value Description Data Type
farms The top level of the JSON object that contains all of the data. object
created DateTime created object
name Name of the farm string
modified DateTime last modified object
farmId Unique identifier for each farm string
growerId Unique identifier for each grower string
  "farms": [
    {
      "created": {},
      "name": "Test Farm",
      "modified": {},
      "farmId": "60452de1-2d7a-489f-a17f-539c5083d72c",
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd"
    },
    {
      "created": {},
      "name": "Test Farm",
      "modified": {},
      "farmId": "60452de1-2d7a-489f-a17f-539c5083d72c",
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd"
    }
  ]

Again, use ‘name’ to locate the correct farm, and then get the ‘farmId’.

Locate Field Data

Finally, you will query the farm for which you have the ‘farmId’ and retrieve a list of that farm’s fields.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/farms/<FARM ID>/fields" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string
farmId Unique identifier for the farm string

Response

Return Value Description Data Type
fields The top level of the JSON object that contains all of the data. object
created DateTime created object
name Name of the field string
modified DateTime last modified object
farmId Unique identifier for each farm string
growerId Unique identifier for each grower string
fieldId Unique identifier for each field string
"fields": [
    {
      "created": {},
      "name": "Back 40",
      "modified": {},
      "farmId": "60452de1-2d7a-489f-a17f-539c5083d72c",
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd",
      "setupData": {
        "guidanceLines": 0,
        "obstacles": 1,
        "boundaries": 3,
        "varietyZoneSetups": 1,
        "prescriptions": 2
      },
      "fieldId": "ea9226aa-94f9-43cf-aed8-818f667f49e9"
    },
    {
      "created": {},
      "name": "Back 40",
      "modified": {},
      "farmId": "60452de1-2d7a-489f-a17f-539c5083d72c",
      "growerId": "720343ab-9518-43f1-a292-07ecd0725ffd",
      "setupData": {
        "guidanceLines": 0,
        "obstacles": 1,
        "boundaries": 3,
        "varietyZoneSetups": 1,
        "prescriptions": 2
      },
      "fieldId": "ea9226aa-94f9-43cf-aed8-818f667f49e9"
    }
  ]

Once again, this will retrieve JSON objects, which when deserialized contain all of the fields under that farm. Search for your field with the ‘name’ return value, and retrieve the ‘fieldId’.

You will notice that at each level, you may find the id of each entity above it in the hierarchy, allowing you to easily breadcrumb your position in the tree. (i.e. A field JSON object will contain parameters for ‘fieldId’ - itself, and each entity above it - farmId, growerId, and companyId.)

Retrieve Field Task List

One of the main pieces of functionality of the AFS/PLM Connect APIs is to store Tasks. A Task is a file that represents some piece of work that has been performed on a field, and then uploaded. You will often want to retrieve lists of some or all Tasks that have been performed upon a field for some analytic feature of your application. These steps show you how to retrieve a list of Tasks for a specific field.

Locate your GFF ids

Using the steps as outlined in the GFF Tutorial, locate your:

  • companyId
  • fieldId

Retrieve Task List

Then you will use that data to make an API call to the Field Tasks endpoint.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/fields/<FIELD ID>/tasks" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string
fieldId Unique identifier for the field string

Response

This will return an array of JSON objects, with each object representing the metadata for a Task. Each individual JSON object has these return values:

Return Value Description Data Type
tasks The top level of the JSON object that contains all of the data. object
created DateTime created DateTime
description A description of the task performed string
modified DateTime last modified DateTime
operationType A designator of the type of activity the Task represents (Planting, Harvest, etc) string
vehicleId Unique identifier for the vehicle that performed the Task string
fieldId Unique identifier for each field string
taskId Unique identifier for each Task string
crop Descriptor of which crop was involved in the Task string
fileId Unique identifier for each file that represents a Task string
"tasks": [
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    },
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    }
  ]

Retrieve Company Task List

Sometimes when retrieving Tasks, particularly if your application deals with only a single company at a time, you may want to produce a list of all Tasks associated with that company.

Locate your Company id

Using the steps as outlined in the GFF Tutorial, locate your:

  • companyId

Retrieve List of Tasks

Then you will use that data to make an API call to the Company Tasks endpoint.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/tasks" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string

Response

This will return a JSON object with the metadata for the file you have requested.

Return Value Description Data Type
tasks The top level of the JSON object that contains all of the data. object
created DateTime created DateTime
description A description of the task performed string
modified DateTime last modified DateTime
operationType A designator of the type of activity the Task represents (Planting, Harvest, etc) string
vehicleId Unique identifier for the vehicle that performed the Task string
fieldId Unique identifier for each field string
taskId Unique identifier for each Task string
crop Descriptor of which crop was involved in the Task string
fileId Unique identifier for each file that represents a Task string
"tasks": [
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    },
    {
      "year": "2017",
      "created": {},
      "description": "Corn 2017 Harvest",
      "nativeFormat": "CN1",
      "modified": {},
      "operationType": "",
      "startTime": {},
      "vehicleId": "YJG238001",
      "endTime": {},
      "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
      "crop": "Corn",
      "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
      "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"
    }
  ]

Download Single Task File (Native Format)

Locate your GFF ids

The first step in retrieving a task file from the API is by locating the company, grower, farm, and field id’s that are related to that task. Follow the steps in the GFF Tutorial to retrieve:

  • companyId
  • growerId
  • farmId
  • fieldId

Get List of Tasks

Next you will retrieve the list of tasks that have been saved for that fieldId via the Field Task List Tutorial.

Get FileId for file

With the taskId, you may now locate the specific id for the file you wish to download by getting the metadata for that specific task.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/<COMPANY ID>/tasks/<TASK ID>" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string
taskId Unique identifier for the Task in question string

Response

Within the response JSON object, you will find the return value fileId. This is the id for the file that was uploaded in association with this task. Other useful return values such as operationType, and nativeFormat may also be found.

Return Value Description Data Type
nativeFormat The native file format of the uploaded TASK string
year The year the Task applies to string
created DateTime created DateTime
description Description of the Task performed string
modified DateTime last modified DateTime
operationType A designator of the type of activity the Task represents (Planting, Harvest, etc) string
vehicleId Unique identifier for the vehicle that performed the Task string
fieldId Unique identifier for each field string
taskId Unique identifier for each Task string
crop Descriptor of which crop was involved in the Task string
fileId Unique identifier for each file that represents a Task string
 "year": "2017",
  "created": {},
  "description": "Corn 2017 Harvest",
  "nativeFormat": "CN1",
  "modified": {},
  "operationType": "",
  "startTime": {},
  "vehicleId": "YJG238001",
  "endTime": {},
  "taskId": "d290f1ee-6c54-4b01-90e6-d701748f0852",
  "crop": "Corn",
  "fieldId": "9441d66c-24f8-43c4-b08f-dc8d76746a0e",
  "fileId": "d290f1ee-6c54-4b01-90e6-d701748f0852"

Download the file

Now that you have the fileId for the file you wish to download, a simple query to the Download API using the locationUrl will retrieve your file. Please see the File Upload and Download Tutorial for information on file chunking and how to retrieve your full file.

File Upload and Download

Uploading Files

Uploading a file using the AFS PLM Connect Data Sharing API takes only a few simple steps.

1. Get Company Id

First, obtain your ‘companyId’. Follow the first steps in the Locate GFF Ids Tutorial to collect the id you need.

2. Upload File

Next, you will use the ‘companyId’ to make a call to the file upload API. Keep in mind that this is a POST http call, and not the GET used to query data. For best use, you will want to add the following query parameters to the API call:

Query Parameter Description Data Type
fileName The name of the file you are uploading string
file The actual file you wish to upload string

API Call

curl -X POST "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "fileName=test" -F "file=@thumbs-up.gif;type=image/gif"

Shapefiles

If you are uploading a shapefile, there is a final, optional query parameter you MUST include.

Query Parameter Description Data Type
dataType Type of shapefile you are uploading. Options are: (SETUP, RX, BOUNDARY, GUIDANCE, OBSTACLE) string

An example of uploading a shapefile is as follows:

curl -X POST "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files" -H "accept: application/json" -H "Content-Type: multipart/form-data" -F "fileName=test" -F "file=@thumbs-up.zip;type=zip" -F "dataType=BOUNDARY"

Response

The response to this API call will be a JSON object containing a single return value.

Return Value Description Data Type
fileId Unique identifier for the file uploaded. string
{
  "fileId": "6c8c45b4-a000-4796-9d77-fcb8b789648b"
}

Downloading Files

Downloading files is still easy, but it does require a few more steps to complete.

Get Company Id

First, simply repeat the steps listed in the Locate GFF Ids Tuturial to obtain your companyId.

Get File Id

Next, you will need to find the fileId of the file you wish to download. With your companyId, issue a call to the API interface, as in the following example:

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string

However, this call will return all files for the company requested. If you have many files you’ve uploaded, and don’t wish to page through them all, several filtering query parameters are available for the File API. The query parameters are as follows:

Query Parameter Description Data Type
dataType The data type for a shapefile. Options include: (SETUP, RX, TASK, and EXPORT) string
lastModifiedStartTime A datestamp indicating the last time the file was updated in the system. dateTime
lastModifiedEndTime A datestamp indicating the last time the file was updated in the system. dateTime
curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files?dataType=TASK&lastModifiedStartTime=01%2F02%2F03" -H "accept: application/json"

Get File Size

Once you have the fileId, you must determine the size of the file you are going to download. In order to better facilitate data connections to mobile applications, files from the AFS PLM Connect Data Sharing API must be downloaded in chunks no larger than 20MB. This means that in order to know how many chunks you are going to download, you must find the file size.

File size is stored as part of the file metadata, which can be retrieved with an API call to the API, as in the following example:

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files/6c8c45b4-a000-4796-9d77-fcb8b789648b/" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string

Response

The response to your call is a JSON object containing the return values:

Return Value Description Data Type
locationURL The api url used to download this file string
fileSize Size of the file in bytes. Used for file chunking. int
sourceType Designator of the source type of the file (e.g. "Vehicle") string
created DateTime created DateTime
modified DateTime last modified DateTime
name The name of the file string
source Descriptor of the source of the file, usually vehicle name string
fileId Unique identifier for each file string
"locationUrl": "/companies/{companyId}/files/{fileId}/download",
  "fileSize": 4350315,
  "sourceType": "Vehicle",
  "created": {},
  "dataType": "TASK",
  "name": "12345678.cn1.zip",
  "modified": {},
  "source": "Test Combine",
  "fileFormat": "CN1",
  "fileId": "6c8c45b4-a000-4796-9d77-fcb8b789648b",
  "status": "COMPLETE"

One of these return values is an integer called fileSize. This fileSize is in bytes, which is the same unit type we will use to get the file chunks in the next step, so no conversion is necessary.

Download File Chunks

Once you have the size of your file, you are ready to begin downloading chunks. The AFS PLM Connect Data Sharing API file size limit is 20MB, which is 20971520 bytes. To download a file chunk, you simply use the Download endpoint under the File API structure.

If your total file size is less than 20971520 bytes, you do not need to use the Range query parameter, only make the API call, as follows.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files/6c8c45b4-a000-4796-9d77-fcb8b789648b/download" -H "accept: application/json"
Route Parameter Description Data Type
companyId Unique identifier for the company string
fileId Unique identifier for a file string

However, if your file is larger than the file chunk size limit, you MUST use the Range query parameter to download the file a small piece at a time.

curl -X GET "https://virtserver.swaggerhub.com/CNH/EVO-FMIS-API/1.0.2/companies/bcb93cf1-4a33-4b70-a653-6bfdc5401eb9/files/6c8c45b4-a000-4796-9d77-fcb8b789648b/download" -H "accept: application/json" -H "Range: 0-20971520"
Route Parameter Description Data Type
companyId Unique identifier for the company string
fileId Unique identifier for a file string
Query Parameter Description Data Type
Range The range (in bytes) of the file chunk you wish to download string

To download the entire file, you will need to make MULTIPLE calls to the API, one for each file chunk range.

Conflicted Files

What is a conflicted file?

AFS / PLM Connect compares geospatial characteristics of the incoming data for overlap with any active boundaries of company fields previously recorded. If significant data overlap is detected with at least one existing active field, AND the GFF metadata for the incoming data does not match metadata associated with the existing field then a conflict is flagged to the user. In simpler terms, if the system detects that a new field overlaps an existing one, and it's not the same field, there is a conflict.

How is conflict resolved?

Conflict must be resolved manually, and conflicted data is by the API responses only in certain circumstances, as outlined in the next section. A user must intervene to resolve the conflicts, and therefore make the data available to your FMIS.

Depending on the conflict - i.e. single field v. multiple fields overlap, and GFF meta-data match in case of multiple field overlap - the user has the option to resolve conflicts by associating the new data with a new field, splitting the data across multiple fields, or in the case of a majority data overlap adding it to an existing field.

Can an FMIS access grower data before conflicts are resolved?

Conflicted data will be available to an FMIS upon the following conditions: * When a grower has chosen to share ALL of their data with the Adviser / Adviser Company. * If a subset of data is being shared with the Adviser, then data with conflicts will be shared when the grower/ Adviser has reviewed and resolved conflicts in AFS/PLM Connect portal.

Filter Conflicted Tasks

The AFS/PLM API provides an optional flag – filterConflictedTasks – that FMIS may include in the "GET /companies/{companyId}/tasks" API to control access to data with unresolved conflicts. By Default value of this flag is FALSE, so that the data with unresolved conflicts is included in the API response. When the flag is included in the request and set to TRUE, the API response will exclude any data files with unresolved conflict. The filterConflictedTasks flag takes effect only when ALL data is being shared with the Adviser / Adviser Company.

Error Handling

The AFS/PLM Connect API uses standard http response codes to indicate success or failure. In the event that a call fails, a JSON response object is returned with the following return values:

Return Value Description Data Type
code Application specific error identifying the specific error encountered. string
message string
target string
details array
innerError object

Connecting to the Correct Environment

When developing an application, you rarely want to make changes and perform testing in a live environment, particularly after you’ve shipped your product and have a steady user base. To that end, CNH provides two environment contexts for its APIs: Staging and Production. The environments are identical, requiring only that you change out your connection string and authorization endpoint to connect to either.

Environment Base URL Authorization Endpoint
Staging https://stg.api.cnhind.com https://stg.identity.cnhind.com/authorize
Production https://ag.api.cnhind.com https://identity.cnhind.com/authorize

It’s highly recommended to abstract away the connection strings from your code to allow you to easily swap between environments with your application.

FMIS Setup Data

CNHi will provide FMIS partners initial setup data for testing their application. Please follow the following steps to upload test data for your application development and testing purpose. There are two set of files for testing:

• Task files – Should be uploaded using AFS/PLM Connect portal.

• Setup files – Should be uploaded using FMIS API file upload calls.

Test data download: FMIS Setup(test) data.zip

Reset Password

The company contact should go here and reset his/her password by clicking on Login and then “Forgot password”.

FMIS Setup Data - Reset Password

Enter your email address and click send. You should receive password reset link within few minutes. Open the link and reset your password. The default password will be sent to you, but you won’t be able to use this password to login. But you will need it to reset your password.

Login to AFS/PLM Connect (EVO)

Using new credentials log in to AFS/PLM Connect marketing environment. FMIS Setup Data - Login to AFS/PLM Connect (EVO)

Upload Tasks into EVO

Upload all task files to EVO by clicking the two arrows at the top right corner highlighted yellow in the image below. This feature allows you to upload task files from your disk. FMIS Setup Data - Upload Tasks into EVO

Frequently Asked Questions

Developer Portal

Authentication

API Calls

Glossary

This is a guide to the terms and acronyms commonly used when describing the AFS/PLM Connect API.

Term Acronym Definition Description
ADAPT Ag Data Application Programming Toolkit A set of software tools to assist with creating open source solutions that enhance agricultural data interoperability between systems that create and manage agricultural data.
Adviser An adviser is a professional who employs a scientific study of soil management and crop production including irrigation and use of herbicides, pesticides, and fertilizers. This study is then used to guide a grower / farmer to look for ways to increase soil productivity, quality of seed and the nutritional value of crops.
AFS Advanced Farming System Case IH’s full offering of Precision Farming solutions technology to increase productivity and efficiency year round.
AFS/PLM Connect Portal Case IH and New Holland's respective online user portals which provide access to telematics enabled vehicles and agronomic data. Customers can enable data sharing with 3rd party advisers/agronomists via the data sharing API's via these portals.
Agronomist The terms adviser and agronomist are often used interchangeably (see Adviser).
API Application Program(ming) Interface Refers to software which facilitates the accurate and efficient sharing of data between two systems. API’s are commonly referenced as our standardized method of sharing agronomic data with the producer’s assigned service provider.
Auth0 Auth Zero OAuth service provider that hosts the OAuth authentication server.
Boundary
Boundary Type Enumerable for the type of boundary. The options are the following: INNER or OUTER
CN1 / Voyager 2 A proprietary data file format used by all CNH OEM color displays until the Phoenix release.The Voyager2 file format is an expansion of the original Voyager file format, to support additional features such as guidance lines, fuel mapping, boundaries, variety mapping, field and seather notes, etc. Consists of a parent *.CN1 directory that contains a set of hierarchically structured folders and files.
Company Within the AFS PLM Connect Data API, company represents a business entity to which assets are assigned in fleets. A single AFS PLM account may have multiple Companies created under the account, and each Company will have at least one fleet associated with it. Companies are the top level of the G/F/F/T hierarchy, with growers assigned to companies.
Conflicted Task When a task file is uploaded to the AFS/PLM Portal from the vehicle, there could be conflicting data that stops the automatic classification of data into the G/F/F/T hierarchy. This will require manual input from the user to resolve the conflict and insure that the data is indexed to the correct Grower / Farm / Field.Conflicted tasks will only be shared with Advisers that the grower has specified with full permissions to their data. If there is any filtering of data (by field or by operation type), then no conflicted tasks will be shared with the adviser.
Crop String to represent the crop type. i.e. "Corn", or "Soybean", etc...
Farm The second level of the G/F/F/T hierarchy.
Field The third level of the G/F/F/T hierarchy.
File Data Type Enumerable for the file data type. The options are the following: BOUNDARY, RX, GUIDANCE, TASK
File Range Range of bytes to download from a file when using the GET files/download API. Up to 20 megabytes may be requested at a time. Example; bytes=0 20971520
File Status Item Enumerable for the status for the the POST Files API. The options are the follows: UPLOAD_PENDING, UPLOAD_COMPLETE, UPLOAD_FAILED
File Transfer Subscription Status Boolean value to indicate if the vehicle has the File Transfer Subscription turned on or off. This feature supports the sending of files to and from the display.
FilterConflictedTask Boolean value that allows the FMIS to specify if they would like to receive conflicted tasks with the GET /companies/{companyId}/tasks API call. This will be "false" by default which means conflicted tasks will be shared unless this value is set to "true".
FMIS Farm Management Information System A software application, usually third party, that allows growers and advisers to view and manipulate agronomic data. Connections can be created between AFS/PLM Connect Portals and individual FMIS software platforms to allow the sharing of data between growers and advisers via the data sharing API's.
G/F/F/T Grower / Farm / Field / Task This the the hierarchy of how data is organized within both the AFS/PLM Portal and within agronomic files.
GeoJSON Geographical JavaScript Object Notation GeoJSON is a format for encoding a variety of geographic data structures. You may find the specification here. http://geojson.org/
Grower The highest level of the G/F/F/T hierarchy.
ISOXML / ISO11783 International Standards Organization Extensible Markup Language Standard file format for data exchange, established within ISO11783. https://www.iso.org/standard/57556.html
OAuth 2.0 OAuth is an open standard for access delegation, commonly used as a way for Internet users to grant websites or applications access to their information on other websites but without giving them the passwords.
Operation A logical grouping of tasks by the operation type. So if you want to see all of the PLANTING data for an entire company you can use the GET companies/{companyID}/operations API to with the Operation Type filter of PLANTING. This will return a list of all tasks in the company that are PLANTING. You can also get this information for a specific field using the GET companies/{companyID}/fields/{fieldId}/operations.
Operation Type Enumerable for the type of Operation. The options are the following: ALL, PLANTING, SPRAYING, SPREADING, HARVESTING, SWATHING, TILLAGE
Operation Type Filter Enumerable for filtering the type of Operation in API calls. The options are the following: ALL, PLANTING, SPRAYING, SPREADING, HARVESTING, SWATHING, TILLAGE
Original Raw File Format The original file format for the agronomic data that is collected by the vehicle display. This could be either CN1, ISOXML, or PFDB.
PFDB Precision Farming Database
PLM Precision Land Management New Holland's full range of Precision Farming solutions that can be tailored to suit your individual needs.
Prescription File
Setup Data File
SHP Shapefile Industry standard spatial vector data format developed by Esri. Commonly used for moving precision farming data between displays and FMIS applications while preserving data and position accuracy in those different contexts.
Status Item Enumerable for the status of the bulk file export API's (Tasks, Boundaries, Operations). The options are the following: QUEUED, PROCESSING, SENDING, COMPLETED, FAILED
Task The lowest level of the G/F/F/T hierarchy. This refers to the actual data that is collected on the vehicle while performing work in a field. There is always a file associated to with each task.
Vehicle Generally refers to a piece of equipment that is self propelled (fitted with an engine and ground drive transmission).