5

I am trying to send a POST request via the Google Indexing API, but keeps getting HTTP erro 403 (Forbidden).

My code is below:

              require_once '../google-api-php-client-2.2.2/vendor/autoload.php';
              $client = new Google_Client();
              $client->setDeveloperKey('xxxxxxxxxxxxxx');
              $client->setAuthConfig('xxxxxxxxxxxxx.json');
              $client->addScope('https://www.googleapis.com/auth/indexing');
              $httpClient = $client->authorize();
              $endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish?key=xxxxxxxxxx';
              $content = "{
                  \"url\": \"https://www.example.com/whatever.html\",
                  \"type\": \"URL_UPDATED\"
              }";
              $response = $httpClient->post($endpoint, [ 'body' => $content ]);
              $status_code = $response->getStatusCode();
              die('I am done...: ' . $status_code);

My full response is as follows:

GuzzleHttp\Psr7\Response Object
(
    [reasonPhrase:GuzzleHttp\Psr7\Response:private] => Forbidden
    [statusCode:GuzzleHttp\Psr7\Response:private] => 403
    [headers:GuzzleHttp\Psr7\Response:private] => Array
        (
            [Vary] => Array
                (
                    [0] => X-Origin
                    [1] => Referer
                    [2] => Origin,Accept-Encoding
                )

            [Content-Type] => Array
                (
                    [0] => application/json; charset=UTF-8
                )

            [Date] => Array
                (
                    [0] => Sat, 09 Feb 2019 23:13:30 GMT
                )

            [Server] => Array
                (
                    [0] => ESF
                )

            [Cache-Control] => Array
                (
                    [0] => private
                )

            [X-XSS-Protection] => Array
                (
                    [0] => 1; mode=block
                )

            [X-Frame-Options] => Array
                (
                    [0] => SAMEORIGIN
                )

            [X-Content-Type-Options] => Array
                (
                    [0] => nosniff
                )

            [Alt-Svc] => Array
                (
                    [0] => quic=":443"; ma=2592000; v="44,43,39"
                )

            [Accept-Ranges] => Array
                (
                    [0] => none
                )

            [Transfer-Encoding] => Array
                (
                    [0] => chunked
                )

        )

    [headerNames:GuzzleHttp\Psr7\Response:private] => Array
        (
            [vary] => Vary
            [content-type] => Content-Type
            [date] => Date
            [server] => Server
            [cache-control] => Cache-Control
            [x-xss-protection] => X-XSS-Protection
            [x-frame-options] => X-Frame-Options
            [x-content-type-options] => X-Content-Type-Options
            [alt-svc] => Alt-Svc
            [accept-ranges] => Accept-Ranges
            [transfer-encoding] => Transfer-Encoding
        )

    [protocol:GuzzleHttp\Psr7\Response:private] => 1.1
    [stream:GuzzleHttp\Psr7\Response:private] => GuzzleHttp\Psr7\Stream Object
        (
            [stream:GuzzleHttp\Psr7\Stream:private] => Resource id #84
            [size:GuzzleHttp\Psr7\Stream:private] => 
            [seekable:GuzzleHttp\Psr7\Stream:private] => 1
            [readable:GuzzleHttp\Psr7\Stream:private] => 1
            [writable:GuzzleHttp\Psr7\Stream:private] => 1
            [uri:GuzzleHttp\Psr7\Stream:private] => php://temp
            [customMetadata:GuzzleHttp\Psr7\Stream:private] => Array
                (
                )

        )

)

I understand what "Forbidden" means, but I can't understand WHY I am getting the error. I have followed the instructions for setting up. I have set up the API key. I have even set it with no restrictions to start with (of course I will restrict it later), I have set up the service account keys, the json file exists where I call it (without it, I get a 401 error, not 403) and looking at the help for using API keys, I am passing the key correctly.

What am I missing?

Kobus Myburgh
  • 1,114
  • 1
  • 17
  • 46
  • 1
    Have you added the service account as an Owner in Google Search Console as described here: https://developers.google.com/search/apis/indexing-api/v3/prereqs#verify-site ? – dan webb Feb 10 '19 at 02:57
  • @danwebb thank you very much., I did do that, but for my main account, not for the one generated in the .json file. So you solved the problem for me. Please can you post this as an answer so I can accept it as the official answer. – Kobus Myburgh Feb 10 '19 at 07:24

2 Answers2

2

ENABLE the API FIRST. May Be following error help:

"error": { "code": 403, "message": "Indexing API has not been used in project xxxxxxxxxx before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/indexing.googleapis.com/overview?project=XXXXXXXXX then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.",

Amar Singh
  • 31
  • 2
1

If you are getting a 403 error, you most likely just need to add the service account you are using as an Owner in the Google Search Console.

You can find instructions and or information here

dan webb
  • 626
  • 1
  • 5
  • 9