Skip to the main content
John Deere Logo

Develop with Deere


Operations Center - Files

Click here for more information on how to get started.

Files Guide

Nearly every file in the MyJohnDeere API's is a compressed zip file. The contents of that zip file will vary, as John Deere Operations Center supports a wide range of file formats. For an overview of the My Files UI and a complete list of displays that we support, check out the MyJohnDeere Operations Center help page. Many of the file formats we support are proprietary. We provide ADAPT plugins to read and write Deere file formats. For more information on the ADAPT framework and the John Deere ADAPT plugins, see our offline SDK information.

File Types

Files are classified by the type of data they contain. It is possible for one file to contain multiple data types - for example, if a zip file contains both setup data and rx data, it will be labeled as "Setup". If a file contains both setup and documentation data, it will be labeled as "Doc".

Setup

Setup files contain configuration data that helps prepare a machine to execute a task. This may include Fields, Boundaries, Guidance Lines, Products, etc., along with Jobs, Tasks, or Work Orders.

Rx

An Rx or "Prescription" file divides a field into individual zones and specifies a different application rate for each zone. They are used for seeding, to control how many seeds are planted in each part of a field, and for application, to control how much of a chemical or fertilizer is applied to each part of a field. John Deere displays support both proprietary and ESRI shapefile base prescriptions. A shapefile prescription requires:

  • The shapefile must be in a directory named "Rx".

  • A complete shapefile must include the following three file components:

    • .shp
    • .shx
    • .dbf

  • Geometries must be of type Polygon or MultiPolygon, and must use WGS84 coordinates.

  • There must be at least one numeric Rate column. A unit of measure is not required (though you can optionally add it as another column - see best practices below). The user will be prompted to confirm the units at the time of prescription selection.

  • Optionally, you can color-code the prescription by adding a "zone_color" column with ARGB color values.

In addition, the following are optional best practices which improves the usability of the prescription for the end user:

  • Specify the target Client, Farm, Field, and Product in the file name of the individual shapefile file components. This will enable the end user to have a better context of where the prescription should be used and for what product.

  • The following outlines the suggested naming pattern for compressed zip files.

    • <Client>_<Farm>_<Field>_<Product>.zip
    • Rx (folder)
    • <Client>_<Farm>_<Field>_<Product>.shp
    • <Client>_<Farm>_<Field>_<Product>.shx
    • <Client>_<Farm>_<Field>_<Product>.dbf

  • In the following example, the Client, Farm, and Field is BradJones, CentralFarm, and North40 respectively with a target product of RoundUp:

    • BradJones_CentralFarm_North40_RoundUp.zip
    • Rx (folder)
    • BradJones_CentralFarm_North40_RoundUp.shp
    • BradJones_CentralFarm_North40_RoundUp.shx
    • BradJones_CentralFarm_North40_RoundUp.dbf

  • Specify the target prescription rate units as the column name for the numeric Rate column (limited to 10 characters). This will make it easier on the end user to properly select the proper Rate column and the target unit of measure when setting up the prescription on an in field display/rate controller. Suggested rate unit column names are as follows:

    • Liquid Units:

      • gal_p_ac (gallons per acre)
      • floz_p_ac (fluid ounces per acre)
      • ml_p_ha (milliliters per hectare)
      • L_p_ha (Liters per hectare)

    • Dry Units:

      • lb_p_ac (pounds per acre)
      • g_p_ac (grams per acre)
      • kg_p_ac (kilograms per acre)
      • ton_p_ac (US tons per acre)
      • tonnes_p_h (metric tonnes per hectare)

There is an extensive sample in our sample data repository.

Doc

A Doc or "Documentation" file contains data that was recorded by a machine in the field. This includes raw sensor data as well as point by point location information. For a simpler way to consume documentation data, consider using our FieldOperations API.

Creating a File

Uploading a file is a two-step process. First, make a POST request to /organizations/{orgId}/files. This creates a file record in our system, and the response will include the generated file ID. Then, make a PUT request to /files/{fileId} to upload the file content. More details on this are on the Files API page.


Endpoints

List Files

GET

/files
This resource retrieves the list of available files. For each file, the response will link to the following resources:
  • owningOrganization: View the org that owns the file.
  • partnerships: View the partners this file is shared with.

OAuth Scope Required: files,ag3

Request URI

GET https://sandboxapi.deere.com/platform/files

Accept: application/vnd.deere.axiom.v3+json

ParameterTypeDescription & ExampleDefaultIn
filter
Optional

string

Takes ALL or MACHINE. ALL shows all the files in the org. MACHINE shows only the files sent from a machine to the host.

Example: MACHINE

ALL

query

fileType1
Optional

integer

Takes the file type number.

Example: 0

N/A

query

transferable
Optional

boolean

Filters by whether a file is transferable

Example: true

N/A

query

x-deere-signature
Optional

string

x-deere-signature should be managed by the client per user per API. For a new user/new API, the first request will have a blank value for x-deere-signature. Changes can be tracked with the x-deere-signature returned in the response. If the response has not changed since the last API call, the value of x-deere-signature is not changed and the client should use the same String Token next time.

Example: 520122365ebb4870a344784570d202c7

header

FieldTypeDescription & Example
x-deere-signature
string
A new x-deere-signature response header will be included if the response has changed since last api call.
Example: 520122365ebb4870a344784570d202c7
id
string
The id of the file.
Example: 577499742
name
string
The name of the file.
Example: back40.zip
type1
string
The type of the file.
Example: SETUP
createdTime2
datetime
Time at which the file was created.
Example: 2015-02-03T10:42:24.282Z
modifiedTime2
datetime
Time at which the file was last modified.
Example: 2015-02-03T10:42:24.282Z
nativeSize
integer
Size of the file.
Example: 72946
source
string
Account with which the file was created.
Example: JohnDoe
transferPending
boolean
Indicates whether the file is currently in a pending transfer to a machine.
Example: false
visibleViaShare
string
Indicates whether you own the file, or it was shared with you. The value will be either "owned" or "manual".
Example: owned
shared
boolean
Indicates whether the file is shared with another org.
Example: false
status
string
Indicates whether the file can be transferred to a machine. Possible values are: Upload Pending, Ready, and In Progress.
Example: UPLOAD_PENDING
archived
boolean
Indicates whether the file has been archived.
Example: false
newDEPRECATED
boolean
Indicates whether the file is new.
Example: false
format
string
Indicates the plugin type.
Example: IntegraVersaPlugin
manufacturer
string
Indicates the manufacturer.
Example: AgLeader
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
x-deere-signature: 520122365ebb4870a344784570d202c7
{
  "links": [
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/files"
    }
  ],
  "total": 1,
  "values": {
    "links": [
      {
        "rel": "self",
        "uri": "https://sandboxapi.deere.com/platform/files"
      }
    ],
    "total": 1,
    "values": [
      {
        "links": [
          {
            "rel": "owningOrganization",
            "uri": "https://sandboxapi.deere.com/platform/organizations/1234"
          },
          {
            "rel": "partnerships",
            "uri": "https://sandboxapi.deere.com/platform/files/466578633/partnerships"
          },
          {
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/466578633"
          }
        ],
        "id": "577499742",
        "name": "back40.zip",
        "type": "SETUP",
        "createdTime": "2013-01-04T14:08:51.104Z",
        "modifiedTime": "2013-01-04T14:08:51.104Z",
        "nativeSize": "72946",
        "source": "JohnDoe",
        "transferPending": "false",
        "visibleViaShare": "owned",
        "shared": "false",
        "status": "UPLOAD_PENDING",
        "archived": "false",
        "assigned": "false",
        "new": "false"
      }
    ]
  }
}


View/Download A File

GET

/files/{fileId}
This resource allows the client to view or download a file.

Note: Only files smaller than 50 MB can be downloaded at once. Larger files will need to be downloaded in chunks. To download in chunks, you can use the Range request header, or the offset and size request parameters. If both are used, the request header will take precedence.

To view a file's metadata, choose the application/vnd.deere.axiom.v3+json Accept Header. To download the file to the client software, choose a /zip or octet-stream Accept Header. The following example will show a GET call to view a files metadata. The response will contain links to the following resources:

  • owningOrganization: View the org that owns the file.
  • partnerships: View a list of the partnerships through which the file is shared, if applicable.
  • initiateFileTransfer: Request to send this file to a specified machine.
  • wdtCapableMachines: View a list of machines in the org which can receive this file.

