Every attempt I make to UPSERT via REST results in a 405 error which reads:

"errorCode": "METHOD_NOT_ALLOWED",
"message": "HTTP Method 'PATCH' not allowed. Allowed are GET,HEAD,POST"

I've tried to get help here without success: https://stackoverflow.com/questions/17268698/update-records-using-salesforce-rest-api-patch-method-not-working

I am testing this on hurl.it and I have tried these urls:

POST https://XXXX.salesforce.com/services/data/v32.0/sobjects/contact/Id?_HttpMethod=PATCH

PATCH https://XXXX.salesforce.com/services/data/v32.0/sobjects/contact/Id

I am trying to UPSERT based upon a Salesforce ID, not an external lookup.Is it possible to UPSERT based on the Salesforce ID?


  • What object are you working with?
    – Adrian Larson
    Commented Jun 24, 2016 at 15:01
  • Contact (in the URL, hopefully in the right place). It's a shame the email field isn't an external id as I could use that otherwise :(
    – n34_panda
    Commented Jun 24, 2016 at 15:02
  • Ah, so it is. Well, I don't have any answers for you but I'm sure someone on here will know.
    – Adrian Larson
    Commented Jun 24, 2016 at 15:05

1 Answer 1


According to Insert or Update (Upsert) a Record Using an External ID, you should now use POST (as of v37.0). Make sure you're using the 37.0 endpoint (note to visitors from the future: any higher version will work as well, so long as your org supports that version).

Example from the page:

curl https://yourInstance.salesforce.com/services/data/v37.0/sobjects/Account/Id
-H "Authorization: Bearer token"
-H "Content-Type: application/json" -d @newrecord.json -X POST


    "Name" : "California Wheat Corporation",
    "Type" : "New Customer"

This is new as of Summer '16/v37.0.

  • brief test via hurl.it (setting it to post, using the same endpoint - 37.0 and appending the Id field in the json returns the message: ""message": "The Id field should not be specified in the sobject data."?? Looks like it is just an insert, not an upsert? thanks for the reply.
    – n34_panda
    Commented Jun 24, 2016 at 15:53
  • 1
    @n34_panda I see what you mean now. I don't believe there's an equivalent; either you PATCH because you have an ID, or you POST because you don't. Since the REST API only allows single record transactions, I'm not sure this makes much of a difference?
    – sfdcfox
    Commented Jun 24, 2016 at 16:09
  • Ah, it would be only one record at a time but it doesn't help. My only other work around involves quite a bit more code so I better start on that I I can't figure this out today ;(
    – n34_panda
    Commented Jun 24, 2016 at 16:24
  • @n34_panda what platform are you using to make the http requests? It should just be a matter of switching out the http method based on whether or not you have an id. for me in node, all it took was: method : (request.body.Id ? 'PATCH' : 'POST'),
    – martin
    Commented Nov 17, 2016 at 9:17

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .