One of the most interesting things I ever saw about API design was a presentation by Casey Muratori called "Designing and Evaluating Reusable Components".<p>It's the first time I saw anyone acknowledge this profound insight: sometimes, writing a practically useful API entirely at the same level of abstraction simply isn't possible.<p>Looks like it's available here, now:<p><a href="http://mollyrocket.com/9438" rel="nofollow">http://mollyrocket.com/9438</a>
Also noteworthy is the "How to Design a Good API & Why it Matters" talk<p>video: <a href="http://www.youtube.com/watch?v=aAb7hSCtvGw" rel="nofollow">http://www.youtube.com/watch?v=aAb7hSCtvGw</a><p>pdf: <a href="http://lcsd05.cs.tamu.edu/slides/keynote.pdf" rel="nofollow">http://lcsd05.cs.tamu.edu/slides/keynote.pdf</a>
One library I've found very useful to study is libcurl -- it has a very elegant degradation system. Easy things start out easy, and when the user chooses to handle more complexity she can switch to a lower-level set of calls.
This is an excellent little PDF that was very useful to me when I put together a recent talk titled "API Design Matters". It's amazing how a bit of energy spent focusing on an API's design can improve so many aspects of both using and developing said API.