Request Header

To download the file in chunks of bytes, you can use the range header with the following form: Range:bytes=startIndex-endIndex

Sample Header: Range:bytes=0-1000

OAuth Scope Required: files,ag3

Request URI

GET https://sandboxapi.deere.com/platform/files/{fileId}

List of valid Accept headers:
a: application/zip
b: application/octet-stream
c: application/x-zip
d: application/x-zip-compressed
e: multipart/mixed
f: application/vnd.deere.axiom.v3+json
ParameterTypeDescription & ExampleDefaultIn
offset

Required

integer

Allows client to download file in chunks. -1 will download entire file. For smaller pieces, enter offset point (in bytes) in this parameter.

Example: -1

N/A

size

Required

integer

Allows client to download file in chunks. -1 will download entire file. For smaller pieces, enter size (in bytes) in this parameter.

Example: -1

N/A

fileId

Required

string

File Id.

Example: 577499742

N/A

path

FieldTypeDescription & Example
id
string
The id of the file.
Example: 577499742
name
string
The name of the file.
Example: back40.zip
type1
string
The type of the file.
Example: SETUP
createdTime2
datetime
Time at which the file was created.
Example: 2015-02-03T10:42:24.282Z
modifiedTime2
datetime
Time at which the file was last modified.
Example: 2015-02-03T10:42:24.282Z
nativeSize
integer
Size of the file.
Example: 72946
source
string
Account with which the file was created.
Example: JohnDoe
transferPending
boolean
Indicates whether the file is currently in a pending transfer to a machine.
Example: false
visibleViaShare
string
Indicates whether you own the file, or it was shared with you. The value will be either "owned" or "manual".
Example: owned
shared
boolean
Indicates whether the file is shared with another org.
Example: false
status
string
Indicates whether the file can be transferred to a machine. Possible values are: Upload Pending, Ready, and In Progress.
Example: UPLOAD_PENDING
archived
boolean
Indicates whether the file has been archived.
Example: false
newDEPRECATED
boolean
Indicates whether the file is new.
Example: false
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
{
  "id": "577499742",
  "name": "back40.zip",
  "type": "SETUP",
  "createdTime": "2015-02-03T10:42:24.282Z",
  "modifiedTime": "2015-02-03T10:42:24.282Z",
  "nativeSize": "72946",
  "source": "JohnDoe",
  "transferPending": "false",
  "visibleViaShare": "owned",
  "shared": "false",
  "status": "UPLOAD_PENDING",
  "archived": "false",
  "assigned": "false",
  "new": "false",
  "links": [
    {
      "rel": "owningOrganization",
      "uri": "https://sandboxapi.deere.com/platform/organizations/2101"
    },
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/files/466578633"
    }
  ]
}


Upload/Update A File

PUT

/files/{fileId}
This resource allows the client to upload or update a file. The client must create a file ID before uploading a file.
Note: In your sample request for uploading a file, the content-type can be any of the following:
  • application/octet-stream
  • application/zip
  • application/x-zip
  • application/x-zip-compressed
  • multipart/form-data
  • multipart/mixed

OAuth Scope Required: files,ag3

Request URI

PUT https://sandboxapi.deere.com/platform/files/{fileId}

Accept: application/vnd.deere.axiom.v3+json

CodeMessageDescription

204

No Content
The file was updated.

400

  • Must be between 1 and 45 characters
  • Should not contain invalid characters.
File names must be between 1 and 45 characters and may only contain international alphanumeric characters, spaces, and any of the following: ".,-_". Specifically, it must match the following Unicode regular expression: ^[\p{N}\p{L}.,_ \-]+$
FieldTypeDescription & Example
PUT: https://sandboxapi.deere.com/platform/files/fileID

Accept: application/vnd.deere.axiom.v3+json
Authorization: OAuth realm="",oauth_timestamp="1406138640", oauth_nonce="I2sX0Z", oauth_consumer_key="com.deere.example", oauth_token="a5633e06-bd09-43a5-942a-2e1255681ca9", oauth_version="1.0", oauth_signature_method="HMAC-SHA1", oauth_signature="CX7E9KJra9ok5WpIejjFpafh8lE%3D"
Content-Type: application/octet-stream

PUT https://partnerapi.deere.com/platform/files/fileID

Accept: application/vnd.deere.axiom.v3+json
Authorization: {
Bearer
}
Content-Type: application/vnd.deere.axiom.v3+json
{
  "id": "fileID",
  "archived": true,
  "delayProcessing": false
}

204 No Content

Pragma: no-cache
Date: Wed, 23 Jul 2014 18:04:00 GMT
Server: Apache-Coyote/1.1
X-Deere-Handling-Server: ldxtc1
X-Deere-Elapsed-Ms: 645
Transfer-Encoding: chunked
Content-Language: en-US
Content-Type: application/vnd.deere.axiom.v3+json;charset=UTF-8
Cache-Control: no-cache, no-store, max-age=0
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Expires: Thu, 01 Jan 1970 00:00:00 GMT


List an Org's Files

GET

/organizations/{orgId}/files
View a list of an org's files. This resource allows for pagination. For each returned file, the response will link to the following resources:

  • owningOrganization: View the org that owns the file.
  • partnerships: View the partnerships through which the file is shared, if applicable.
  • initiateFileTransfer: Submit a transfer request for the specified file.
  • machinesEligibleToReceiveFile: List of WDT-capable machines that the specified file can be sent to.
  • sendFileToMachine: The same as "initiateFileTransfer."
  • wdtCapableMachines: The same as "machinesEligibleToReceiveFile."

OAuth Scope Required: files,ag3

Request URI

GET https://sandboxapi.deere.com/platform/organizations/{orgId}/files

Accept: application/vnd.deere.axiom.v3+json

ParameterTypeDescription & ExampleDefaultIn
filter

string

Takes ALL or MACHINE. ALL shows all the files in the org. MACHINE shows only the files sent from a machine to the host.

Example: MACHINE

ALL

query

startDate

datetime

Takes a timestamp (in UTC) that indicates when the file was created. Timestamp format is the ISO 8601 standard.

Example: 2013-01-04T14:08:51.104Z

N/A

query

endDate

dateTime

Takes a timestamp (in UTC) that indicates when the file was created. Timestamp format is the ISO 8601 standard

Example: 2015-02-03T10:42:24.282Z

N/A

query

fileType1

integer

Takes a number that identifies the file type.

Example: 0

N/A

query

archived

boolean

Allows client to filter files according to whether they have been archived. TRUE returns only archived files.

Example: true

false

query

status

string

Allows client to filter files according to whether they are transferable to machines. Takes TRANSFERABLE and NON_TRANSFERABLE.

Example: TRANSFERABLE

N/A

query

orgId

Required

string

Organization

Example: 5343535

N/A

path

x-deere-signature

string

x-deere-signature should be managed by the client per user per API. For a new user/new API, the first request will have a blank value for x-deere-signature. Changes can be tracked with the x-deere-signature returned in the response. If the response has not changed since the last API call, the value of x-deere-signature is not changed and the client should use the same String Token next time.

Example: 520122365ebb4870a344784570d202c7

header

