Google calendar API 400 response
Asked Answered
F

6

10

I'm trying to execute a simple freebusy query on the Google Calendar API. I have my authorization all working fine, can see lists of users' calendars, etc. When I try to submit a free/busy query, I get a 400 error with (as far as I can tell) not details at all about what it doesn't like.

This is true both in my own code and when I use the Google Calendar API "Try It" feature.

Here is my request (created using the Try It widget), and the response:

Request

POST https://www.googleapis.com/calendar/v3/freeBusy?key={YOUR_API_KEY}

Content-Type:  application/json
Authorization:  Bearer ya29.AHES6ZTr-2wksEvp0iGPTnHTirTIItib5WwxmSAySq1ghfI98Cz88kA
X-JavaScript-User-Agent:  Google APIs Explorer

{
     "items": [
          {
              "id": "[my calendar id goes here]@group.calendar.google.com"
          }
     ],
     "timeMin": "2012-01-31T09:00:00",
     "timeMax": "2012-01-31T10:00:00",
     "timeZone": "GMT"
}

Response

400 Bad Request

cache-control:  private, max-age=0
content-encoding:  gzip
content-length:  122
content-type:  application/json; charset=UTF-8
date:  Sun, 16 Jun 2013 13:08:32 GMT
expires:  Sun, 16 Jun 2013 13:08:32 GMT
server:  GSE

{
     "error": {
     "errors": [
          {
              "domain": "global",
              "reason": "badRequest",
              "message": "Bad Request"
           }
     ],
    "code": 400,
    "message": "Bad Request"
     }
}

I think it might have something to do with the dateTime objects/formatting? But I don't have any idea what. I'd really appreciate some help; I've been banging my head against this for a week!

Fail answered 16/6, 2013 at 13:19 Comment(2)
does using "timeZone": "UTC" or removing that attribute change anything? Is the API key in the URL being escaped properly? see: #15927176Solomonsolon
I've tried using UTC, removing the property, and including the timezone offset in the min/max times. None of that has changed anything. Since I'm using Google's API explorer, there's no way to escape anything.Fail
F
31

Ok, I figured it out and I am leaving the answer for anyone else who is LOSING THEIR MIND over this.

Despite what Google's documentation says about format for datetime in this case, the only format I could get to work was this:

2008-03-07T17:06:02.000Z

so that's YYYY-MM-DDTHH:MM:SS.MMMZ

What is the Z for? I don't know, but it has to be there.

Fail answered 18/6, 2013 at 1:55 Comment(6)
Z is for "Zulu"? What. The. Hell. But you can specify time zone in a separate property, and that works.Fail
Z is a shorthand for the UTC (Coordinated Universal Time) timezone. Points for your persistence.Relinquish
I suspected this as being very specific and you have confirmed it! ThanksAltogether
Thanks for this, bad docs... in PHP you can do date('c') for that format.Nutshell
That format is defined by the ISO 8601 standard. In Java, call Instant.now().toString() to generate the string and call Instant.parse( … ) to parse such a string.Febricity
Thank you for posting this answer to document the resolution of the problem. Here it is many years later and I encountered the same issue and never would have figured out it was the date format.Prohibitory
T
1

I had the same problem, but I managed to solve it simply by removing the "Z" from DateTime and in TimeZone putting GMT with the time difference:

'dateTime': '2020-10-31T17:00:00.000',
'timeZone': 'GMT-03:00'
Taam answered 30/10, 2020 at 6:17 Comment(0)
C
1

In case someone is facing similar error while using Google APIs Client Library for Objective-C for REST, use dateTime property instead of the date property when setting the date for the event. I wasted several hours on this.

Cheese answered 9/6, 2023 at 8:49 Comment(0)
V
0

The date time value should be in UTC "TZ" format. Almost all CRMs and public API accept time in this format. If you convert the datetime to UTC time using major language (such as C or Java) library functions/methods they would return a datetime instance in YYYY-MM-DDTHH:MM:SS.MMMZ format.

Verne answered 30/11, 2016 at 4:21 Comment(1)
Actually that format is defined by the ISO 8601 standard. The Z on the end is short for Zulu and means UTC.Febricity
S
0

In short, you are missing the time zone offset in both the timeMin and timeMax variables, this is required even if you have the timeZone variable set.

For example, I live in the America/New_York timezone so my offset would be -05:00, which needs to be appended to the values you currently have. So for me the values would look like,

{
    ...
    "timeMin": "2012-01-31T09:00:00-05:00",
    "timeMax": "2012-01-31T10:00:00-05:00",
    ...
}

To be more specific, Google Calendar API requires that timeMin and timeMax

Must be an RFC3339 timestamp with mandatory time zone offset, for example, 2011-06-03T10:00:00-07:00, 2011-06-03T10:00:00Z. Milliseconds may be provided but are ignored. If timeMax is set, timeMin must be smaller than timeMax.

So you can either have 2012-01-31T09:00:00-5:00 or 2012-01-31T09:00:00Z with the milliseconds as optional (since its ignored anyway).

The Google Calendar Events list API documentation is where I got all the info from.

Supine answered 5/11, 2019 at 2:51 Comment(0)
A
0

Was something slightly different for me, I was missing the milliseconds:

2023-08-06T07:55:23.000Z

Instead of

2023-08-06T07:55:23Z  
Aloeswood answered 8/8, 2023 at 6:22 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.