Apply Edits (Feature Service/Layer)

Description

This operation adds, updates, and deletes features to the associated feature layer or table in a single call (POST only). The applyEdits operation is performed on a feature service layer resource.

The operation returns the results of the edits. The results are grouped by type of edit (addResults, updateResults, and deleteResults). Each contains an array of edit result objects. Each edit result identifies a single feature and indicates whether the edits were successful or not. If not, it also includes an error code and an error description.

NoteNote:

Hosted feature services support adding or updating blob column values in Base64.

You can provide arguments to the applyEdits operation as defined in the following parameters table:

Starting at version 10.6, services can be published form enterprise geodatabase layers that have attribute rules. Attribute rules are applied to the back end datasets and fire when edits are applied. Types of attribute rules include calculation rules which automatically apply a calculated value to a field as well as constraint rules which will cause an edit to return an error if the constraint is violated. See the constraint rule violate JSON response examples below.

Request parameters

Parameter

Details

f

Description: The response format. The default response format is html.

Values: html | json

adds

Description: The array of features to be added. The structure of each feature in the array is the same as the structure of the json feature object returned by the ArcGIS REST API.

Features to be added to a feature layer should include the geometry.

Records to be added to a table should not include geometry.

If useGlobalIds is true, the features are added while preserving their globalIds. If useGlobalIds is false or not specified, the globalIds submitted with the features are ignored and the service assigns new globalIds to the new features.

Syntax: [<feature1>, <feature2>]

Example:

[
  {
    "geometry" : {"x" : -118.15, "y" : 33.80},  
    "attributes" : {
      "OWNER" : "Joe Smith",
      "VALUE" : 94820.37,
      "APPROVED" : true,
      "LASTUPDATE" : 1227663551096,
      "GlobalID":"{74100804-E229-49b8-8CDC-9B5D3EF03EDA}" 

    }
  },
  {
    "geometry" : { "x" : -118.37, "y" : 34.086 },  
    "attributes" : {
      "OWNER" : "John Doe",
      "VALUE" : 17325.90,
      "APPROVED" : false,
      "LASTUPDATE" : 1227628579430,
       "GlobalID":"{39B856DC-AFE4-4c02-B433-A9361ACD91CF}" 

    }
  }
]

updates

Description: The array of features to be updated. The structure of each feature in the array is the same as the structure of the json feature object returned by the ArcGIS REST API and includes a globalId.

If useGlobalIds is false or not specified, the attributes property of the feature should include the object ID of the feature along with the other attributes (the globalid of the feature is not required):

"attributes" : {
  "OBJECTID" : 37,
  "OWNER" : "Joe Smith",
  "VALUE" : 94820.37,
  "APPROVED" : true,
  "LASTUPDATE" : 1227667627940
}

If useGlobalIds is true, the globalId is used to identify the feature when applying the update (the object ID of the feature is not required.)

"attributes": {
	"OWNER": "Joe Smith",
	"VALUE": 94820.37,
	"APPROVED": true,
	"LASTUPDATE": 1227667627940,
	"GlobalID": "{9537AFCE-BF6B-4931-93E8-403E12D76916}"
}

Records to be added to a table should not include geometry.

Syntax: [ <feature1>, <feature2> ]

Example 1:

[
  {
    "geometry" : {"x" : -118.15, "y" : 33.80},  
    "attributes" : {
      "OBJECTID" : 37,
      "OWNER" : "Joe Smith",
      "VALUE" : 94820.37,
      "APPROVED" : true,
      "LASTUPDATE" : 1227667627940
    }
  },
  {
    "geometry" : { "x" : -118.37, "y" : 34.086 },  
    "attributes" : {
      "OBJECTID" : 462,
      "OWNER" : "John Doe",
      "VALUE" : 17325.90,
      "APPROVED" : false,
      "LASTUPDATE" : 9269154204840
    }
  }
]

Example 2: (useGlobalIds is true)

[
    {
        "geometry": {
            "x": -118.15,
            "y": 33.8
        },
        "attributes": {
            "OWNER": "Joe Smith",
            "VALUE": 94820.37,
            "APPROVED": true,
            "LASTUPDATE": 1227667627940,
            "GlobalID": "{1A9F8368-F9BB-428B-BB03-F45724362DB5}"
        }
    },
    {
        "geometry": {
            "x": -118.37,
            "y": 34.086
        },
        "attributes": {
            "OWNER": "John Doe",
            "VALUE": 17325.9,
            "APPROVED": false,
            "LASTUPDATE": 9269154204840,
            "GlobalID": "{6CE34136-EC3A-40D7-80BF-E1D9BE33812A }"
        }
    }
]