FieldTypeDescription & Example
x-deere-signature
string
A new x-deere-signature response header will be included if the response has changed since last api call.
Example: 520122365ebb4870a344784570d202c7
id
string
The id of the file.
Example: 577499742
name
string
The name of the file.
Example: back40.zip
type1
string
The type of the file.
Example: SETUP
createdTime2
datetime
Time at which the file was created.
Example: 2015-02-03T10:42:24.282Z
modifiedTime2
datetime
Time at which the file was last modified.
Example: 2015-02-03T10:42:24.282Z
nativeSize
integer
Size of the file.
Example: 72946
source
string
Account with which the file was created.
Example: JohnDoe
transferPending
boolean
Indicates whether the file is currently in a pending transfer to a machine.
Example: false
visibleViaShare
string
Indicates whether you own the file, or it was shared with you. The value will be either "owned" or "manual".
Example: owned
shared
boolean
Indicates whether the file is shared with another org.
Example: false
status
string
Indicates whether the file can be transferred to a machine. Possible values are: Upload Pending, Ready, and In Progress.
Example: UPLOAD_PENDING
archived
boolean
Indicates whether the file has been archived.
Example: false
newDEPRECATED
boolean
Indicates whether the file is new.
Example: false
format
string
Indicates the plugin type.
Example: IntegraVersaPlugin
manufacturer
string
Indicates the manufacturer.
Example: AgLeader
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
x-deere-signature: 520122365ebb4870a344784570d202c7
{
  "links": [
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/files"
    }
  ],
  "total": 1,
  "values": {
    "links": [
      {
        "rel": "self",
        "uri": "https://sandboxapi.deere.com/platform/files"
      }
    ],
    "total": 1,
    "values": [
      {
        "links": [
          {
            "rel": "owningOrganization",
            "uri": "https://sandboxapi.deere.com/platform/organizations/1234"
          },
          {
            "rel": "partnerships",
            "uri": "https://sandboxapi.deere.com/platform/files/466578633/partnerships"
          },
          {
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/466578633"
          }
        ],
        "id": "577499742",
        "name": "back40.zip",
        "type": "SETUP",
        "createdTime": "2013-01-04T14:08:51.104Z",
        "modifiedTime": "2013-01-04T14:08:51.104Z",
        "nativeSize": "72946",
        "source": "JohnDoe",
        "transferPending": "false",
        "visibleViaShare": "owned",
        "shared": "false",
        "status": "UPLOAD_PENDING",
        "archived": "false",
        "assigned": "false",
        "new": "false"
      }
    ]
  }
}


Create A File ID

POST

/organizations/{orgId}/files
The POST call below shows the creation of file id "55" in organization "73" in Operation Center. The response "location" header will return the new file ID in the link returned. The client software will then use the new file ID, to upload the file.

OAuth Scope Required: files,ag3

Request URI

POST https://sandboxapi.deere.com/platform/organizations/{orgId}/files

Accept: application/vnd.deere.axiom.v3+json

Content-Type: application/vnd.deere.axiom.v3+json
ParameterTypeDescription & ExampleIn
orgId

Required

string

Organization

Example: 73

path

name

Required

string

File name.

Example: back40Seeding.zip

body

delayProcessing

boolean

Set to false to force the file to be processed if it would otherwise delay processing. Can only be used with a copyFrom link.

Example: false

body

links

Array of Links

Currently only supports a copyFrom rel, which can be passed to copy another file into the destination organization.

Example: [{"rel": "copyFrom", "uri": "/files/12345"}]

body

CodeMessageDescription

201

Created
The file was successfully created.

400

  • Must be between 5 and 69 characters
  • Should not contain invalid characters.
File names must be between 5 and 69 characters and may only contain international alphanumeric characters, spaces, and any of the following: ".,-_". Specifically, it must match the following Unicode regular expression: ^[\p{N}\p{L}.,_ \-]+$
FieldTypeDescription & Example
total
integer
---
Example: 1
{
  "name": "back40Seeding.zip"
}

HTTP/1.1: 201 Created

Date: Wed, 31 Aug 2016 16:18:22 GMT
Content-Encoding: gzip
X-Deere-Handling-Server: ldxx90tc5
X-Frame-Options: SAMEORIGIN
X-Deere-Elapsed-Ms: 257
Vary: Accept-Encoding
Content-Type: text/plain
Location: https://sandboxapi.deere.com/platform/files/55
Cache-Control: max-age=0, no-cache
Connection: keep-alive
Content-Length: 20
Expires: Wed, 31 Aug 2016 16:18:22 GMT


Additional Information

  1. File Types

    NumberTypeDescription
    0SETUPCollection of attributes sent to a precision agricultural display to help ensure accurate execution and documentation of work. Examples of the attributes include: client, farm, field, boundary, guidance lines, products, machines, implements, operators, and equipment offsets.
    1PRESCRIPTIONA file developed for a precision agricultural display and implement controller to command the rate of product applied for a specific zone inside a predefined boundary.
    2INVALIDThe uploaded file has an unsupported format. The file cannot be processed, downloaded, or sent to a machine.
    3UNKNOWNThis file has not yet been fully uploaded or is still being processed. Once processed, the type should be automatically updated.
    4DOCOperational data captured from a precision agricultural display. The approved data operations are: Seeding, Harvest, Application, Tillage & Other.
    5JDBACKUPN/A
    6HICEleven geospatially traceable attributes documenting the quality of each cotton module harvested by a John Deere 7760 Cotton Picker with the added Application Controller.
    7TIMBERLINKN/A
    8EXPORTRemoval of processed and edited field data from Operations Center in a shapefile format.
    11TIMBERMATICN/A
    13PDFA normal PDF file.
    14ISO_SETUPN/A
    15BOUNDARYN/A
    16TIMBERMANAGERN/A
    17SUGAR_HARVESTDocumentation data for sugar harvesters.
  2. All timestamps are in the ISG 8601 format.

  3. File Formats

    FormatManufacturerDescription
    GS2_1800John DeereFiles written by a Deere Greenstar 2 1800 display.
    GS2_2600John DeereFiles written by a Deere Greenstar 2 2600 display.
    GS2_CommandCenterJohn DeereFiles written by a Deere Command Center display.
    GS3_2630John DeereFiles written by a Deere Greenstar 3 2630 display.
    GS4_4600John DeereFiles written by a Deere Greenstar 4 display, including the 4600 and all 46xx series displays.
    IntegraVersaPluginAgLeaderFiles written by an AgLeader Integra or Versa display. These cannot be read using John Deere SDK's.
    RavenPluginRavenFiles written by a Raven Viper, Envizio, or Phoenix display, and converted using Raven's Slingshot API. These cannot be read using John Deere SDK's.
    AdmWrappedPluginVariousThese are 3rd-party files that were converted to the ADAPT format. The original data may have been written by Trimble FMX or Precision Planting 20/20 displays. The un-converted files in their original formats are not currently available through the Files API. The ADAPT files can be read using the open-source ADAPT ADMPlugin.
  4. File Activity

    TypeDescription
    UPLOADEDFile is uploaded successfully.
    RECEIVED_FROM_MACHINEFile received from machine(VIN of the machine).
    RENAMEDFile is renamed.
    OUTGOING_SHARE_PENDINGFile shared by organization but not accepted by pending partnership organization.
    FILE_CONTROL_TRANSFER_PENDINGFile assignment is in pending state with partner organization.
    CANCEL_FILE_CONTROL_TRANSFERCancel already initiated file transfer.
    INCOMING_SHARE_ACCEPTEDAccepted file share from partner organization
    OUTGOING_SHARE_ACCEPTEDPartner organization accepted file share.
    INCOMING_SHARE_REVOKEDFile sharing revoked for partner organization.
    OUTGOING_SHARE_REVOKEDFile sharing revoked by owner organization
    FILE_CONTROL_RECEIVEDFile control is received from partner organization.
    FILE_CONTROL_TRANSFERREDFile control is transferred to partner organization.
    TRANSFERRED_TO_MACHINEFile is transferred from host to machine.
    RECEIVED_BY_MACHINEFile is received by machine.
    CONTACT_SHARE_REJECTEDFile share rejected by partner organization.
    TRANSFER_TO_MACHINE_STAGEDFile transfer is queued and in progress.
    FILE_MAP_PROCESSING_SUCCESSMap data processing successful
    FILE_MAP_PROCESSING_FAILEDMap data processing failed
    FILE_PROCESSING_STARTFile processing started.
    FILE_AGGREGATION_PROCESSING_SUCCESSField summary processing successful.
    FILE_AGGREGATION_PROCESSING_FAILEDField summary processing failed.
    FILE_PROCESSING_SUCCESSFile is processed successfully and ready to use.
    FILE_PROCESSING_FAILEDFile processing failed and is not ready to use.
    FILE_ARCHIVEDFile archived by user.
    FILE_UNARCHIVEDFile restored from archived by user.
    FILE_NEEDS_TO_BE_ASSIGNEDUser needs to manually assign file to own or partner organization.
    FILE_ASSIGNMENT_REJECTEDPartner organization has rejected the file assignment.
    FIELD_EXPORT_SUCCESSExport file is successfully created for field(s) data.
    FIELD_EXPORT_FAILEDExport file is unsuccessful for selected field(s) data.
    EXPORTEDFile exported by user.
    FILE_REPROCESSING_STARTFile reprocessing started.
    FILE_ABANDONEDFile is incomplete.
    FILE_MAP_REPROCESSING_SUCCESSMap reporcessing successful.
    FILE_MAP_REPROCESSING_FAILEDMap reprocessing failed.
    FILE_AGGREGATION_REPROCESSING_SUCCESSField summary reprocessing successful.
    FILE_AGGREGATION_REPROCESSING_FAILEDField summary reprocessing failed.
    FILE_REPROCESSING_SUCCESSFile reprocessing successful and finished.
    FILE_REPROCESSING_FAILEDFile reprocessing failed.
    INCOMING_WDT_FILESIncoming files from machine.
    FILE_AUTO_ARCHIVEDFile auto archived.
    FILE_TOO_LARGE_FOR_INSPECTIONFile is too large for inspection.
    FILE_INSPECTION_FAILEDFile inspection failed.
    FLAGGED_SUSPICIOUS_AND_QUARANTINEDFile has been flagged suspicious and has been quarantined.
    FILE_AVAILABLE_TO_DISPLAYFile has successfully arrived at the display.
    FILE_AUTOMATICALLY_ACCEPTED_BY_DISPLAYFile was automatically accepted.
    FILE_AUTOMATICALLY_REJECTED_BY_DISPLAYFile was automatically rejected.
    FILE_ACCEPTED_BY_OPERATOR_AT_DISPLAYOperator has imported the file.
    FILE_REJECTED_BY_OPERATOR_AT_DISPLAYOperator has rejected the file.
  5. File source

    MACHINE, ORGANIZATION, ADS_DATA_MANAGER, MOBILE_DATA_LEAP, STREAMING_DATA_PLATFORM, GEOSPATIAL_INFORMATION_SYSTEM, GEN4_BUNDLE

  6. File status

    UPLOAD_PENDING, IN_PROGRESS, READY


