Creating Resource or Updating Existing Resource via Single API Request
Some API resources can be created, if a particular resource does not exists, or updated, if it already exists, via a single API request. It is called an “upsert” operation and it works the following way:
If a resource is not found by a upsert criteria, then a new resource is created according to the request body and a 201 (Created) status code is returned.
If a resource is found, then the resource is updated according to the request body and a 200 (Ok) status code is returned.
If several resources are found, then the resource is not created or updated, and a 409 (Conflict) status code is returned.
The upsert criteria is specified in the meta section using an “upsert” option. To match a resource
by the resource identifier the “upsert” option should have true
or ["id"]
value. To match a resource by other
field(s), this (these) field(s) should be specified in the “upsert” option value, e.g. ["field1", "field2"]
.
The upsert operation can be supported by POST and/or PATCH JSON:API requests. With the POST request, you can match a resource by the resource identifier or by some other field(s). With the PATCH request, you can match a resource by the resource identifier only.
The documentation of POST and PATCH requests in the API Sandbox contains information whether a resource supports the upsert operation. For example.:
An example of a POST upsert requests when a resource should be matched by the resource identifier:
Request
POST /api/weightunits HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
Request Body
{"data": {
"type": "weightunits",
"id": "kg",
"meta": {
"upsert": true
},
"attributes": {
"conversionRates": {
"lbs": 2.2
}
}
}
}
An example of a PATCH upsert requests when a resource should be matched by the resource identifier:
Request
PATCH /api/weightunits/kg HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
Request Body
{"data": {
"type": "weightunits",
"id": "kg",
"meta": {
"upsert": true
},
"attributes": {
"conversionRates": {
"lbs": 2.2
}
}
}
}
An example of a POST upsert request when a resource should be matched by some field:
Request
POST /api/taxjurisdictions HTTP/1.1
Content-Type: application/vnd.api+json
Accept: application/vnd.api+json
Request Body
{"data": {
"type": "taxjurisdictions",
"meta": {
"upsert": ["code"]
},
"attributes": {
"code": "SOME_TAX_JURISDICTION",
"description": "Some tax jurisdiction description",
"regionText": null,
"zipCodes": [
{"from": "90011", "to": null},
{"from": "90201", "to": "90280"}
]
},
"relationships": {
"country": {
"data": {
"type": "countries",
"id": "US"
}
},
"region": {
"data": {
"type": "regions",
"id": "US-CA"
}
}
}
}
}