deletes

Description: The object IDs of the features/records to be deleted.

Syntax: deletes=<objectId1>, <objectId2>

If useGlobalIds is false or not specified, the objectIds of the features to be deleted must be provided.

Example 1: deletes=37, 462

Example 2: deletes=[37, 462]

If useGlobalIds is true, the globalIds of the features to be deleted must be provided.

Example 3: deletes = [ "{1A9F8368-F9BB-428B-BB03-F45724362DB5}" , "{6CE34136-EC3A-40D7-80BF-E1D9BE33812A}"]

gdbVersion

This option was added at 10.1.

Description: The geodatabase version to apply the edits. This parameter applies only if the isDataVersioned property of the layer is true.

If the gdbVersion parameter is not specified, edits are made to the published map’s version.

Syntax: gdbVersion=<version>

Example: gdbVersion=SDE.DEFAULT

returnEditMoment

This option was added at 10.5 and works with ArcGIS Server services only.

Description: Optional parameter specifying whether the response will report the time edits were applied. If returnEditMoment = true, the server will return the time in the response's editMoment key. The default value is false.

Values: true|false

Example: returnEditMoment=true

rollbackOnFailure

This option was added at 10.1.

Description: Optional parameter to specify if the edits should be applied only if all submitted edits succeed. If false, the server will apply the edits that succeed even if some of the submitted edits fail. If true, the server will apply the edits only if all edits succeed. The default value is true.

Not all data supports setting this parameter. Query the supportsRollbackonFailureParameter property of the layer to determine whether or not a layer supports setting this parameter. If supportsRollbackOnFailureParameter = false for a layer, then when editing this layer, rollbackOnFailure will always be true, regardless of how the parameter is set. However, if supportsRollbackonFailureParameter = true, the rollbackOnFailure parameter value will be honored on edit operations.

Values: true|false

Example: rollbackOnFailure=true

useGlobalIds

This option was added at 10.4

Description: Optional parameter which is false by default. Requires the layer's supportsApplyEditsWithGlobalIds property to be true.

When set to true, the features and attachments in the adds, updates, deletes, and attachments parameters are identified by their globalIds. When true, the service adds the new features and attachments while preserving the globalIds submitted in the payload. If the globalId of a feature (or an attachment) collides with a pre-existing feature (or an attachment), that feature and/or attachment add fails. Other adds, updates, or deletes are attempted if rollbackOnFailure is false. If rollbackOnFailure is true, the whole operation fails and rolls back on any failure including a globalId collision.

When useGlobalIds is true, updates and deletes are identified by each feature or attachment globalId rather than their objectId or attachmentId.

Values: true|false

Example: useGlobalIds=true

attachments

This option was added at 10.4

Description: Optional parameter which requires the layer's supportsApplyEditsWithGlobalIds property to be true.

Use the attachments parameter to add, update or delete attachments. Applies only when the useGlobalIds parameter is set to true. For adds, the globalIds of the attachments provided by the client are preserved. When useGlobalIds is true, updates and deletes are identified by each feature or attachment globalId rather than their objectId or attachmentId.

NoteNote:
Attachments can be edited using the feature resource regardless of the supportsApplyEditsWithGlobalIds property.

Syntax:

{
 "adds": [<attachment1>, <attachment2>],
 "updates": [<attachment1>, <attachment2>],
 "deletes": ["<attachmentGlobalId1>", "<attachmentGlobalId2>"]
}

Attachments to be added or updated can use either pre-uploaded data or base 64 encoded data.

Example:

{
        "adds": [
            {
                "globalId": "{55E85F98-FBDD-4129-9F0B-848DD40BD911}",
                "parentGlobalId": "{02041AEF-4174-4d81-8A98-D7AC5B9F4C2F}",
                "contentType": "image/pjpeg",
                "name": "Pothole.jpg",
                "uploadId": "{DD1D0A30-CD6E-4ad7-A516-C2468FD95E5E}"
            },
            {
                "globalId": "{3373EE9A-4619-41B7-918B-DB54575465BB}",
                "parentGlobalId": "{6FA4AA68-76D8-4856-971D-B91468FCF7B7}",
                "contentType": "image/pjpeg",
                "name": "Debree.jpg",
                "data": "<base 64 encoded data>"
            }
        ],
        "updates": [
            {
                "globalId": "{8FDD9AEF-E05E-440A-9426-1D7F301E1EBA}",
                "contentType": "image/pjpeg",
                "name": "IllegalParking.jpg",
                "uploadId": "{57860BE4-3B85-44DD-A0E7-BE252AC79061}"
            }
        ],
        "deletes": [
            "{95059311-741C-4596-88EF-C437C50F7C00}",
            " {18F43B1C-2754-4D05-BCB0-C4643C331C29}"
        ]
    }

trueCurveClient

This option was added at 10.5

Description: Optional parameter which is false by default is set by client to indicate to the server that client in true curve capable.

When set to true by client, indicates to the server that true curves geometries should be downloaded from and that geometries containing true curves should be consumed by, the map service without densifying it.

When set to false by client, indicates to the server that client is not true curves capable.

Values: true|false

Example: trueCurveClient=true

sessionID

This option was added at 10.6

Description: Optional parameter which is set by a client during long transaction editing on a branch version. The sessionID is a guid value that clients establish at the beginning and use throughout the edit session. The sessonID ensures isolation during the edit session.

Syntax: sessionID=<sessionID>

Example: sessionID={E81C2E2D-C6A7-40CB-BF61-FB499E53DD1D}

usePreviousEditMoment

This option was added at 10.6

Description: Optional parameter which is set by a client during long transaction editing on a branch version. The usePreviousEditMoment parameter is used to apply the edits with the same edit moment as the previous set of edits. This allows an editor to apply single block of edits partially, complete another task and then complete the block of edits.

When set to true, the edits are applied with the same edit moment as the previous set of edits..

When set to false or not set (default) the edits are applied with a new edit moment.

Values: true|false

Example: usePreviousEditMoment=true

Example usage

Example 1: Add an array of features using the applyEdits operation on a feature service layer resource:

http://services.myserver.com/ERmEceOGq5cHrItq/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0/applyEdits

Sample input for adds, represented by an array of features:

[
    {
      "attributes" : {
        "req_id" : "508389",
        "req_type" : "Graffiti Complaint - Public Property",
        "req_date" : "09\/19\/2009",
        "req_time" : "18:44",
        "address" : "11TH ST and HARRISON ST",
        "x_coord" : "6008925.0",
        "y_coord" : "2108713.8",
        "district" : "6",
        "status" : 1
      },
      "geometry" : {
        "x" : -122.41247978999991,
        "y" : 37.770630098000083
      }
    },
	{
      "attributes" : {
        "req_id" : "508395",
        "req_type" : "Graffiti Complaint - Public Property",
        "req_date" : "09\/19\/2009",
        "req_time" : "19:01",
        "address" : "13TH ST and MANCHESTER ST",
        "x_coord" : "6008929.0",
        "y_coord" : "2108713.9",
        "district" : "6",
        "status" : 1
      },
      "geometry" : {
        "x" : -121.42248867898987,
        "y" : 38.790630098000452
      }
    }
]

Example 2: Update an array of features using the applyEdits operation on a feature service layer resource:

http://services.myserver.com/ERmEceOGq5cHrItq/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0/applyEdits

Sample input for updates, represented by an array of features:

[
    {
      "attributes" : {
	       "objectid": 1234567
        "req_id" : "508389",
        "req_type" : "Graffiti Complaint - Private Property",
        "req_date" : "09\/19\/2009",
        "req_time" : "18:44",
        "address" : "11TH ST and HARRISON ST",
        "x_coord" : "6008925.0",
        "y_coord" : "2108713.8",
        "district" : "6",
        "status" : 2
      },
      "geometry" : {
        "x" : -122.41247978999991,
        "y" : 37.770630098000083
       }
      },
	   {
      "attributes" : {
        "req_id" : "508395",
        "req_type" : "Graffiti Complaint - Public Property",
        "req_date" : "09\/19\/2009",
        "req_time" : "19:01",
        "address" : "13TH ST and MANCHESTER ST",
        "x_coord" : "6008929.0",
        "y_coord" : "2108713.9",
        "district" : "6",
        "status" : 2
      },
      "geometry" : {
        "x" : -121.42248867898987,
        "y" : 38.790630098000452
      }
    }
]