Submit a File Transfer Request

POST

/organizations/{orgId}/fileTransfers
This resource allows you to select a file and machine, and use the client software to submit a file transfer request. After that, MyJohnDeere API v3's infrastructure transfers the selected file to the selected machine, where it becomes available for the machine operator to use. The response links to the following resources:
  • file: The file for which the transfer is being requested.
  • machine: The machine to which the transfer is being requested.
Note there is a 100MB file size limit. Files larger than 100MB cannot be transferred using this API.

OAuth Scope Required: files

Request URI

POST https://sandboxapi.deere.com/platform/organizations/{orgId}/fileTransfers

Accept: application/vnd.deere.axiom.v3+json

Content-Type: application/vnd.deere.axiom.v3+json
ParameterTypeDescription & ExampleIn
orgId

Required

string

Organization

Example: 1234

path

FieldTypeDescription & Example
links
Array of undefined
---
file

---

Files Link.
Example: https://sandboxapi.deere.com/platform/files/fileID
machine

---

Machines Link.
Example: https://sandboxapi.deere.com/platform/machines/machineID
{
  "links": [
    {
      "rel": "file",
      "uri": "https://sandboxapi.deere.com/platform/files/fileID"
    },
    {
      "rel": "machine",
      "uri": "https://sandboxapi.deere.com/platform/machines/machineID"
    }
  ]
}

201 Created
Location:https://sandboxapi.deere.com/platform/filesTransfers/7482


Get File Transfer List by Organization

GET

/organizations/{orgId}/fileTransfers
This resource will retrieve list of all File Transfer by an Organization. The response will contain links to the following resources:
  • file: View the file for which the transfer was requested.
  • machine: View the machine to which the transfer was requested.
Please Note: This API does not support eTags.

OAuth Scope Required: files

Request URI

GET https://sandboxapi.deere.com/platform/organizations/{orgId}/fileTransfers

Accept: application/vnd.deere.axiom.v3+json

ParameterTypeDescription & ExampleDefaultIn
orgId

Required

string

Organization

Example: 1234

N/A

path

source

string

The source of the file transfer. Takes the values ORGANIZATION or MACHINE.

Example: ORGANIZATION

N/A

query

FieldTypeDescription & Example
file
---
Information on the transferred file, including name, type, created type, modified time, native size, source, status, and whether it was archived.
Example: See sample response below.
id
string
File Transfer ID
Example: 1628996
source
string
File source. If the request parameter value for source is MACHINE, this response value will also be MACHINE. If the request parameter value for source is ORGANIZATION, this response value will be HOST.
Example: HOST
transferInitiationTime
datetime
Timestamp of when the file transfer was initiated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2015-06-09T09:43:01.381Z
lastUpdatedTime
datetime
Timestamp of when the file transfer was last updated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2015-06-09T09:43:01.384Z
status1
string
Status of the file transfer.
Example: WDT_AVAILABLE_TO_DISPLAY
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
x-deere-signature: 877280ba-c8fe-49f0-a0ea-b6855cebd36f.1639958400000
{
  "links": [
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/organizations/1234/fileTransfers?source=ORGANIZATION"
    }
  ],
  "total": 2,
  "values": [
    {
      "@type": "FileTransfer",
      "file": {
        "@type": "File",
        "name": "1H0S670SAE0765947_032020180053.zip",
        "type": "SETUP",
        "createdTime": "2018-03-20T05:53:47.476Z",
        "modifiedTime": "2018-03-20T21:10:41.325Z",
        "nativeSize": 80480,
        "source": "1H0S670SAE0765947",
        "status": "READY",
        "archived": false,
        "id": "73391610",
        "links": [
          {
            "@type": "Link",
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/73391611"
          }
        ]
      },
      "source": "HOST",
      "transferInitiationTime": "2018-03-20T18:52:22.155Z",
      "lastUpdatedTime": "2018-03-20T21:11:35.519Z",
      "status": "WDT_AVAILABLE_TO_DISPLAY",
      "id": "73416642",
      "links": [
        {
          "@type": "Link",
          "rel": "file",
          "uri": "https://sandboxapi.deere.com/platform/files/73391611"
        },
        {
          "@type": "Link",
          "rel": "machine",
          "uri": "https://sandboxapi.deere.com/platform/machines/8257"
        },
        {
          "@type": "Link",
          "rel": "owningOrganization",
          "uri": "https://sandboxapi.deere.com/platform/organizations/2551"
        },
        {
          "@type": "Link",
          "rel": "self",
          "uri": "https://sandboxapi.deere.com/platform/fileTransfers/73416642"
        }
      ]
    },
    {
      "@type": "FileTransfer",
      "file": {
        "@type": "File",
        "name": "1H0S670SAE0765947_032020180053.zip",
        "type": "SETUP",
        "createdTime": "2018-03-20T05:53:47.476Z",
        "modifiedTime": "2018-03-20T21:10:41.325Z",
        "nativeSize": 80480,
        "source": "1H0S670SAE0765947",
        "status": "READY",
        "archived": false,
        "id": "73391610",
        "links": [
          {
            "@type": "Link",
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/73391610"
          }
        ]
      },
      "source": "HOST",
      "transferInitiationTime": "2018-03-20T18:52:22.071Z",
      "lastUpdatedTime": "2018-03-20T21:11:34.379Z",
      "status": "WDT_AVAILABLE_TO_DISPLAY",
      "id": "73416640",
      "links": [
        {
          "@type": "Link",
          "rel": "file",
          "uri": "https://sandboxapi.deere.com/platform/files/73391611"
        },
        {
          "@type": "Link",
          "rel": "machine",
          "uri": "https://sandboxapi.deere.com/platform/machines/8257"
        },
        {
          "@type": "Link",
          "rel": "owningOrganization",
          "uri": "https://sandboxapi.deere.com/platform/organizations/2551"
        },
        {
          "@type": "Link",
          "rel": "self",
          "uri": "https://sandboxapi.deere.com/platform/fileTransfers/73416640"
        }
      ]
    }
  ]
}


List File Transfer Requests

GET

/fileTransfers
This resource allows the client to check the status of a file transfer request that has already been submitted. The response will contain links to the following resources:
  • file: View the file for which the transfer was requested.
  • machine: View the machine to which the transfer was requested.

OAuth Scope Required: files

Request URI

GET https://sandboxapi.deere.com/platform/fileTransfers

