I receive Graph API error #613 (message: "Calls to mailbox_fql have exceeded the rate of 300 calls per 600 seconds
", type:OAuthException
) when testing my app. It's a desktop app, and the only copy is the one running on my machine (so there's only one access_token
and one user - me).
I query the inbox
endpoint once every 15 seconds or so. Combined, the app makes about 12 API calls (to various endpoints) per minute. It consistently fails on whichever call fetches the 300th thread (there are about 25 threads on the first page of the inbox
endpoint, and I'm only fetching the first page). I am not batching any calls to the Graph API.
I'm developing on Mac OS X 10.7 using Objective-C. I use NSURLConnection
to call the Graph API asynchronously. As far as I know, each request processed by NSURLConnection
should only result in one request to Facebook's API.
Going on the above, I'm having trouble figuring out why I am receiving this error. I suspect that it is because a single call to the inbox
endpoint (i.e. a call to the URI https://graph.facebook.com/me/inbox?access_token=...
) is counted as more than one call to mailbox_fql
. In particular, I think that a single call that returns <n> threads counts as <n> calls against mailbox_fql
. If this is the case, is there a way to reduce the number of calls to mailbox_fql
per API call (e.g. by fetching only the <n> most recent threads in the inbox, rather than the whole first page)?
The documentation appears to be pretty sparse on this topic, so I've had to get by mostly through trial and error. I'd be thrilled if anyone else knows how to tackle this issue.
Edit: It turns out that you can pass a limit
GET parameter that, unsurprisingly, limits the number of results. However, the Developer blog notes some limitations with this approach (namely that fewer results than requested may be returned if some are not visible to your user).
The blog recommends using until
and/or since
as GET parameters when calling the standard Graph API. These parameters take any strtotime()
-compliant string (or Unix epoch time) and limit your results accordingly.
Original answer follows:
After some further research, it looks like my options are to fetch less frequently or use custom FQL queries to limit the number of calls to mailbox_fql. I haven't been able to find any way to limit the response of the standard Graph API call to the inbox
endpoint. In the present case, I'm using an FQL query of the following form:
https://graph.facebook.com/fql?q=SELECT <fields> FROM thread WHERE folder_id=1 LIMIT <n>&access_token=...
<fields>
is a comma-separated list of fields (described in Facebook's thread FQL docs). thread
is the literal name of the table corresponding to the inbox
endpoint; the new thread
endpoint corresponds to the unified_thread
table, but it's not publicly available yet. folder_id=1
indicates that we want to use the inbox (as opposed to outbox or updates folders).
In practice, I'm setting <n>
to 5, which results in a reasonable 200 calls to mailbox_fql
in a 10-minute span when using 15-second call intervals. In my tests, I haven't been receiving error #613, so I guess it works.
I imagine that most people here were already familiar with the ins and outs of FQL, but it was new to me. I hope that this helps some other newbies dealing with similar issues!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With