Example 3: Delete features using the applyEdits operation on a feature service layer resource:

http://services.myserver.com/ERmEceOGq5cHrItq/ArcGIS/rest/services/SanFrancisco/311Incidents/FeatureServer/0/applyEdits

The input for deletes is a list of objectIds of the features to be deleted.

JSON response syntax

{
  "addResults" : [ <editResult1>}, <editResult2> ],
  "updateResults" : [ <editResult1>}, <editResult2> ],
  "deleteResults" : [ <editResult1>}, <editResult2> ],
  "attachments": {
        "addResults": [<attachmentEditResult1>, < attachmentEditResult2>],
        "updateResults": [<attachmentEditResult1>, < attachmentEditResult2>],
        "deleteResults": [<attachmentEditResult1>, < attachmentEditResult2>]
    }
}

JSON response example

{
 "addResults": [
  {
   "objectId": 618,
   "success": true
  },
  {
   "success": false,
   "error": {
    "code": -2147217395,
    "description": "Setting of Value for depth failed."
   }
  }
 ],
 "updateResults": [
  {
   "objectId": 50,
   "success": true
  }
 ],
 "deleteResults": [
  {
   "objectId": 25,
   "success": true
  },
  {
   "objectId": 26,
   "success": true
  }
 ]
}

JSON response example (where useGlobalids is true and the attachments parameter is set)

{
    "addResults": [
        {
            "objectId": 618,
            "globalId": "{74100804-E229-49b8-8CDC-9B5D3EF03EDA}",
            "success": true
        },
        {
            "objectId": 619,
            "globalId": "{39B856DC-AFE4-4c02-B433-A9361ACD91CF}",
            "success": true
        }
    ],
    "updateResults": [
        {
            "objectId": 50,
            "globalId": "{9537AFCE-BF6B-4931-93E8-403E12D76916}",
            "success": true
        }
    ],
    "deleteResults": [
        {
            "objectId": 25,
            "globalId": "{1A9F8368-F9BB-428B-BB03-F45724362DB5}",
            "success": true
        },
        {
            "objectId": 26,
            "globalId": "{6CE34136-EC3A-40D7-80BF-E1D9BE33812A}",
            "success": true
        }
    ],
    "attachments": {
        "addResults": [
            {
                "objectId": 500,
                "globalId": "{55E85F98-FBDD-4129-9F0B-848DD40BD911}",
                "success": true
            },
            {
                "objectId": 501,
                "globalId": "{3373EE9A-4619-41B7-918B-DB54575465BB}",
                "success": true
            }
        ],
        "updateResults": [
            {
                "objectId": 600,
                "globalId": "{8FDD9AEF-E05E-440A-9426-1D7F301E1EBA}",
                "success": true
            }
        ],
        "deleteResults": [
            {
                "objectId": 800,
                "globalId": "{95059311-741C-4596-88EF-C437C50F7C00}",
                "success": true
            },
            {
                "objectId": 801,
                "globalId": " {18F43B1C-2754-4D05-BCB0-C4643C331C29}",
                "success": true
            }
        ]
    }
}

JSON response example (where a constraint rule is violated and rollBackOnFailure is true)

{
 "error": {
  "code": 400,
  "extendedCode": -2147207418,
  "message": "Unable to complete operation.",
  "details": [
   "Violated attribute constraint rule. [Error No: -1, ]",
   "Operation rolled back."
  ]
 }
}

JSON response example (where a constraint rule is violated and rollBackOnFailure is false)

{
 "addResults": [
  
 ],
 "updateResults": [
  {
   "objectId": 2,
   "globalId": "{B703ACAC-A1A8-4F49-BB19-1E684A67A265}",
   "success": false,
   "error": {
    "code": 1019,
    "extendedCode": -2147207418,
    "description": "Violated attribute constraint rule. [Error No: -1, ]"
   }
  },
  {
   "objectId": 1,
   "globalId": "{2FACC38A-3E3E-43A5-A6EB-BC9075407EC8}",
   "success": true
  }
 ],
 "deleteResults": [
  
 ]
}