Accept: application/vnd.deere.axiom.v3+json

ParameterTypeDescription & ExampleIn
source

string

The source of the file transfer. Takes the values ORGANIZATION or MACHINE.

Example: ORGANIZATION

query

x-deere-signature

string

x-deere-signature should be managed by the client per user per API. For a new user/new API, the first request will have a blank value for x-deere-signature. Changes can be tracked with the x-deere-signature returned in the response. If the response has not changed since the last API call, the value of x-deere-signature is not changed and the client should use the same String Token next time.

Example: 877280ba-c8fe-49f0-a0ea-b6855cebd36f.1639958400000

header

FieldTypeDescription & Example
x-deere-signature
string
A new x-deere-signature response header will be included if the response has changed since last api call.
Example: 877280ba-c8fe-49f0-a0ea-b6855cebd36f.1639958400000
file
---
Information on the transferred file, including name, type, created type, modified time, native size, source, status, and whether it was archived.
Example: See sample response below.
id
string
File Transfer ID
Example: 51234
source
string
File source. If the request parameter value for source is MACHINE, this response value will also be MACHINE. If the request parameter value for source is ORGANIZATION, this response value will be HOST.
Example: HOST
transferInitiationTime
datetime
Timestamp of when the file transfer was initiated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2018-03-20T18:52:22.155Z
lastUpdatedTime
datetime
Timestamp of when the file transfer was last updated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2018-03-20T21:11:35.519Z
status1
string
Status of the file transfer.
Example: WDT_IN_PROCESS
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
{
  "links": [
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/fileTransfers"
    }
  ],
  "total": 2,
  "values": [
    {
      "file": {
        "name": "transferedFile1.zip",
        "type": "SETUP",
        "createdTime": "2014-01-13T12:15:51.159Z",
        "modifiedTime": "2014-01-13T12:16:09.443Z",
        "nativeSize": 927025,
        "source": "FitzwilliamDarcy",
        "status": "READY",
        "archived": false,
        "links": [
          {
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/7456"
          }
        ],
        "id": "51234"
      },
      "source": "HOST",
      "transferInitiationTime": "2014-01-13T12:16:15.924Z",
      "lastUpdatedTime": "2014-01-13T12:16:15.924Z",
      "status": "WDT_IN_PROCESS",
      "links": [
        {
          "rel": "file",
          "uri": "https://sandboxapi.deere.com/platform/files/612"
        },
        {
          "rel": "machine",
          "uri": "https://sandboxapi.deere.com/platform/machines/1523"
        },
        {
          "rel": "self",
          "uri": "https://sandboxapi.deere.com/platform/fileTransfers/6234"
        }
      ],
      "id": "4799048"
    },
    {
      "file": {
        "name": "transferedFile2.zip",
        "type": "SETUP",
        "createdTime": "2015-01-17T15:15:55.732Z",
        "modifiedTime": "2015-01-17T15:15:56.242Z",
        "nativeSize": 6813,
        "source": "LydiaBennett",
        "status": "READY",
        "archived": false,
        "links": [
          {
            "rel": "self",
            "uri": "https://sandboxapi.deere.com/platform/files/12345"
          }
        ],
        "id": "1219063"
      },
      "source": "HOST",
      "transferInitiationTime": "2013-01-17T15:18:41.512Z",
      "lastUpdatedTime": "2013-05-02T20:06:43.732Z",
      "status": "WDT_OPERATOR_REJECTED",
      "links": [
        {
          "rel": "file",
          "uri": "https://sandboxapi.deere.com/platform/files/615"
        },
        {
          "rel": "machine",
          "uri": "https://sandboxapi.deere.com/platform/machines/243"
        },
        {
          "rel": "self",
          "uri": "https://sandboxapi.deere.com/platform/fileTransfers/7354"
        }
      ],
      "id": "1219096"
    }
  ]
}


View a File Transfer Request

GET

/fileTransfers/{id}
This resource allows the client to check the status of a file transfer request that has already been submitted. The response will contain links to the following resources:
  • file: View the file for which the transfer was requested.
  • machine: View the machine to which the transfer was requested.

OAuth Scope Required: files

Request URI

GET https://sandboxapi.deere.com/platform/fileTransfers/{id}

Accept: application/vnd.deere.axiom.v3+json

ParameterTypeDescription & ExampleDefaultIn
source

string

The source of the file transfer. Takes the values ORGANIZATION or MACHINE.

Example: ORGANIZATION

N/A

query

id

Required

string

File Transfer ID

Example: 1628996

N/A

path

FieldTypeDescription & Example
file
---
Information on the transferred file, including name, type, created type, modified time, native size, source, status, and whether it was archived.
Example: See sample response below.
id
string
File Transfer ID
Example: 1628996
source
string
File source. If the request parameter value for source is MACHINE, this response value will also be MACHINE. If the request parameter value for source is ORGANIZATION, this response value will be HOST.
Example: HOST
transferInitiationTime
datetime
Timestamp of when the file transfer was initiated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2015-06-09T09:43:01.381Z
lastUpdatedTime
datetime
Timestamp of when the file transfer was last updated.All timestamps are formatted according to the ISO 8601 standard.
Example: 2015-06-09T09:43:01.384Z
status1
string
Status of the file transfer.
Example: WDT_AVAILABLE_TO_DISPLAY
200 OK
Content-Type: application/vnd.deere.axiom.v3+json
{
  "file": {
    "name": "transferredFile1.zip",
    "type": "SETUP",
    "createdTime": "2015-06-09T09:42:55.817Z",
    "modifiedTime": "2015-06-09T09:43:01.693Z",
    "nativeSize": 9440,
    "source": "FitzwilliamDarcy",
    "status": "READY",
    "archived": false,
    "links": [
      {
        "rel": "self",
        "uri": "https://sandboxapi.deere.com/platform/files/15234"
      }
    ],
    "id": "15234"
  },
  "source": "HOST",
  "transferInitiationTime": "2015-06-09T09:43:01.381Z",
  "lastUpdatedTime": "2015-06-09T09:43:01.384Z",
  "status": "WDT_IN_PROCESS",
  "links": [
    {
      "rel": "file",
      "uri": "https://sandboxapi.deere.com/platform/files/15234"
    },
    {
      "rel": "machine",
      "uri": "https://sandboxapi.deere.com/platform/machines/8237"
    },
    {
      "rel": "owningOrganization",
      "uri": "https://sandboxapi.deere.com/platform/organizations/1234"
    },
    {
      "rel": "self",
      "uri": "https://sandboxapi.deere.com/platform/fileTransfers/61243"
    }
  ],
  "id": "571637605"
}


Additional Information

  1. File Transfer Status

    ValueDefinition
    WDT_IN_PROCESSThe file transfer request is on its way to the machine's display.
    WDT_SUCCESSThe file transfer request has been successfully transferred.
    WDT_FAILEDThe file transfer has failed.
    WDT_AVAILABLE_TO_DISPLAYThe file is on the 2630 and Gen 4 displays.
    WDT_OPERATOR_ACCEPTEDThe file has been accepted by the operator on the machine.
    WDT_OPERATOR_REJECTEDThe file has been rejected by the operator on the machine.
    WDT_INVALID_FILEThe display cannot read the file.
    WDT_ERRORAn internal error has occurred.
    WDT_QUEUEDThe file is now ready to go to the machine display.

Authentication (OAuth 2)

The John Deere Precision Tech API endpoints use OAuth 2.0 for authentication. OAuth is an open protocol, and these APIs currently only support the authorization code grant type for external applications.

