The Facebook APIs are "special" in the sense of "special needs" -- that is, they are very much the hyperactive child running around and knocking things over. They are a fine example of what happens when you let a bunch of smart but *very* inexperienced young programmers take charge of such a project. Some aspects of this particular hell:
- The APIs are, to say the least, whimsical. You get access to some data -- basically, whatever someone felt like giving you access to. Sometimes, that access is a little surprising: for instance, from a user's record, I can find out what groups they have been *invited* into, but not which ones they actually *belong* to. (For that, I have to fetch the group's record.)
- The data model is sometimes entertainingly immature. For example, take the new "pages" concept. A "page" is essentially a Facebook profile for a commercial entity, such as a band or a store. (Not what you think of when you use the word "page", I suspect.) But they created a *single, flat data structure* for all commercial entities, rather than making it polymorphic. So you wind up with a gigantic record, that includes ridiculously unrelated fields like "hours of operation" and "publisher" right next to each other.
- The APIs are *constantly* in flux. Calls are added and deprecated on a weekly basis. In the course of the Spark project (six weeks), we found that we had to make homebrew enhancements to the C# libraries, because the API they were calling by the end of the project had been significantly changed from how it had been when had downloaded them just a little earlier.