I solved it like this, when I had the same problem, I used SP.WebProxy for my cross-domain call. I'm actually using it right now. When calling a "http" from a "https" which sharepoint is, you can use SP.WebProxy as a middle man, see [here][1] And don't forget to specify ***remote endpoints*** in the Appmanifest.xml It looks like this in my default.aspx: **Example GET** <!-- Placeholder for the remote content --> <span id="categories"></span> <!-- Add references to the JavaScript libraries. --> <script type="text/javascript" src="../_layouts/15/SP.Runtime.js"> </script> <script type="text/javascript" src="../_layouts/15/SP.js"> </script> <script type="text/javascript"> (function () { "use strict"; var examplevariable1 = ""; var examplevariable2 = ""; var examplevariable3 = ""; var context = SP.ClientContext.get_current(); var request = new SP.WebRequestInfo(); request.set_url("example/api/savingsaccounts/1"); request.set_method("GET"); request.set_headers({ "Accept": "application/json;odata=verbose" }); var response = SP.WebProxy.invoke(context, request); context.executeQueryAsync(successHandler, errorHandler); function successHandler(data) { if (response.get_statusCode() == 200) { var json = JSON.parse(response.get_body()); var output = "<UL>"; for (var key in json) { if (json.hasOwnProperty(key)) { examplevariable1 = (json[key].id); //ExampleJSONObject examplevariable2 = (json[key].ExampleJSONObject); examplevariable3 = (json[key].ExampleJSONObject); call_a_method (examplevariable1, examplevariable2, examplevariable3); document.getElementById("categories").innerHTML = examplevariable3; //example output } } } else { var errordesc; errordesc = "<P>Status code: " + response.get_statusCode() + "<br/>"; errordesc += response.get_body(); document.getElementById("categories").innerHTML = errordesc; } } function errorHandler() { document.getElementById("categories").innerHTML = response.get_body(); } })(); </script> **Example PUT** ClosedId = some id i got from some other onclick function RESTPUTCLOSED(c) { var dataObjectClosed = { 'status': 'Closed' } var context = SP.ClientContext.get_current(); var request = new SP.WebRequestInfo(); request.set_url("http://example/REST/_api/savingsaccounts/" + ClosedId); request.set_method("PUT"); request.set_headers({ "Content-Type": "application/json; charset=utf-8" }); request.set_body(JSON.stringify(dataObjectClosed)); var response = SP.WebProxy.invoke(context, request); context.executeQueryAsync(successHandler, errorHandler); } **If you need to authorize ( log in / confirm your access to the remote service)** add this: request.set_headers({ "Authorization": "somekey_ASdkjsakdjaKSJDlksd" }); **To generate the authorization key, follow Shauna's answer [here][2]** [1]: https://msdn.microsoft.com/en-us/library/office/fp179895.aspx [2]: https://stackoverflow.com/questions/20591770/how-to-test-rest-api-using-chromes-extension-advanced-rest-client