You can also see our sample code for examples of navigating our OAuth 2 authentication code flow.

  1. Create an Application on Developer.Deere.com

    You must be a validated John Deere user to create an application on developer.deere.com. If you do not have a John Deere username and password, you can create one using the Create an Account option on our digital tools home page here: https://www.deere.com/en/digital-tools/. You must be able to sign into the developer.deere.com to use the Create Application option in the My Applications section of the website. Please follow the steps of the Create Application workflow on the website before proceeding to the next steps.

    Once your application is created, the Security section of the application Details will provide you with the Application ID and Secret necessary for the next steps to sign your API token requests.

    A note on Redirect URIs (Callback URLs):

    During the creation of the application (or found after creation in the application Details/Security section) you will need to define one or any number of Redirect URIs (Callback URLs). These are required for the OAuth 2 authentication flow. If you do not have this when creating the application, there is an example given in that section when creating the application that you may use for now which is http://localhost:9090/callback

    If Redirect URIs are not added to your application properly or used in the authentication process in a different format than listed in the application details (for example encoded vs non-encoded), your users will experience a 400 Bad Redirect error during authentication.

  2. Call the OAuth 2 well-known URL

    With your application client or a web browser window, make a GET request to https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/.well-known/oauth-authorization-server. This URL contains the authorization and token endpoints, as well as the available scopes mentioned in the steps below.

    {
        "issuer": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7",
        "authorization_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/authorize",
        "token_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/token",
        "registration_endpoint": "https://signin.johndeere.com/oauth2/v1/clients",
        "jwks_uri": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/keys",
        "response_types_supported": [
            "code",
            "token",
            "id_token",
            "code id_token",
            "code token",
            "id_token token",
            "code id_token token"
        ],
        "response_modes_supported": [
            "query",
            "fragment",
            "form_post",
            "okta_post_message"
        ],
        "grant_types_supported": [
            "authorization_code",
            "implicit",
            "refresh_token",
            "password",
            "client_credentials",
            "urn:ietf:params:oauth:grant-type:device_code"
        ],
        "subject_types_supported": [
            "public"
        ],
        "scopes_supported": [
            "ag1",
            "ag2",
            "ag3",
            "eq1",
            "eq2",
            "files",
            "finance1",
            "finance2",
            "org1",
            "org2",
            "work1",
            "work2",
            "openid",
            "profile",
            "email",
            "address",
            "phone",
            "offline_access",
            "device_sso"
        ],
        "token_endpoint_auth_methods_supported": [
            "client_secret_basic",
            "client_secret_post",
            "client_secret_jwt",
            "private_key_jwt",
            "none"
        ],
        "claims_supported": [
            "ver",
            "jti",
            "iss",
            "aud",
            "iat",
            "exp",
            "cid",
            "uid",
            "scp",
            "sub"
        ],
        "code_challenge_methods_supported": [
            "S256"
        ],
        "introspection_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/introspect",
        "introspection_endpoint_auth_methods_supported": [
            "client_secret_basic",
            "client_secret_post",
            "client_secret_jwt",
            "private_key_jwt",
            "none"
        ],
        "revocation_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/revoke",
        "revocation_endpoint_auth_methods_supported": [
            "client_secret_basic",
            "client_secret_post",
            "client_secret_jwt",
            "private_key_jwt",
            "none"
        ],
        "end_session_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/logout",
        "request_parameter_supported": true,
        "request_object_signing_alg_values_supported": [
            "HS256",
            "HS384",
            "HS512",
            "RS256",
            "RS384",
            "RS512",
            "ES256",
            "ES384",
            "ES512"
        ],
        "device_authorization_endpoint": "https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/device/authorize",
        "dpop_signing_alg_values_supported": [
            "RS256",
            "RS384",
            "RS512",
            "ES256",
            "ES384",
            "ES512"
        ]
    }
  3. Acquire an authorization code

    The authorization code is obtained by using the authorization server as an intermediary between the client and resource owner. The client directs the resource owner to an authorization server, and once authorized the server redirects the resource owner back to the client with the authorization code. Along with the GET request to the authorization server URL, you will need to send a response type code parameter, along with OAuth scopes, client ID, state, and redirect URI.

    auth_code_1

    The authorization URL for the user to follow (in a web browser) should look like this:

    GET

    'https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/authorize?response_type=code&scope={scopes}&client_id={clientId}&state={state}&redirect_uri={redirect_uri}

    A note on OAuth Scopes and Data Permissions:

    In the  Dev Docs API sections, the required OAuth scopes will be referenced for each method and endpoint. For the OAuth access token, you must request the required scopes for each endpoint your application will be using. DO NOT request all scopes available on our authorization server as not all are required for your application, and your users should be prompted to only accept scopes (permissions) necessary for the API calls you will be making.

    The OAuth scopes your application requests initially for a user access token will directly relate to the permissions granted when the user makes the organization connection to your application. Please refer to the scopes table below. These scopes directly relate to user, partner, and Connected Software Company data access permissions referenced in Team Manager.

    Note: If the user has less permissions in their own organization(s) or their partner organization(s) than the scopes you are requesting initially, only the user’s permission set will be assumed in the connection from the selected organization to your application. We will not grant more permissions to your application than the connecting user has.

    Once the connection from the user’s organization is made to your application, you may request a higher-level scope or new scopes for the user access token, however, the connection permissions must also be adjusted by the user in https://connections.deere.com for the requesting application. Before adjusting those permission levels in the Connections website, the user must have obtained those permissions in their own organization or must be shared by the partner organizations that are currently connected.

    Scope

    User/Connection Permission

    Description

    org1

    Organization Management Access Level 1

    View Staff, Operators, and Partners

    org2

    Organization Management Access Level 1

    Organization Management Access Level 2

    View Staff, Operators, and Partners

    Modify Staff, Operators, and Partners

    eq1

    Equipment Access Level 1

    RDA

    Setup & WDT

    View Equipment

    Remote Display Access

    Setup File Creator, Products, and Wireless Data Transfer

    eq2

    Equipment Access Level 1

    Equipment Access Level 2

    Equipment Access Level 3

    RDA

    Setup & WDT

    View Equipment

    Edit Equipment (also View Detailed Machine Measurements)

    Manage Equipment

    Remote Display Access

    Setup File Creator, Products, and Wireless Data Transfer

    ag1

    Locations Access Level 1

    View Locations (Clients, Farms, Fields and Associated Data)

    ag2

    Locations Access Level 1

    Locations Access Level 2

    View Locations (Clients, Farms, Fields and Associated Data)

    Analyze Production Data (Website Access Only)

    ag3

    Locations Access Level 1

    Locations Access Level 2

    Locations Access Level 3

    View Locations (Clients, Farms, Fields and Associated Data)

    Analyze Production Data (Website Access Only)

    Manage Locations & Production Data (Website and API Access)

    files

    Files API Access

    Equipment Access Level 3

    Setup & WDT

    Files API Access (ag3 scope also required for most file types)

    Manage Equipment

    Setup File Creator, Products, and Wireless Data Transfer

    finance1

    Financial Access Level 1

    View Financials

    finance2

    Financial Access Level 1

    Financial Access Level 2

    View Financials

    Manage Financials

    work1

    Work and Crop Plans Access Level 1

    View Work and Crop Plans

    work2

    Work and Crop Plans Access Level 1

    Work and Crop Plans Access Level 2

    View Work and Crop Plans

    View Work and Crop Plans

    offline_access

    API Authentication Only

    Request a Refresh Token

    To summarize the Authorization Code steps:

    1. The customer initiates a request for data from a client application, and the client sends an OAuth request to the authorization server with the proper headers.

    2. The customer is redirected to the John Deere sign-in page.

    3. The customer signs into John Deere, and the request is redirected back to the authorization server.

    4. The customer is then presented with the scope allowance screen. (During first token request, or with modified scopes)

    5. Scope acceptance is sent back to the OAuth server, and the customer is then redirected back to the client application with the authorization code.

  4. Acquire an Access Token

    Once the application has the authorization code, the client then requests an access token from the token server by sending a grant type authorization_code parameter, along with the authorization code, a redirect URI, and the client credentials. The authorization server authenticates the client and issues an access token and a refresh token (only if offline_access scope was requested in the previous step). The access token will expire after 12 hours after which it must be refreshed (see the last step).

    auth_code_1

    POST

    https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/token

    Content-Type: application/x-www-form-urlencoded

    • grant_type=authorization_code

    • code={auth_code_from_authorize_call_response}

    • redirect_uri={redirect_uri}

    • client_id={client_id}

    • client_secret={client_secret}

  5. Post authorization redirect to enable organization access

    Once the client obtains a valid access token, there is an additional step required to enable organization data access for your client application. If this step is skipped, the client will receive a 403 Forbidden response when trying the access data for any organization to which the user has access

    auth_code_1
    1. Make a call to GET /organizations. If you see a ‘connections’ link in the response, your client has not granted access to that organization.

      Note: A user may have access to multiple organizations but may not enable access to all of them. A ‘connections’ may always be returned for an organization the user chooses not to allow your application access to.

      Example Response:

      [
        {
          "@type": "Organization",
          "name": "Spahn Ranch",
          "type": "customer",
          "member": true,
          "internal": false,
          "id": "283480",
          "links": [
            {
              "@type": "Link",
              "rel": "self",
              "uri": "https://apiqa.tal.deere.com/platform/organizations/283480"
            },
            {
              "@type": "Link",
              "rel": "connections",
              "uri": "https://connections.deere.com/connections/deere-sld8shg8ee0o8ns8nhdh88hn/select-organizations"
            }
          ]
        }
      ]
    2. Redirect the user to Operations Center (in a web browser) using the URI provided in the ‘connections’ link. You can also provide a redirect_uri query parameter so the user will be redirected back to your application after the organization selection process is completed. The redirect_uri that is provided must match one of the Redirect URIs listed in your application profile. The redirect_uri must also be URL encoded (i.e. “https://example.client.com/callback” should be passed as “https%3A%2F%2Fexample.client.com%2Fcallback”).

      Example URI: https://connections.deere.com/connections/{clientId}/select-organizations?redirect_uri={redirectUri}

    3. The user selects the organization(s) to which your client can have access.

      auth_code_1

    4. Once the organization selection is complete, the user will be redirected back to your application based on the redirect_uri query parameter that was provided. If the redirect_uri query parameter is not provided or is invalid, then the user will remain on the Connections application in Operations Center.

      Additionally, the GET /organizations endpoint will no longer include the ‘connections’ link and instead will include a ‘manage_connections’ link. This will link into the management modal in Connections for the application in the organization. Having the ‘manage_connections’ link implies that a connection between an application and organization is fully established.

      Example Response:

      [
        {
          "@type": "Organization",
          "name": "Spahn Ranch",
          "type": "customer",
          "member": true,
          "internal": false,
          "id": "283480",
          "links": [
            {
              "@type": "Link",
              "rel": "self",
              "uri": "https://apiqa.tal.deere.com/platform/organizations/283480"
            },
            {
              "@type": "Link",
              "rel": "manage_connections",
              "uri": "https://connections-qual.deere.com/connections/deere-sld8shg8ee0o8ns8nhdh88hn/connections-dialog?orgId=283480"
            }
          ]
        }
      ]
    5. Avoid getting into a redirect loop and only perform the connections redirect one time per user session. There are a few scenarios in Operations Center when a user either decides not to or is unable to complete the organization selection step. If your application does not have access to an organization after completing the connections redirect, we suggest that you inform the user that the connection was not completed and they may need to login to Operations Center to modify the Connection manually.

  6. Use the access token to call API resource

    Once the client obtains the valid access token and the user has enabled organization access for the client, they can use this token to call the appropriate resource server (API) to obtain the data needed.

    auth_code_1

    For API call structure, parameters, and headers, refer to the Dev Docs section.

    All your API calls should include an Authorization: Bearer {token} utilizing the obtained token.

  7. Setup Token Refresh Process

    The client application will need to pass a refresh token to the authorization (token) server to obtain a new access token before the access token expires (12 hours). For this you will pass through a refresh_token grant type parameter, along with the refresh_token to the token server.

    Even if the customer did not request a resource call, the client would need to initiate a periodic refresh of this token to keep it 'hot'. The refresh token will expire after 365 days if it is not used. If the refresh token expires, the customer will need to re-authenticate. As long as you continue to refresh the access token with this refresh token, it will remain active indefinitely (unless the customer removes all organization connections on https://connections.deere.com to your application).

    POST

    https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/v1/token

    Accept: application/json

    Content-Type: application/x-www-form-urlencoded

    • grant_type=refresh_token

    • refresh_token={refresh_token}

    • redirect_uri={redirect_uri}

    • scope={scopes}

    • client_id={client_id}

    • client_secret={client_secret}


Using Postman to call the MyJohnDeere API (OAuth 2)

Postman is a third-party API client, which you can use to test your John Deere API calls. You may use the Postman website or the desktop application for calling APIs while in Sandbox to see and follow REST API responses. Other API test clients may work for this as well. The below instructions will provide the initial setup steps to get Postman configured and obtain an OAuth 2 token.

  1. Download and install Postman on your computer (link above), or you may use the web version.

  2. Open Postman, click on Settings at the top, and in General settings turn off all of the Headers options.

  3. In the top nav section of the Postman client application, you can hit the + sign to add a new request to your console.

  4. In the Auth section of that new request tab, there is a dropdown to select the type of authorization you’ll be using. Select the OAuth2 option.

  5. The screen will change, and you will see Type is set as OAuth 2.0.

  6. Add auth data to should be set as Request Headers.

  7. Header Prefix should be set as Bearer.

  8. Within the Configure New Token section, you will need to add values to each of the fields or configure the options before selecting the Get New Access Token button (or it will error out).

    1. Add a Token Name (can be anything).

    2. Leave the Grant Type as Authorization Code.

    3. The Callback URL for redirecting the authorization code back to Postman is https://www.getpostman.com/oauth2/callback. The Callback URL can be set to anything in this example. Remember that if you will be using this Postman callback URL, it (and any other Callback URL you use) will need to be synced with your OAuth client. See step 2 in this document for help in syncing this Callback URL with your application.

    4. The Auth URL and Access Token URL can be found with opening a new Postman request window and doing a GET on this URL https://signin.johndeere.com/oauth2/aus78tnlaysMraFhC1t7/.well-known/oauth-authorization-server. No Auth is needed for this GET request. You can also open this URL in any internet browser window.

    5. For the Client ID and Client Secret Developer.Deere.com, login, and access your application profile in the "My Applications" section.

    6. In the Details window, under the Security section, you will find this information. What Postman calls the Client ID is called "Application Id" in this window. What Postman calls the Client Secret is called "Secret" in this window. Copy the necessary information into the Postman token section.

    7. The Scope box should be populated with only the scopes require for the API calls you are making (space delimited). The scopes required for your API calls can be found in the Dev Docs section of every API under each endpoint’s documentation.

    8. State is an opaque value to prevent cross-site forgery. Enter any unique string in this box (ex. 12345).

    9. For Client Authentication, this option should be set to Send client credentials in body for this example. (not selecting this option will result in an error)

  9. Once the steps above are complete, press the Get New Access Token button to proceed to the John Deere sign in page where a valid Operations Center user can sign in. If this is the first time the user is obtaining an API token for your application, they will be presented with the scopes acceptance screen, to which they must choose Allow Access (Don’t Allow will result in a token with no assigned scopes).

  10. In the Details window, the first two pieces of information that OAuth requires are found in the Application Details section (illustration below). What Postman calls the Client ID is called "Application Id" in this window. What Postman calls the Client Secret is called "Secret" in this window. Copy the necessary information into the Postman token section.

  11. Once the token is obtained and shown in the Postman screen, select the Use Token button to apply the token to your current API call. (you do not need to configure Authorization headers on the API call, as Postman will do this for you)

  12. The next step is to enter the URL of the API call and configure an Accept header. To test, please configure the API URL to be GET https://sandboxapi.deere.com/platform/organizations. In the Headers section, please configure an Accept header with a value of application/vnd.deere.axiom.v3+json. (you may leave the default Postman headers in the request, if applicable)

  13. Only once all the steps above are completed, can you hit the Send button in the API request to make the API call and receive a 200 OK response and response body.

  14. If you can’t complete this process or have any questions, please feel free to use the Support button in the top navigation of the page to contact us.



eTags

If your client will be making frequent/regular calls to some API to check for updates, you can use Deere's eTag implementation to limit the response to newly modified data. This feature is available for most APIs that return a list through MyJohnDeere API. To use this function:

  1. Include x-deere-signature as a request header.

  2. The response header will include a String Token. Send the request again with this String Token as the value for the x-deere-signature header

  3. If there are no changes to the list, then the resource will return 304 Not Modified. If there are changes to the list, it will return only the changed data, along with a new String Token. You must use this new String Token in your next request.

  4. While using eTags,pagination is skipped and the complete response, which include all the changes since last API call, is returned.

String Tokens should be stored as string data types.

eTags are retained by John Deere for forty-five days. If an eTag is no longer retained, the response will include the whole list. The same will occur if the signature used is not found.

GET https://sandboxapi.deere.com/platform/organizations/1234/files

Accept: application / vnd.deere.axiom.v3 + json
x - deere - signature:
Authorization: Bearer {token}
200 OK

pragma: no - cache
date: Tue, 05 May 2015 19:37:58 GMT
server: Apache - Coyote / 1.1
x - deere - handling - server: ldxctc1
x - deere - elapsed - ms: 225
x - frame - options: SAMEORIGIN
x - deere - signature: 520122365ebb4870a344784570d202c7
content - language: en - US
cache - control: no - cache, no-store, max-age=0
transfer - encoding: chunked
connection: Keep - Alive
content - type: application / vnd.deere.axiom.v3 + json;charset=UTF-8
keep - alive: timeout = 5, max=100
expires: Thu, 01 Jan 1970 00:00:00 GMT
GET https://sandboxapi.deere.com/platform/organizations/1234/files

Accept: application / vnd.deere.axiom.v3 + json
x - deere - signature: 520122365ebb4870a344784570d202c7
Authorization: Bearer {token}
304 Not Modified

date: Tue, 05 May 2015 19:53:00 GMT
cache - control: no - cache, no-store, max-age=0
server: Apache - Coyote / 1.1
connection: Keep - Alive
keep - alive: timeout = 5, max=100
expires: Thu, 01 Jan 1970 00:00:00 GMT

Links

Links is John Deere’s implementation of HATEOS. They are handy for discovering additional actions and endpoints. Please note that we do not show or hide returned links in a response based on client API access granted, but we do make efforts to return only those links that a user or application has access to based on data permissions. In summary, not all returned links will be accessible to your application as some APIs are not public facing and you may not have access to that endpoint, and not all returned links will allow every action (GET, PUT, POST, DELETE).

Due to our large number of API's, the number of links can become overwhelming. For some base resources, links can account for the majority of the response payload. You can optionally disable links by specifying a showLinks=none query parameter on any API call. You can also request specific links. For example, showLinks=field,clients will only show links if they have a 'rel' value of 'fields', or 'clients'.

Some Examples:

"links": [
  {
    "rel": "self",
    "uri": "https://sandboxapi.deere.com/platform/organizations/1234/farms/14e69520-34b2-4e67-b5f1-fffaf49531de"
  },
  {
    "rel": "fields",
    "uri": "https://sandboxapi.deere.com/platform/organizations/1234/farms/14e69520-34b2-4e67-b5f1-fffaf49531de/fields"
  },
  {
    "rel": "clients",
    "uri": "https://sandboxapi.deere.com/platform/organizations/1234/farms/14e69520-34b2-4e67-b5f1-fffaf49531de/clients"
  },
  {
    "rel": "owningOrganization",
    "uri": "https://sandboxapi.deere.com/platform/organizations/1234"
  }
]

How are these links helpful?

  • Links help to identify and discover additional API's and actions.

  • If you do not have access to a link, it will return a 403 response to your application.

  • Only those returned links that relate to the public APIs visible in https://developer.deere.com are accessible to external applications.


Common Error Codes

When a client application is making requests to John Deere APIs, it will encounter HTTP response errors that should be handled appropriately. Below you will find most of these errors and instructions on handling them.

400 Bad Request

HTTP Code: 400
Response code: Bad Request

This error means that either the POST/PUT body used in the request is incorrect, or if this error is seen in the OAuth 2 POST /token request, it means the refresh token is invalid. Before contacting API Support, please attempt to update the request body or get a valid token for the user. Please see the OAuth 2 documentation here.

401 Unauthorized

HTTP Code: 401
Response code: Server Authorization Failed

This error means that either the application does not have a license for the endpoint, or the user token is expired. Before contacting API Support, please attempt to get a valid token for the user, or use the refresh token process to get a new access token. Please see the OAuth 2 documentation here. Information about what APIs a client application can call by default are listed here, and all other APIs listed on the website are only accessible via a given license.

403 Forbidden

HTTP Code: 403
Response code: Access Denied

This error pertains to the user not having access to this resource. You should only request resources found while navigating the REST endpoints for the user. If the client calls for a resource the user does not have access to, the request will be denied. You can prevent this error by beginning your calls with /platform, and following the returned links to discover resource IDs available to the user (most are found under the /organizations link).

HTTP Code: 403
Response: The client does not have a proper access for this API

This error relates to missing OAuth 2 scopes for the user token. Along with this error code, you will see the client ID, license needed, and read/write/delete scopes needed for that license to make the corresponding requests.

HTTP Code: 403
Response: Requested org is in a restricted state

This error relates to our updates Orgs Terms & Conditions process. We have a guide for handling these requests here.

404 Not Found

HTTP Code: 404
Response code: The requested resource was not found

This error means that the resource ID requested is not valid. All resource IDs should be parsed from API responses immediately before requesting access to it. If IDs are stored for long periods of time, user access to that resource could change or be removed.

429 Too Many Requests

HTTP Code: 429
Response code: HTTP_TOO_MANY_REQUESTS

When the John Deere Servers are overwhelmed by requests, clients may receive a HTTP 429 response. That response may include a "Retry-After" header with a numeric value indicating the number of seconds the client should wait before trying again. When you receive a 429 response with that header, you have to wait at least for the specified time before retrying the request. If a customer is actively waiting for the result, you may need to return an error instead of waiting. If your application is fully asynchronous, always wait the Retry-After amount.

503 Service Unavailable

HTTP Code: 503
Response code: : HTTP_SERVICE_UNAVAILABLE

When John Deere Servers have a backend or server problem, they MAY return a corresponding Retry-After header along with a 503 response. If a 503 is returned without a Retry-After header then John Deere Servers cannot estimate a reasonable recovery time. Your application should enter an exponential back-off loop or return an error in this case. If a Retry-After header is returned, wait the number of seconds given and try again

For all other possible status codes, please refer to this resource that is publicly available (provided by Wikipedia).


Markdown

Markdown is a simple and easy-to-use markup language with broad industry adoption. There are readily available tutorials and reference materials if you’d like an introduction.

We do not support everything Markdown offers. The supported Markdown is listed below.

Supported Markdown

Map Layer Summary POST

Markdown is supported on the text field of Map Layer Summaries. View Map Layer Summary POST documentation

A *description* of a **Map Layer Summary** showing Markdown support.
***
an ordered list:
1. first item 
2. second item 
3. third item 
***
an unordered list:
- first item 
- second item 
- third item 
More examples can be found at this [link](https://en.wikipedia.org/wiki/Markdown).
markdown

Asset Location POST

AssetLocation has a property named measurementData, which supports Markdown on its name attribute. Please note that only links are supported here; no other Markdown will be rendered. View Asset Location POST documentation

"measurementData" : [
    {
        "@type" : "BasicMeasurement",
        <span class="spanText">"name" : "[Leaf Wetness](https://www.example.com)",</span>
        "value" : "1.3",
        "unit" : "u1"
    }
]
markdown2

Required Customer Action (RCA) Events

A Required Customer Action (RCA) event is a change or addition to the customer‘s organization flow that requires the user to take action before further account activity is allowed. This includes API calls on behalf of a customer.

Example: User must accept new terms and conditions to verify their account information.

What does it look like?

  • The client’s API calls will result in a 403 Forbidden response.

  • X-Deere-Warning header will indicate a more specific error message.

  • Example: "Requested Org is in a restricted state."

  • X-Deere-Terms-Location header will include a redirect URL where the user can take action.

  • Example: "https://teammanager.deere.com/organizations/{OrgId}/terms."

  • The response payload will indicate a short description of required user action.

{
  "@type": "Errors",
  "errors": [
    {
      "@type": "Error",
      "guid": "19f7b283-d383-4990-9e14-1b3ee0f7b63d",
      "message": "Requested Org is in a restricted state."
    }
  ],
  "otherAttributes": {}
}

How should your app handle these RCAs?

  • If possible, navigate the user to the URL supplied in the 403 response X-Deere-Terms-Location header.

  • Implement a way to notify the customer that action is required. Supply a 403 response message and X-Deere-Terms-Location URL as instructions to resolve.

Consider RCA Event handling as a best practice moving forward. Your application should take steps to handle these events now.