I try get user contacts through Outlook contacts REST API. I sucessfully got access token, but when i try to get the contacts i get 404 error.
This is sended url
https://outlook.office.com/api/v1.0/me/contacts?%24select=GivenName%2CSurname%2CEmailAddresses&%24orderby=GivenName&%24top=10
and headers
User-Agent: php-tutorial/1.0 Authorization: Bearer ----token here----- Accept: application/json client-request-id: guid here return-client-request-id: true X-AnchorMailbox: user_email
This is code, which i took right from Microsoft tutorial
public static function makeApiCall($access_token, $user_email, $method, $url, $payload = NULL) { // Generate the list of headers to always send. $headers = array( "User-Agent: php-tutorial/1.0", // Sending a User-Agent header is a best practice. "Authorization: Bearer ".$access_token, // Always need our auth token! "Accept: application/json", // Always accept JSON response. "client-request-id: ".self::makeGuid(), // Stamp each new request with a new GUID. "return-client-request-id: true", // Tell the server to include our request-id GUID in the response. "X-AnchorMailbox: ".$user_email // Provider user's email to optimize routing of API call ); $curl = curl_init($url); switch(strtoupper($method)) { case "GET": // Nothing to do, GET is the default and needs no // extra headers. error_log("Doing GET"); break; case "POST": error_log("Doing POST"); // Add a Content-Type header (IMPORTANT!) $headers[] = "Content-Type: application/json"; curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $payload); break; case "PATCH": error_log("Doing PATCH"); // Add a Content-Type header (IMPORTANT!) $headers[] = "Content-Type: application/json"; curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH"); curl_setopt($curl, CURLOPT_POSTFIELDS, $payload); break; case "DELETE": error_log("Doing DELETE"); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "DELETE"); break; default: error_log("INVALID METHOD: ".$method); exit; } curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $response = curl_exec($curl); error_log("curl_exec done."); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); error_log("Request returned status ".$httpCode); if ($httpCode >= 400) { return array('errorNumber' => $httpCode, 'error' => 'Request returned HTTP error '.$httpCode); } $curl_errno = curl_errno($curl); $curl_err = curl_error($curl); if ($curl_errno) { $msg = $curl_errno.": ".$curl_err; error_log("CURL returned an error: ".$msg); curl_close($curl); return array('errorNumber' => $curl_errno, 'error' => $msg); } else { error_log("Response: ".$response); curl_close($curl); return json_decode($response, true); } }
Could someone say what i did wrong?
The error you're seeing (
MailboxNotEnabledForRESTAPI
) indicates that your Outlook.com mailbox hasn't been enabled for the APIs yet. Unfortunately there's no setting you can change to enable them yourself. We are enabling mailboxes in batches, so for that particular mailbox you would just need to wait until it gets enabled.If you'd like to get a test account so you can get a free trial of Office 365, or you can send us an email at outlookdev@microsoft.com to request a developer preview Outlook.com account. For full details, see the Account Requirements section at https://dev.outlook.com/RestGettingStarted.
That is all outdated information now. All Exchange Online and Outlook.com mailboxes are enabled for REST access. For a free developer tenant, sign up for the Microsoft 365 dev program. For docs on the REST API, see the Microsoft Graph docs. The Outlook REST API is deprecated.