{
  "total": 128,
  "page": 1,
  "pagesize": 100,
  "questions": [
    {
      "tags": [
        "support"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1507,
          "accepted": false,
          "answer_comments_url": "/answers/1507/comments",
          "question_id": 1505,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1283031573,
          "last_activity_date": 1283031573,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "What exactly is the 'user' on a post_timeline?",
          "body": "<p><code>user</code> is the user responsible for the event.  The user who posted, edited, etc.'d the post.</p>\n\n<p>It is optional for the same reason all returned user objects are, it can be missing if the user has been deleted (which is very rare) or the post has been migrated to a site where the user has no account (less, but still, rare).</p>\n\n<p>This is yet another thing that will be addressed in a subsequent version.</p>\n",
          "comments": [
            {
              "comment_id": 3955,
              "creation_date": 1283032135,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1507,
              "post_type": "answer",
              "score": 0,
              "body": "currently it is not populated if the owner is responsible for the action."
            },
            {
              "comment_id": 9778,
              "creation_date": 1357409501,
              "owner": {
                "user_id": 151,
                "user_type": "registered",
                "display_name": "Peter Mortensen",
                "reputation": 328,
                "email_hash": "18e42b0ddc143340cfb072987f45ca50"
              },
              "post_id": 1507,
              "post_type": "answer",
              "score": 0,
              "edit_count": 2,
              "body": "&quot;very rare&quot; = 1.1% (I think). In the 2012-04 data dump, 1.1% of the posts on Stack Overflow (questions and answers, 101114 posts out of a total of 8800959) were missing OwnerUserId (which I presume always mean a user no longer exists/is deleted)."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1505/timeline",
      "question_comments_url": "/questions/1505/comments",
      "question_answers_url": "/questions/1505/answers",
      "question_id": 1505,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1283031097,
      "last_edit_date": 1357505744,
      "last_activity_date": 1357505744,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 69,
      "score": 2,
      "community_owned": false,
      "title": "What exactly is the 'user' on a post_timeline?",
      "body": "<p>What exactly is the 'user' on a post_timeline?</p>\n\n<p>I am assuming that it is the user responsible for the action, if not the user, but I cannot be sure as the JSON structure used to document the results does not lend itself to documenting nested objects or arrays.</p>\n\n<p>It is also not clear that it is 'optional'. Again, I attribute this to the limitations of the documentation structure.</p>\n\n<p>Perhaps the results structure could be parsed and rendered as HTML as the parameters are and this information, description and optional, could be provided to us.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "app",
        "data-dump"
      ],
      "answer_count": 7,
      "answers": [
        {
          "answer_id": 2512,
          "accepted": true,
          "answer_comments_url": "/answers/2512/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1270284129,
          "last_activity_date": 1276310055,
          "up_vote_count": 5,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 5,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>If there is enough interest, I will do the work to get this to compile and run on Mono for the LAMP folks.</p>\n\n<p><strong>update</strong>:</p>\n\n<p>I see a <em>little</em> interest. </p>\n\n<p>I am currently focusing my free time, free as in beer as I am currently without job (hint, big freakin hint), on polishing <a href=\"http://soapi.info\">http://soapi.info</a> and it's offerings.</p>\n\n<p>A bit more interest and I will carve out a day to make this happen.</p>\n",
          "comments": [
            {
              "comment_id": 6298,
              "creation_date": 1270511678,
              "post_id": 2512,
              "post_type": "answer",
              "score": 0,
              "body": "If they use Mono, wouldn&#39;t it be LAMM?"
            },
            {
              "comment_id": 6299,
              "creation_date": 1270826418,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2512,
              "post_type": "answer",
              "score": 0,
              "body": "@Aaronaught - the google says there is no LAMM stack. ;-O"
            },
            {
              "comment_id": 6300,
              "creation_date": 1270841411,
              "owner": {
                "user_id": 12,
                "user_type": "registered",
                "display_name": "Adam Davis",
                "reputation": 2183,
                "email_hash": "51301603f62b97a6fecdeeb3a5d41eca"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2512,
              "post_type": "answer",
              "score": 5,
              "body": "I heard Mary had a little LAMM.  Maybe you should collaborate."
            }
          ]
        },
        {
          "answer_id": 2513,
          "accepted": false,
          "answer_comments_url": "/answers/2513/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 1108,
            "user_type": "registered",
            "display_name": "Joel Coehoorn",
            "reputation": 141,
            "email_hash": "61d2a0f034915fa9d2acd6f6b145bba8"
          },
          "creation_date": 1270499092,
          "last_activity_date": 1270499092,
          "up_vote_count": 4,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 4,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>Very nice.  Any chance of sharing the source for this?</p>\n",
          "comments": [
            {
              "comment_id": 6301,
              "creation_date": 1270499890,
              "owner": {
                "user_id": 20,
                "user_type": "registered",
                "display_name": "voyager",
                "reputation": 2123,
                "email_hash": "c658f5d2eae05b8e7cab26a40106cd7c"
              },
              "post_id": 2513,
              "post_type": "answer",
              "score": 1,
              "body": "<a href=\"http://bitbucket.org/bitpusher/soddi/\" title=\"from the question itself.\" rel=\"nofollow\">*Cough cough*</a>"
            },
            {
              "comment_id": 6302,
              "creation_date": 1270500198,
              "owner": {
                "user_id": 1108,
                "user_type": "registered",
                "display_name": "Joel Coehoorn",
                "reputation": 141,
                "email_hash": "61d2a0f034915fa9d2acd6f6b145bba8"
              },
              "post_id": 2513,
              "post_type": "answer",
              "score": 0,
              "body": "Ah, I see the link in his post now :o"
            },
            {
              "comment_id": 6303,
              "creation_date": 1270507653,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2513,
              "post_type": "answer",
              "score": 4,
              "body": "damn.. missed my chance to say RTFM. ;-)"
            },
            {
              "comment_id": 6304,
              "creation_date": 1273967656,
              "post_id": 2513,
              "post_type": "answer",
              "score": 0,
              "body": "I cannot express my many many thanks for the nerds (and I mean that as praise) on Meta.  I love all of you - this app will save me untold amounts of time.  Thank you so much."
            },
            {
              "comment_id": 6305,
              "creation_date": 1276309930,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2513,
              "post_type": "answer",
              "score": 0,
              "body": "@brandon - you are welcome. I would have received your appreciation much earlier if you had commented on the questions or added a &#39;@code&#39; to your comment. cheers."
            }
          ]
        },
        {
          "answer_id": 2514,
          "accepted": false,
          "answer_comments_url": "/answers/2514/comments",
          "question_id": 2511,
          "creation_date": 1289447565,
          "last_edit_date": 1329600305,
          "last_activity_date": 1329600305,
          "up_vote_count": 4,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 4,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>I have the XML files (for example, <code>users.xml</code> and <code>votes.xml</code>) for Stack&nbsp;Overflow data in a folder called 'c:\\sodump'. I fire the command below  (I am using Windows&nbsp;7), but it does not import any records. I would appreciate any help or pointers to possible solutions. I would like to import Stack&nbsp;Overflow data into MySQL.</p>\n\n<pre><code>C:\\Program Files\\Salient Solutions\\SODDI v.10&gt;soddi source:\"c:\\sodump\" target:\"server=localhost;user id=root password=blah;Provider=MySql.Data.MySqlClient\" so:SoDb\n\nStackOverflow Data Dump Import v.10\n\nSource  : c:\\sodump\nTarget  : server=localhost;user id=root;password=blah;Provider=MySql.Data.MySql\nClient\nOptions : None\nImport complete. Approximately 0 rows in 0.00 minutes.\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 6306,
              "creation_date": 1289450703,
              "owner": {
                "user_id": 2286,
                "user_type": "registered",
                "display_name": "Rebecca Chernoff",
                "reputation": 1373,
                "email_hash": "9c29dbc9dd6153ac90c145547b1ae948"
              },
              "post_id": 2514,
              "post_type": "answer",
              "score": 1,
              "body": "I posted my experiences using this to import the data dump in a separate answer <a href=\"http://meta.stackoverflow.com/questions/45333/fast-multi-platform-data-dump-import-sql-server-2000-2005-2008-sqlite-mysql/69956#69956\" title=\"fast multi platform data dump import sql server 2000 2005 2008 sqlite mysql\">meta.stackoverflow.com/questions/45333/&hellip;</a>"
            },
            {
              "comment_id": 6307,
              "creation_date": 1289476191,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2514,
              "post_type": "answer",
              "score": 0,
              "body": "thanks. i will try to get this fixed next week. if you are able, try to follow rchern&#39;s advise on workaround"
            }
          ]
        },
        {
          "answer_id": 2515,
          "accepted": false,
          "answer_comments_url": "/answers/2515/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 2286,
            "user_type": "registered",
            "display_name": "Rebecca Chernoff",
            "reputation": 1373,
            "email_hash": "9c29dbc9dd6153ac90c145547b1ae948"
          },
          "creation_date": 1289450632,
          "last_activity_date": 1289450632,
          "up_vote_count": 7,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 7,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>My experience with the October and November 2010 data dumps importing to MSSQL.</p>\n\n<p>The latest data dump requires that you do a couple of things in order to use this.</p>\n\n<ol>\n<li>Rename the folders.<br>\n<ul>\n<li>The format of the folder needs to be <code>MMYYYY Schema</code>.  </li>\n<li>So, for the Web Apps data dump, I have 2 folders, <code>112010 WA</code> and <code>112010 MWA</code>.  </li>\n<li>The database tables will be <code>&lt;database&gt;.WA.Users</code> and <code>&lt;database&gt;.MWA.Users</code> etc.</li>\n</ul></li>\n<li>Expand the About Me column.\n<ul>\n<li>The About Me column within the built project is 2100 characters.  This is too short.</li>\n<li>I didn't play around with what the length needs to be - I just went with <code>NVARCHAR(MAX)</code>.  </li>\n</ul></li>\n</ol>\n\n<p>If you don't care about the Users table, step 2 isn't necessary.  Chances are you'll want the users table though I suppose.</p>\n",
          "comments": [
            {
              "comment_id": 6308,
              "creation_date": 1289476147,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2515,
              "post_type": "answer",
              "score": 0,
              "body": "thanks for the heads up. i have not run an import in several months. i will try to make time to fix this next week"
            },
            {
              "comment_id": 6309,
              "creation_date": 1295384795,
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 2515,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky Sanders: Does SODDI support the new data dump format? I used it to import the November data dump and the posthistory table wasn&#39;t created."
            }
          ]
        },
        {
          "answer_id": 2516,
          "accepted": false,
          "answer_comments_url": "/answers/2516/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 2989,
            "user_type": "registered",
            "display_name": "Skarab",
            "reputation": 121,
            "email_hash": "08ab32adfbfa32a2f52733864c72c0e6"
          },
          "creation_date": 1292419560,
          "last_edit_date": 1329600322,
          "last_activity_date": 1329600322,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>There is an issue with a case sensitivity of table names within SQL generated for MySQL. Table creation statements use <em>lower</em> case names of tables and insert statements use <em>mixed</em> case names so the importer cannot work with a MySQL database on Linux. Is there a way to make it work with MySQL on a Unix platform?</p>\n",
          "comments": []
        },
        {
          "answer_id": 3415,
          "accepted": false,
          "answer_comments_url": "/answers/3415/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 10885,
            "user_type": "registered",
            "display_name": "Adi Omari",
            "reputation": 21,
            "email_hash": "7dbd9048e8852370399a4e6c2f7fa752"
          },
          "creation_date": 1337008923,
          "last_activity_date": 1337008923,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>can anyone please explain HOW the source directories should be arranged, I have the stack-overflow xml dump (users.xml , posts.xml , votes.xml) inside a directory , I select it as the source directory , but can't get them imported , it tells me <strong>\"Invalid source path.\"</strong> and also the sites list is empty!</p>\n",
          "comments": [
            {
              "comment_id": 9653,
              "creation_date": 1354317462,
              "owner": {
                "user_id": 14518,
                "user_type": "registered",
                "display_name": "Lester",
                "reputation": 121,
                "email_hash": "cc9c4ee332db21117bba126a6c536680"
              },
              "post_id": 3415,
              "post_type": "answer",
              "score": 0,
              "body": "Directory format should be &quot;MMYYYY Schema&quot;, for instance &quot;082012 SO&quot;. this folder should contains all the xml files. You should pass to SODDI tool the folder containing directories in form &quot;MMYYYY Schema&quot;. However, I got an error importing Posts.xml, in the Aug-2012 data dump, &quot;Input string was not in a correct format&quot;."
            }
          ]
        },
        {
          "answer_id": 3801,
          "accepted": false,
          "answer_comments_url": "/answers/3801/comments",
          "question_id": 2511,
          "owner": {
            "user_id": 14518,
            "user_type": "registered",
            "display_name": "Lester",
            "reputation": 121,
            "email_hash": "cc9c4ee332db21117bba126a6c536680"
          },
          "creation_date": 1354324072,
          "last_activity_date": 1354324072,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
          "body": "<p>Very useful tool and very well programmed. However, it doesn't work with latest Aug-2012 data dump. Probably XML schema of dumped data changed from previous version, and now for questions and answers without views, the value for the attribute ViewCount is an empty string. That cause the error mentioned by others in this post \"Input string was not in a correct format\" when the empty string is trying to be converted into a number (Int32).</p>\n\n<p>Solution (that worked for me) was make a simple modification on the source code to handle this case. </p>\n\n<p>File SoBase.cs, line 83 show this:</p>\n\n<p>if (attr == null) </p>\n\n<p>It should be replaced by </p>\n\n<p>if (attr == null || (string.IsNullOrWhiteSpace(attr.Value) &amp;&amp; returnType.IsValueType))</p>\n\n<p>Thanks Sky Sanders for this awesome tool, performance is very good too!</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 2512,
      "favorite_count": 5,
      "question_timeline_url": "/questions/2511/timeline",
      "question_comments_url": "/questions/2511/comments",
      "question_answers_url": "/questions/2511/answers",
      "question_id": 2511,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1270251532,
      "last_edit_date": 1329600407,
      "last_activity_date": 1354324072,
      "up_vote_count": 29,
      "down_vote_count": 0,
      "view_count": 1993,
      "score": 29,
      "community_owned": false,
      "title": "Fast Multi Platform Data Dump Import for SQL Server (2000/2005/2008), SQLite and MySQL",
      "body": "<p>Updated compilation platform to enable execution on x86 and x64.</p>\n\n<p><strong>UPDATE</strong>:</p>\n\n<p>Confirmed with March, April, May and June dumps.</p>\n\n<p>The application readme file and hosting will be moved to <a href=\"http://soapi.info/tools/soddi.aspx\">http://soapi.info/tools/soddi.aspx</a>.</p>\n\n<hr>\n\n<p>Links are in the readme text below.</p>\n\n<p><img src=\"http://skysanders.net/images/soddi-aprildump.PNG\" alt=\"SODDI\"></p>\n\n<pre>\n<strong>Stack Overflow Data Dump Import v.11</strong>\n<sub>\n  ClickOnce Installer: <a href=\"http://skysanders.net/tools/se/soddi/publish.htm\">http://skysanders.net/tools/se/soddi/publish.htm</a>\n\n  (c) 2010 Sky Sanders\n  licensed under MIT/GPL - see license.txt\n\n  msi :<a href=\"http://skysanders.net/files/soddi.11.msi\">http://skysanders.net/files/soddi.11.msi</a>\n  info:<a href=\"http://skysanders.net/tools/se\">http://skysanders.net/tools/se</a>\n  bin :<a href=\"http://skysanders.net/files/soddi.11.zip\">http://skysanders.net/files/soddi.11.zip</a>\n  src :<a href=\"http://bitbucket.org/bitpusher/soddi/\">http://bitbucket.org/bitpusher/soddi/</a>\n\nSODDI is a .NET 3.5 SP1 executable written in C# that quickly and cleanly imports Stack&nbsp;Overflow Data Dump XML files into \n[SQL&nbsp;Server][2] 2000/05/08, [MySQL][3] 5.1 and [SQLite][4] 3 (MySQL and SQLite drivers are included).\n\nSODDI can be run as a command line utility or, when invoked with no arguments or GUI argument, will present a [Windows Forms][5] interface.\n\n<strong>Quick Start:</strong>\nThe quickest route to your own copy of the Stack Overflow databases is to use the ClickOnce installer, browse to the uncompressed data dump, accept the default SQLite provider selection and click 'Import'.\n\n<strong>USAGE:</strong>\n\nsoddi.exe source:\"\" target:\"\" [batch:5000] [split] [indices] [fulltext] [[meta] [so] [su] [sf]] [gui]\n\n\nSOURCE          The directory containing the individual site directories.\n                NOTE: do not include trailing slash in quoted path as the arg\n                parser will interpret it as an escaped quote and puke.\n\nTARGET          A valid ADO.NET connection string, including the provider invariant\n                name.\n\n                Platform specific connection string details:\n\n                SQL Server: the database must exist. Data will be loaded into tables segregated by\n                schema named as the site data being imported. e.g. so.Users, meta.Users.\n                The tables are dropped before import.\n\n                MySQL: The connection string should include server, each site's data will be loaded\n                into a database named as the site imported. The databases will be dropped and \n                recreated before import.\n\n                SQLite: The connection string should specify a directory. The data will be imported\n                into seperate .db3 files, each named as the site imported. Existing data files\n                will be overwritten.\n\n                The target database/datafile/schema names can be modified by explicitely specifying\n                sites to import and appending the desired schema as a parameter value or editing\n                the Sites list item schema in the GUI.\n\n\n-- OPTIONAL ARGUMENTS\n\nSPLIT           Normalize post tags by splitting the concatenated Posts.Tags field into individual \n                rows in a separate PostTags table.\n\nINDICES         Enables useful indexes on each table.\n\nFULLTEXT        Enables a full text index on Posts.Body and Posts.Title - SQL Server only.\n\nBATCH           Number of rows inserted in each transaction. Default 5000.\n\nGUI             Presents a Windows Forms interface. If SODDI is invoked with arguments and GUI, the UI\n                will be populated with the supplied arguments.\n\n                The console window will remain open to recieve all debug and error output.\n\nMETA|SO|SU|SF   Specifies which sites to import. If none are specified, all site directories found in \n                SOURCE will be imported.\n\n                To specify a different target name simply treat the site name as a parameter.\n\n                e.g. \n\n                SQL Server - SO:StackOverflowData will load the data from the XXXXX SO directory \n                into the database specified in the connection string and the schema 'StackOverflowData'\n\n                MySQL - SO:StackOverflowData will load the data from the XXXXX SO directory \n                into a new database named StackOverflowData on the server specified in the connection string.\n\n                SQLite - SO:StackOverflowData will load the data from the XXXXX SO directory into a new \n                db3 file named StackOverflowData.db3 in the directory specified in the connection string.\n\n                In GUI mode you may edit the schema item in the Sites list.\n\nOptions are not case sensitive.\n\nExample command lines.\n\nGUI Mode:\n    soddi \n\nSQLite - all sites:\n    soddi source:\"F:\\Export-030110\" target:\"data source=c:\\temp;version=3;new=True;Provider=System.Data.SQLite\"\n\nMySQL - all sites:\n    soddi source:\"F:\\Export-030110\" target:\"server=localhost;user id=root;password=p@ssW0rd;Provider=MySql.Data.MySqlClient\"\n\nMySQL - Meta StackOverflow and StackOverflow data into specified databases:\n    soddi source:\"F:\\Export-030110\" target:\"server=localhost;user id=root;password=p@ssW0rd;Provider=MySql.Data.MySqlClient\" meta:MetaDb so:SoDb\n\nSQL Server - all sites:\n    soddi source:\"F:\\Export-030110\" target:\"data source=(local);initial catalog=SOData;integrated security=true;Provider=System.Data.SqlClient\"\n\nSQL Server - Stack Overflow data only (SO):\n    soddi source:\"F:\\Export-030110\" target:\"data source=(local);initial catalog=SOData;integrated security=true;Provider=System.Data.SqlClient\" so\n\nSQL Server - Stack Overflow data only into schema dbo:\n    soddi source:\"F:\\Export-030110\" target:\"data source=(local);initial catalog=SOData;integrated security=true;Provider=System.Data.SqlClient\" so:dbo\n\n\nSQL Server - Stack Overflow data only, split tags and add indices:\n    soddi source:\"F:\\Export-030110\" target:\"data source=(local);initial catalog=SOData;integrated security=true;Provider=System.Data.SqlClient\" so split indices\n\nThe latest data dump can be found at\n<a href=\"http://blog.stackoverflow.com/category/cc-wiki-dump/\">http://blog.stackoverflow.com/category/cc-wiki-dump/</a>\n\n\n04/01/2010 - Sky Sanders\n\n04/09/2010 - Explicitly set platform to x86 to allow same binaries to run on x64.\n</sub>\n</pre>\n",
      "comments": [
        {
          "comment_id": 6296,
          "creation_date": 1277306378,
          "post_id": 2511,
          "post_type": "question",
          "score": 1,
          "body": "@Code-poet Congrats on an awesome tool!"
        },
        {
          "comment_id": 6297,
          "creation_date": 1305232994,
          "post_id": 2511,
          "post_type": "question",
          "score": 0,
          "body": "This tool no longer works on the April 2011 data dump.  Posts gets an error &quot;Input string was not in a correct format&quot; and Users gets an error of &quot;The given value of type String from the data source cannot be...&quot; and the window isn&#39;t allowed to maximize, so I can&#39;t tell you the rest."
        },
        {
          "comment_id": 7878,
          "creation_date": 1334595570,
          "owner": {
            "user_id": 10522,
            "user_type": "registered",
            "display_name": "daniel_ev",
            "reputation": 1,
            "email_hash": "58ef2fc6614b91d75271bd25a92eaf54"
          },
          "post_id": 2511,
          "post_type": "question",
          "score": 0,
          "body": "For some reason when importing the January 2011 dump I can only use the gaming, mathematics, photography, programmming and webmaster data - rather than being given a choice between meta, SF, SO and SU like in your screenshot. What am I doing wrong here?"
        }
      ]
    },
    {
      "tags": [
        "app",
        ".net",
        "notification",
        "growl"
      ],
      "answer_count": 4,
      "answers": [
        {
          "answer_id": 829,
          "accepted": false,
          "answer_comments_url": "/answers/829/comments",
          "question_id": 820,
          "owner": {
            "user_id": 208,
            "user_type": "registered",
            "display_name": "Jared Harley",
            "reputation": 111,
            "email_hash": "3b6d84d9dbdd64d3458839aa3cf293a7"
          },
          "creation_date": 1277178177,
          "last_edit_date": 1277249085,
          "last_activity_date": 1277249085,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "soapi-notify : Stay ahead of the pack with new question notification V1 release",
          "body": "<p>I tried it out on Windows 7 running the latest version of Growl for Windows, and I had no problems:</p>\n\n<p><img src=\"http://img444.imageshack.us/img444/765/soapi.png\" alt=\"screenshot\"></p>\n\n<p>My only request - please make a GUI!</p>\n\n<h2>GUI Mockup</h2>\n\n<p>Rather than trying to describe what I would want in a GUI, I'll show you:</p>\n\n<p>The main settings page - you could also add options like \"Start soapi with Windows\", etc. Ideally, soapi would start minimized as an icon in the system tray. You can also specify the refresh time, force a check, and add/remove sites to check.</p>\n\n<p><img src=\"http://img193.imageshack.us/img193/8256/soapidesign1.png\" alt=\"Settings page\" title=\"Main settings page\"></p>\n\n<p>Site-specific page - you can add tags on the left to only have soapi retrieve/display questions with those tags, and on the right, you can add tags to be ignored, even if they occur with a favorited tag on the left.</p>\n\n<p><img src=\"http://img80.imageshack.us/img80/38/soapidesign2.png\" alt=\"SO page\" title=\"site-specific tags\"></p>\n",
          "comments": [
            {
              "comment_id": 1695,
              "creation_date": 1277179044,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 829,
              "post_type": "answer",
              "score": 0,
              "body": "What functionality and features would you like to see in a GUI as opposed to the console? Users will drive the design of this app so don&#39;t be shy."
            },
            {
              "comment_id": 1751,
              "creation_date": 1277249132,
              "owner": {
                "user_id": 208,
                "user_type": "registered",
                "display_name": "Jared Harley",
                "reputation": 111,
                "email_hash": "3b6d84d9dbdd64d3458839aa3cf293a7"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 829,
              "post_type": "answer",
              "score": 0,
              "body": "@code - If you would like, I would be willing to grab your source and make my mockup actually functional"
            },
            {
              "comment_id": 1752,
              "creation_date": 1277254720,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 208,
                "user_type": "registered",
                "display_name": "Jared Harley",
                "reputation": 111,
                "email_hash": "3b6d84d9dbdd64d3458839aa3cf293a7"
              },
              "post_id": 829,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "if you want to skin s-notify, knock yourself out, no need to ask. My initial forays involved a GUI and I intend to provide one tonight. Something to consider: &#39;Show Only&#39; and &#39;Ignore&#39; do the same thing, using different information and must be mutually exclusive. One would either use one textbox and a checkbox or use a radio button group to indicate the tag mode and disable/enable the appropriate box.\n\nIn the source you will notice that I have already pre-wired for the &#39;exclude&#39; flag to apply to the tag list I just have not gotten around to implementing it."
            },
            {
              "comment_id": 1753,
              "creation_date": 1277254791,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 208,
                "user_type": "registered",
                "display_name": "Jared Harley",
                "reputation": 111,
                "email_hash": "3b6d84d9dbdd64d3458839aa3cf293a7"
              },
              "post_id": 829,
              "post_type": "answer",
              "score": 0,
              "body": "see updated design answer for info on where I am going with this tonight."
            },
            {
              "comment_id": 1834,
              "creation_date": 1277382981,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 208,
                "user_type": "registered",
                "display_name": "Jared Harley",
                "reputation": 111,
                "email_hash": "3b6d84d9dbdd64d3458839aa3cf293a7"
              },
              "post_id": 829,
              "post_type": "answer",
              "score": 0,
              "body": "your gui is ready, sir."
            }
          ]
        },
        {
          "answer_id": 830,
          "accepted": false,
          "answer_comments_url": "/answers/830/comments",
          "question_id": 820,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1277197931,
          "last_edit_date": 1277383534,
          "last_activity_date": 1277383534,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "soapi-notify : Stay ahead of the pack with new question notification V1 release",
          "body": "<h2>Design Conversation:</h2>\n\n<p><sub>in reverse chronological order.</sub></p>\n\n<h3>part the Third: in which code poet waxes v1.</h3>\n\n<p>After the unexpected divine intervention of Brian, the developer of Growl for Windows, I was able to refactor the evolving custom pin-able update-able displays into much slimmer and much less complex code. The updates are now batched by the server, soapi-notify, and pushed to the notifications that are still registered for updates.</p>\n\n<p>Thanks Brian.</p>\n\n<p>For those that are not quite satisfied with the default displays provided with soapi-notify, the source for the default display is a great place to start writing your own. Be sure to share it here.</p>\n\n<p>There are a few more things that I would like to incorporate into V1 before calling it soup.</p>\n\n<ul>\n<li>the ability to monitor existing questions. keep an eye on questions as they evolve. </li>\n<li>extended filtering support. either/or tags using the api methods is a bit limiting. I will use client side filtering to provide a more compelling filter experience. </li>\n<li>proxy support - need to set up a proxy to test this.</li>\n</ul>\n\n<p>These will be incorporated gradually over the next month or so. I need to finish some other projects and get a job. Anyone who wants to help out may submit patches and perhaps be added to the team.</p>\n\n<p><strong>Let me know what you think</strong></p>\n\n<hr>\n\n<h3>part the Second: in which code poet introduces vNext.</h3>\n\n<p>So, after considering radius' comments I realize that the omission of the vote/answer/view metric was a bad idea, so I redesigned the new notification and console output.</p>\n\n<p>With new custom display:\n<img src=\"http://img293.imageshack.us/img293/2336/soapinotify014b.png\" alt=\"with soapi-notify-display\"></p>\n\n<p>With plain growl display:\n<img src=\"http://img42.imageshack.us/img42/5456/soapinotify014c.png\" alt=\"plain growl display\"></p>\n\n<p>Regarding the other half of the dialog in which the possibility of updating notifications has been realized in the self-updating notifications. </p>\n\n<p>If a notification times out and closes it self, there is no update. </p>\n\n<p>If the notification is 'sticky', either by configuration via Growl or from 'pinning' by clicking the grey lock icon, the notification refreshes itself at as yet to be determined refresh rate.</p>\n\n<p>Compare the 'How to validate HTML Matches W3C standards' question in the screen shot: The console output shows the state of the question when it was pulled and the notification has tracked, in real-time, the votes, views and answers over the last 4 minutes.</p>\n\n<p>This build is in the source repository right now. If you are familiar or would like to make yourself familiar with the process of manually adding a growl notification type, knock yourself out.</p>\n\n<p>A binary release including self-installation of the display will be released tonight.</p>\n\n<p><strong>Coming Up:</strong></p>\n\n<p>By popular demand: A GUI. </p>\n\n<p>The GUI will provide extended functionality:</p>\n\n<ul>\n<li>more control over and more convenient specification of which tags to include/exclude/pin</li>\n<li><ul>\n<li>select and copy your 'ignored tags' from the site and paste them into a text box to omit questions containing those posts from being notified.</li>\n</ul></li>\n<li><ul>\n<li>select and copy your 'interesting tags' from the site and paste them into a text box to make questions containing those tags 'sticky' by default along with the appropriate background color visual cue.</li>\n</ul></li>\n</ul>\n\n<p><strong>Let me know what you think.</strong></p>\n\n<hr>\n\n<h3>part The First: in which code poet mixes good idea with short sightedness</h3>\n\n<p>I whipped up soapi-notify in a few hours. It actually took more time to publish and document than it did to write.</p>\n\n<p>After using it for a day I am convinced that the idea is much more than a novelty.</p>\n\n<p>I am polling at the recommended 60 second intervals and, funnily enough, I never see a question that is more than a minute old. imagine that. And it brings the point home when I see a stack of questions that are less than 10 seconds old.</p>\n\n<p>So, I am convinced that this is a viable app. With that in mind, lets discuss some design issues.</p>\n\n<p><strong>Vote, Answer and View counts</strong>:</p>\n\n<p>It is quite obvious that my soon to be previous screenshots include these metrics in the results and they seemed relevant in that there was non-null data. But this was due to a bug in the time-zone conversion.</p>\n\n<p>In reality - as explained previously, the questions that are being reported are seconds old. There are no votes and there are no answers. So I have removed those data points, which makes the output much cleaner.</p>\n\n<p><strong>Date Output</strong></p>\n\n<p>For the console output, which is persistent and linear, I am including a short time string.<br>\ne.g. <code>12:02:20 PM</code></p>\n\n<p>For transient notification such as Growl, I am verbalizing the time difference much in the same way you see on the sites.\ne.g. <code>19s ago</code></p>\n\n<p><img src=\"http://img710.imageshack.us/img710/2950/soapinotifyv02screensho.png\" alt=\"alt text\"></p>\n\n<h3>Our very own Growl Display</h3>\n\n<p>So, not content with the default behaviour of any of the displays (growl notification boxes) that are available in that I would like to let them fade out as normal <strong>but</strong> i would also like the ability to 'pin' or make 'sticky' a notification. Kinda like a sticky note.</p>\n\n<p>So I created a custom display just for us. Here is the design at full resolution.</p>\n\n<p><img src=\"http://img443.imageshack.us/img443/3633/soapinotifydisplay.png\" alt=\"alt text\"></p>\n\n<p>I am building it so that all notifications are static height, unlike standard Growl displays, to present a more consistent display. They are just a little wider than most displays I have seen, around 400 pixels.  If this turns out to be an issue with screen real estate we can revisit this and re-institute a more narrow dynamic height notification.</p>\n\n<p><strong>Let me know what you think.</strong></p>\n",
          "comments": [
            {
              "comment_id": 1706,
              "creation_date": 1277201769,
              "owner": {
                "user_id": 295,
                "user_type": "registered",
                "display_name": "radius",
                "reputation": 393,
                "email_hash": "4039b9b5eb98dc011969c1922ff84dec"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "I don&#39;t fully agree with you on &quot;Vote, Answer count&quot;. It&#39;s useless if refresh rate is high, with a refresh rate of 5 minutes like the default in senotify value can be interesting. May be the display can be an option."
            },
            {
              "comment_id": 1707,
              "creation_date": 1277202161,
              "owner": {
                "user_id": 295,
                "user_type": "registered",
                "display_name": "radius",
                "reputation": 393,
                "email_hash": "4039b9b5eb98dc011969c1922ff84dec"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "In my case, I configure growl to keep notification sticky when idle. In this case it would be great to be able to refresh notification data (vote/answer count) (growl for mac can&#39;t do that, I don&#39;t know for windows).\nI think I will work to a better console output in senotify, to be able to always diplay : Question get by last refresh + N older question with still no answer"
            },
            {
              "comment_id": 1710,
              "creation_date": 1277205645,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 295,
                "user_type": "registered",
                "display_name": "radius",
                "reputation": 393,
                "email_hash": "4039b9b5eb98dc011969c1922ff84dec"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@radius - i see your point r.e. metrics. i think it would be unnecessary complexity to optionalize it. I am just going to put them back in. thanks for the perspective."
            },
            {
              "comment_id": 1711,
              "creation_date": 1277205730,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 295,
                "user_type": "registered",
                "display_name": "radius",
                "reputation": 393,
                "email_hash": "4039b9b5eb98dc011969c1922ff84dec"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@radius - r.e. updates on notifications: there is no mechanism in place for that sort of bi-directional communication. the feedback loop is pretty simple, as it should be. Refresh would have to be built into the display. Hey, i know someone who is building a custom display, maybe he can create them to update themselves? let me ask.... self, could you add update ability to the stack exchange display? sure, self, I could do that. Hey, he says he can do it. but not for mac. they are fairly simple to build, perhaps once i get mine built as an example we can recruit someone to write one for mac"
            },
            {
              "comment_id": 1738,
              "creation_date": 1277239519,
              "post_id": 830,
              "post_type": "answer",
              "score": 2,
              "body": "i am the developer of Growl for Windows so i thought i would chime in. you actually <i>can</i> update an existing on-screen display with new data if you want. (few of the built-in or additional displays use this feature though so it is poorly documented). the trick is to set the CoalescingID property on the Notification object you send to GfW. in your custom display, you can use that value to associate existing notifications with the new one and update appropriate. see the &#39;Meter&#39; display for an example (<a href=\"http://code.google.com/p/growl-for-windows/source/browse#svn/trunk/Growl\" rel=\"nofollow\">code.google.com/p/growl-for-windows/source/browse#svn/trunk/&hellip;</a> Extras/MeterDisplay)"
            },
            {
              "comment_id": 1755,
              "creation_date": 1277255657,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@brian - hey. good work on growl. I see the meter source but no example of using it. I can understand how pushing data to an existing notification using a key would work and this would be the best strategy in that I could batch the update requests to the API instead of the current implementation that involves each instance of the display polling for itself. My question is how to track which notifications are still open. I assume that I would simply maintain a local registry of notifications as I open them and then respond to a callback in order to remove them from the update list."
            },
            {
              "comment_id": 1758,
              "creation_date": 1277257062,
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "exactly - see this file, line 65 or so: <a href=\"http://code.google.com/p/growl-for-windows/source/browse/trunk/Growl%20Extras/MeterDisplay/MeterDisplay.cs\" rel=\"nofollow\">code.google.com/p/growl-for-windows/source/browse/trunk/&hellip;</a>\n\nthe ActiveWindows property will contain a list of open notifications that you can use (as long as you opened them using the Display class&#39; Show() method). then it is just a matter of checking the CoalescingGroup (which also takes into account the sending application do you dont accidently update another app&#39;s notifications if your CoalescingIDs collide)."
            },
            {
              "comment_id": 1761,
              "creation_date": 1277258644,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@brian Ahh - i see. I had it backerds. Growl does not handle coalesce, the display does. that makes more sense from every angle. for some reason, i assumed that if i sent the connector a cid that it would find and update the appropriate box. silly me. thanks for the hint. that will allow me to remove a lot of bits from the display and make more efficient calls to the api. I will try to chronicle my foray into building a display in a blog post or two and let you know."
            },
            {
              "comment_id": 1777,
              "creation_date": 1277289774,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@brian- thanks for your help. It makes perfect sense and I have a more economical update pattern in place and a much slimmer display deployement. In a case such as this where the display is specifically tooled for my app, does it make sense to simply embed the display assemblies and deploy/update from the app itself?"
            },
            {
              "comment_id": 1782,
              "creation_date": 1277309545,
              "post_id": 830,
              "post_type": "answer",
              "score": 1,
              "body": "if your app is going to have an installer anyway and the display is tailored specifically for use with your app, then including the display in the app&#39;s installer definitely makes the most sense.\n\nalternatively, you can set up the display to use the one-click web install (similar to other displays on the GfW website) so that end users can just click a link and the display will be installed in the right place automatically. if you want more info on that route, post in the GfW discussion groups and i can provide more detailed instructions: <a href=\"http://groups.google.com/group/growl-for-windows?hl=en\" rel=\"nofollow\">groups.google.com/group/growl-for-windows?hl=en</a>"
            },
            {
              "comment_id": 1792,
              "creation_date": 1277318368,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@brian - thanks for that. I don&#39;t see a need for an installer, really. It is a console app. What I intend to do is embed the display binaries in the executable and when it is run with <code>-g</code>, simply use <code>Detector</code> to probe for the existence of the proper versions of the display and then, if necessary, stream them out to the proper location. This will allow me to ensure that the displays are synced with the exe. This is pretty important, especially in alpha/beta as I move relatively fast and need to maintain the user experience with the least possible amount of pain."
            },
            {
              "comment_id": 2189,
              "creation_date": 1277892339,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 830,
              "post_type": "answer",
              "score": 0,
              "body": "@code poet - the display installation solution doesn&#39;t seem to be quite right yet, the app crashed with an exception <i>Cannot install or update displays while growl is running.</i> The workaround of installing the display first is obvious and did work out fine, but this user experience flaw will likely hinder mass adoption of this otherwise already pretty slick and useful proof of concept ;)"
            }
          ]
        },
        {
          "answer_id": 1736,
          "accepted": false,
          "answer_comments_url": "/answers/1736/comments",
          "question_id": 820,
          "owner": {
            "user_id": 3864,
            "user_type": "registered",
            "display_name": "Todd Ropog",
            "reputation": 101,
            "email_hash": "08e3fe50b4494fadd47061c96b932cfe"
          },
          "creation_date": 1288202037,
          "last_activity_date": 1288202037,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "soapi-notify : Stay ahead of the pack with new question notification V1 release",
          "body": "<p>Is there a way to get this to work with other SE sites, e.g. Programmers.SE?</p>\n",
          "comments": [
            {
              "comment_id": 4626,
              "creation_date": 1288276598,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1736,
              "post_type": "answer",
              "score": 1,
              "body": "i have been, on-and-off, been working on v2  but work has been getting in the way. i feel bad because I have previously promised a new version but just have not been able to give it the time required. This code <i>could</i> be modified to recognize more sites fairly simply, but the UI would be more work, thus the rewrite in progress. I will be sure to update this post with any progress."
            }
          ]
        },
        {
          "answer_id": 3704,
          "accepted": false,
          "answer_comments_url": "/answers/3704/comments",
          "question_id": 820,
          "owner": {
            "user_id": 13846,
            "user_type": "registered",
            "display_name": "Dan Dascalescu",
            "reputation": 101,
            "email_hash": "fb5e3a539b1e23c54b080b6d12b411c2"
          },
          "creation_date": 1350203970,
          "last_edit_date": 1350373234,
          "last_activity_date": 1350373234,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "soapi-notify : Stay ahead of the pack with new question notification V1 release",
          "body": "<p>I've just downloaded the app, entered this for the tags:</p>\n\n<pre><code>meteor JavaScript\n</code></pre>\n\n<p>And got the following error:</p>\n\n<pre><code>soapi-notify: There was an error retrieving results.\nThe remote server returned an error: (400) Bad Request.\n\n\nPress CTRL-C to exit.\n</code></pre>\n\n<p>Another issue: if I lose network connectivity and a poll happens, the app will break, and won't reconnect.</p>\n\n<p>If the app is minimized when any error occurs, you won't know about it, because it doesn't send a Growl notification.</p>\n\n<p>Sky, you around? Might you make these quick fixes?</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 7,
      "question_timeline_url": "/questions/820/timeline",
      "question_comments_url": "/questions/820/comments",
      "question_answers_url": "/questions/820/answers",
      "question_id": 820,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1277119562,
      "last_edit_date": 1279180458,
      "last_activity_date": 1350373234,
      "up_vote_count": 15,
      "down_vote_count": 0,
      "view_count": 835,
      "score": 15,
      "community_owned": false,
      "title": "soapi-notify : Stay ahead of the pack with new question notification V1 release",
      "body": "<h2>soapi-notify</h2>\n\n<p><strong>Stay ahead of the pack</strong></p>\n\n<p>soapi-notify is an easy to use windows application that monitors Stack Exchange sites for new questions. </p>\n\n<p><img src=\"http://img293.imageshack.us/img293/2336/soapinotify014b.png\" alt=\"alt text\"></p>\n\n<p><a href=\"http://www.screencast.com/users/sky.sanders/folders/soapi-notify/media/d8b96355-68ff-4b13-9624-d11c34a461e1\"><strong>Watch a 5 minute end-to-end quickstart video</strong></a></p>\n\n<p>You may filter the questions that are notified by tag. You may choose to see only questions that contain a tag or to see only questions that do not contain a tag.</p>\n\n<p>soapi-notify may be minimized to the notification tray area by pressing the space bar.</p>\n\n<p>You may optionally receive notification via <a href=\"http://www.growlforwindows.com/gfw/default.aspx\">Growl for Windows</a>. soapi-notify carries it's own custom Growl displays that provide a detailed view of questions in a familiar format.</p>\n\n<p>The soapi-notify displays also provide 2 unique capabilities: </p>\n\n<ul>\n<li>Selective pinning: If you would like to keep a question on-screen, simply click the grey lock icon. It will turn gold and the notification will remain on screen while others time out and fade away.</li>\n<li>Updating: A pinned question notification will be updated at regular intervals to reflect the current state of the question.</li>\n</ul>\n\n<p>soapi-notify requires no installation.</p>\n\n<p>Simply place the file in a convenient location and run it from the command line or create a shortcut.</p>\n\n<p>To view command line usage, execute soapi-notify -?</p>\n\n<p>To use the GUI configurator simply execute soapi-notify</p>\n\n<p><strong>NOTE</strong>: </p>\n\n<p>The inspiration for soapi-info came directly from the perl script <a href=\"http://stackapps.com/questions/817/senotify-se-new-question-notification\">SENotify</a> by <a href=\"http://stackapps.com/users/295/radius\">radius</a>.\nIf you like this app, please also give <a href=\"http://stackapps.com/questions/817/senotify-se-new-question-notification\">SENotify</a> an upvote.</p>\n\n<h3>Usage:</h3>\n\n<p><a href=\"http://www.screencast.com/users/sky.sanders/folders/soapi-notify/media/d8b96355-68ff-4b13-9624-d11c34a461e1\"><strong>Watch a 5 minute end-to-end quickstart video</strong></a></p>\n\n<p>You may simply run <code>soapi-notify</code> to invoke the GUI configuration or directly from the command line or from a batch file or windows shortcut.</p>\n\n<p><strong>Switches:</strong></p>\n\n<pre>\n      --sites, -s=VALUE       Sites to monitor, semi-colon delimited. \n                              possible values: \n                              serverfault;stackoverflow;superuser;meta.stackoverflow;stackapps\n\n      --tags, -t=VALUE        If specified, only questions containing these tags will be notified. \n                              semi-colon delimited. example: c#;sqlite\n\n      --exclude, -x           Exclude questions containing tags specified in tags|t\n\n      --poll, -p=VALUE        Polling interval in seconds, default to 60 seconds. Minimum value is 60.\n\n      --growl, -g             Enable growl notification (need growl for windows)\n\n      --update, -u            Update pinned questions. \n                              Note: this option requires Growl For Windows and the use of one of the \n                              soapi-notify displays.\n\n      --help, -h, -?         Show usage.\n\n</pre>\n\n<p><strong>Configurator</strong></p>\n\n<p><img src=\"http://img256.imageshack.us/img256/8647/configurator.png\" alt=\"alt text\"></p>\n\n<p>The configurator can be used to run soapi-notify or as a command-line builder by copying the command line text.</p>\n\n<p><strong>Growl Operation</strong>:</p>\n\n<ul>\n<li>To open the question in the default browser, left click the notification.</li>\n<li>To close a notification, right-click the notification</li>\n<li>Alt-X to close the oldest notification</li>\n<li>Alt-Shift-X to close all open notifications</li>\n</ul>\n\n<p><strong>Growl Configuration</strong>:</p>\n\n<p>To take advantage of the pin-able and update-able displays you must open growl to the 'application' tab</p>\n\n<p><img src=\"http://img191.imageshack.us/img191/9952/growlconfigure.png\" alt=\"alt text\"></p>\n\n<h3>License</h3>\n\n<p>soapi-info is released under the MIT/X11 open source license.</p>\n\n<h3>Download</h3>\n\n<p><a href=\"http://soapinotify.codeplex.com/\">http://soapinotify.codeplex.com/</a></p>\n\n<h3>Requirements</h3>\n\n<ul>\n<li>Windows XP/Vista/7 etc etc (tested on XP and 7. Confirmation of other platforms appreciated)</li>\n<li>.Net framework 3.5</li>\n<li>Growl notification requires installation of <a href=\"http://www.growlforwindows.com/gfw/default.aspx\">Growl for Windows</a></li>\n</ul>\n\n<p>Possible future release for Mono</p>\n\n<h2>Contact</h2>\n\n<p>Sky  @ <a href=\"http://soapinotify.codeplex.com/\">http://soapinotify.codeplex.com/</a></p>\n\n<h2>Code</h2>\n\n<p>soapi-notify was written in C# in Visual Studio 2008.</p>\n\n<p>Version: 1.1.0.1\n- changed api version from 0.9 to 1.0</p>\n\n<p>Version: 1.0.9.1</p>\n\n<ul>\n<li>changed api version from 0.8 to 0.9</li>\n</ul>\n\n<p>Version: 1.0</p>\n\n<ul>\n<li>incorporated custom pin-able and update-able growl displays</li>\n<li>economized api calls</li>\n<li>embedded custom display deployment resulting in a single file deployment</li>\n<li>added gui 'configurator'</li>\n</ul>\n\n<p>Version: 0.1.3</p>\n\n<ul>\n<li>moved to .net 3.5 to eliminate JSON.net dependency</li>\n<li>incorporated ILMerge into build process to merge the Growl assemblies to produce a single executable file</li>\n<li>fixed phantom tray icon issues</li>\n<li>fixed odd issue with capturing keys. now single press of spacebar will minimize the app.</li>\n</ul>\n\n<p>Version: 0.1.2</p>\n\n<ul>\n<li>removed default sticky (this can be configured in growl)</li>\n<li>added link to question. Click notification to open question. Right-Click notification to close.</li>\n</ul>\n\n<p>Version: 0.1.1</p>\n\n<ul>\n<li>fixed timezone issues</li>\n<li>added minimize to tray. press space twice to minimize.</li>\n</ul>\n\n<h2>Credits</h2>\n\n<ul>\n<li>Original Idea: <a href=\"http://stackapps.com/questions/817/senotify-se-new-question-notification\">SENotify</a></li>\n<li><a href=\"http://stackapps.com/questions/347/svg-versions-of-the-logos\">Stack Exchange Icons</a></li>\n</ul>\n\n<p><strong>Coming Soon</strong>:</p>\n\n<ul>\n<li>the ability to monitor existing questions</li>\n<li>extended filtering support</li>\n<li>@you notifications</li>\n<li>proxy support</li>\n</ul>\n\n<p>These will be incorporated gradually over the next month or so. I need to finish some other projects and get a job. Anyone who wants to help out may submit patches and perhaps be added to the team.</p>\n\n<p><sub>Total Cost: 18 developer hours over 3 days</sub></p>\n",
      "comments": [
        {
          "comment_id": 1679,
          "creation_date": 1277126827,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 820,
          "post_type": "question",
          "score": 1,
          "body": "I notice that you keep naming things <code>soapi</code>.  Are you worried that people will think your stuff will only work with Stack Overflow?  Why don&#39;t you go with something more generic?  (just a thought)"
        },
        {
          "comment_id": 1680,
          "creation_date": 1277129503,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 820,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@jjn - ahh.. hmm... i guess i am not really worried about that. i generally make it clear what the scope of my code is. in any case, soapi has a nice ring to it. thanks for the heads up though. and i have a handy place to host all things <code>soapi</code> <a href=\"http://soapi.info\" rel=\"nofollow\">soapi.info</a> ;-)"
        },
        {
          "comment_id": 1797,
          "creation_date": 1277325614,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 820,
          "post_type": "question",
          "score": 0,
          "body": "i would like to see this beauty on Osx :)"
        },
        {
          "comment_id": 1800,
          "creation_date": 1277329079,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "post_id": 820,
          "post_type": "question",
          "score": 0,
          "body": "@system - my abilities on OSX are limited to some shell scripting and mono, so if you want to see it, you have to write it. ;-)"
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed",
        "api-v2",
        "documentation",
        "related"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 3024,
          "accepted": true,
          "answer_comments_url": "/answers/3024/comments",
          "question_id": 3020,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1327874449,
          "last_activity_date": 1327874449,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "type related_site not listed in 'by type' tab list",
          "body": "<p>The link to <a href=\"http://api.stackexchange.com/docs/types/related-site\">related_site</a> has been added.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 3024,
      "favorite_count": 0,
      "question_timeline_url": "/questions/3020/timeline",
      "question_comments_url": "/questions/3020/comments",
      "question_answers_url": "/questions/3020/answers",
      "question_id": 3020,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1327791708,
      "last_edit_date": 1349343944,
      "last_activity_date": 1349343944,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 12,
      "score": 2,
      "community_owned": false,
      "title": "type related_site not listed in 'by type' tab list",
      "body": "<p>The type \"related_site\" is not listed in the <a href=\"https://api.stackexchange.com/docs?tab=type#docs\">'by type' tab</a> in documentation.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "app",
        "api",
        "dev-tool"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 6,
      "question_timeline_url": "/questions/630/timeline",
      "question_comments_url": "/questions/630/comments",
      "question_answers_url": "/questions/630/answers",
      "question_id": 630,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1276129016,
      "last_edit_date": 1340691499,
      "last_activity_date": 1340691499,
      "up_vote_count": 8,
      "down_vote_count": 0,
      "view_count": 541,
      "score": 8,
      "community_owned": false,
      "title": "SOAPI-REST: Complete Stack Overflow API specification in machine readable format",
      "body": "<h2><a href=\"http://soapi.info/Services/Rest.aspx\" rel=\"nofollow\">SOAPI-REST</a> Services</h2>\n\n<p>At four hour intervals, <a href=\"http://stackapps.com/questions/534/soapi-watch-a-realtime-service-that-notifies-subscribers-via-email-twitter-etc\"><strong>SOAPI-WATCH</strong></a> parses the complete Stack Overflow API documentation and generates a complete object graph representing the API including all routes, parameters and return formats.</p>\n\n<p>Much of the data and code generated by the various SOAPI facilities are available via a <a href=\"http://soapi.info/Services/Rest.aspx\" rel=\"nofollow\">REST</a> endpoint.</p>\n\n<p><strong>Status</strong></p>\n\n<p>Parsing and code generation status history. Results are returned in descending chronological order.</p>\n\n<ul>\n<li><a href=\"http://soapi.info/rest/status\" rel=\"nofollow\">http://soapi.info/rest/status</a></li>\n<li><a href=\"http://soapi.info/rest/status?limit=10\" rel=\"nofollow\">http://soapi.info/rest/status?limit=10</a></li>\n</ul>\n\n<p><strong>API specifications</strong></p>\n\n<p>The latest API specification is available in three formats. To view/download specific versions of the API see the API Status page. All results are returned as plain text.</p>\n\n<ul>\n<li>Text - A human friendly dump of the parsed API object graph suitable for review and differencing purposes.\nText is the default output format.\n<ul>\n<li><a href=\"http://soapi.info/rest/api\" rel=\"nofollow\">http://soapi.info/rest/api</a></li>\n<li><a href=\"http://soapi.info/rest/api?format=txt\" rel=\"nofollow\">http://soapi.info/rest/api?format=txt</a></li>\n</ul></li>\n<li>JSON - a complete JavaScript serialization of the parsed API object graph.\n<ul>\n<li><a href=\"http://soapi.info/rest/api?format=json\" rel=\"nofollow\">http://soapi.info/rest/api?format=json</a></li>\n</ul></li>\n<li>JSONP - a complete JavaScript serialization of the parsed API object graph with padding.\n<ul>\n<li><a href=\"http://soapi.info/rest/api?format=json&amp;jsonp=yourJSONPCallback\" rel=\"nofollow\">http://soapi.info/rest/api?format=json&amp;jsonp=yourJSONPCallback</a></li>\n</ul></li>\n<li>XML - a complete XML serialization of the parsed API object graph.\n<ul>\n<li><a href=\"http://soapi.info/rest/api?format=xml\" rel=\"nofollow\">http://soapi.info/rest/api?format=xml</a></li>\n</ul></li>\n</ul>\n",
      "comments": []
    },
    {
      "tags": [
        "library",
        "javascript",
        "soapi.js"
      ],
      "answer_count": 12,
      "answers": [
        {
          "answer_id": 1434,
          "accepted": false,
          "answer_comments_url": "/answers/1434/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282263356,
          "last_edit_date": 1282296637,
          "last_activity_date": 1282296637,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Basic Usage Example 01</h3>\n\n<pre><code>var ctx = new Soapi.ApiContext(apiKey);\nctx.initialize(function() {  // ctx.initialize loads sites from stackauth\n\n    var site = ctx.find(\"api.stackapps.com\"); // site is Soapi.Domain.Site\n    // if you are using Visual Studio, you can use the constructor of any domain '\n    // object as a Cast operation to enable intellisense...\n    site = new Soapi.Domain.Site(ctx.find(\"api.stackapps.com\"));\n\n    // data is fetched via intuitively named query methods rooted on the site\n    // lets start out with a _simple_ example\n\n    var example_01 = document.getElementById(\"example_01\");\n    var list = document.createElement(\"ul\");\n    example_01.appendChild(list);\n\n    site.Users().invoke(function(users) { // get a page of users\n\n        users.ForEach(function(user) {\n\n            // add a list item for the user\n            var userListItem = document.createElement(\"li\");\n            list.appendChild(userListItem);\n            userListItem.innerHTML = user.display_name;\n\n            // add a nested list to hold the user's questions\n            var userQuestionsList = document.createElement(\"ul\");\n            userListItem.appendChild(userQuestionsList);\n\n            // get a page of the user's questions\n            user.Questions().invoke(function(questions) {\n\n                questions.ForEach(function(question) {\n\n                    // add the question\n                    var questionListItem = document.createElement(\"li\");\n                    questionListItem.innerHTML = question.title;\n                    userQuestionsList.appendChild(questionListItem);\n\n                });\n\n            });\n        });\n    });\n});\n</code></pre>\n\n<p><strong>Output</strong></p>\n\n\n  <ul>\n    <li>\n      George Edison<ul>\n        <li>\n          My reputation graph is messed up.\n        </li>\n        <li>\n          How to retrieve notifications for a given user.\n        </li>\n        <li>\n          StackList - List Your Apps, Track Bugs, and More!\n        </li>\n        <li>\n          lots of questions ...\n        </li>\n      </ul>\n    </li>\n\n    <li>\n      Kevin Montrose<ul>\n        <li>\n          World's Worst StackOverflow Clone\n        </li>\n        <li>\n          Getting your [app] to show up in the AppStore\n        </li>\n        <li>\n          a few questions ...\n        </li>\n\n      </ul>\n    </li>\n\n    <li>\n      code poet<ul>\n        <li>\n          Soapi.JS2 - a whole nother thang. alpha preview.\n        </li>\n        <li>\n          /users/{id}/reputation != xxx.com/reputation\n        </li>\n        <li>\n          How to generate a list of users ranked by bug report submissions.\n        </li>\n        <li>\n          lots of questions ...\n        </li>\n\n      </ul>\n    </li>\n\n    <li>\n      lfoust<ul>\n        <li>\n          Stacky - A .Net client library\n        </li>\n        <li>\n          nottagged parameter not documented\n        </li>\n      </ul>\n    </li>\n\n    <li>\n      systempuntoout<ul>\n        <li>\n          questions method returns error 4000\n        </li>\n        <li>\n          StackPrinter: The Stack Exchange Printer Suite\n        </li>\n         <li>\n          lots of questions ...\n        </li>\n\n      </ul>\n    </li>\n  </ul></li>\n\n  <p>\n    ... ... and on and on\n  </p>\n\n",
          "comments": []
        },
        {
          "answer_id": 1435,
          "accepted": false,
          "answer_comments_url": "/answers/1435/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282268854,
          "last_edit_date": 1282392967,
          "last_activity_date": 1282392967,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Async usage pattern</h3>\n\n<p>All query methods use the following typical async pattern</p>\n\n<pre><code>//\n\nsite.Badges().invoke(function onSuccess(items, userContext, methodName) {\n\n    // handle items array of domain objects\n    // if linq.js is loaded the items array will be an instance of\n    // Enumerable&lt;domain object&gt;\n\n}, function onFailed(error, userContext, methodName) {\n\n    // handle error - which looks like this:\n\n    //    error : {\n    //        message: \"the message\",\n    //        code: 500, // the status code\n    //        url: \"the url that failed\"\n    //    };\n\n\n}, { someUserContext: \"foo\" });\n\n//\n</code></pre>\n\n<p>The static ApiProxy provides a place to hang default/global handlers. Certain application structures lend themselves well to a centralized response handler.</p>\n\n<pre><code>// on Soapi.Net.ApiProxy, you may set default callbacks. e.g.\n\nSoapi.Net.ApiProxy\n .set_defaultSucceededCallback(function(data, userContext, methodName) {\n    // default response handler\n});\n\nSoapi.Net.ApiProxy\n .set_defaultFailedCallback(function(error, userContext, methodName) {\n    // default error handler\n});\n</code></pre>\n\n<p>Once you are comfortable with the async pattern used by Soapi.JS2, a clear understanding of query parameterization is in order.....</p>\n\n<p><strong>NEXT:</strong> <a href=\"#1440\" rel=\"nofollow\">Parameterization and Paging</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1436,
          "accepted": false,
          "answer_comments_url": "/answers/1436/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282294560,
          "last_edit_date": 1282392926,
          "last_activity_date": 1282392926,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Api Coverage</h3>\n\n<p>Every path in the API has a reciprocal query rooted on the <code>Soapi.Domain.Site</code> object.</p>\n\n<p>The query syntax has been constructed to be as intuitive as possible.</p>\n\n<p>A complete map of Soapi.JS2 query path to API rest path follows.</p>\n\n<p><strong>Api Routes</strong></p>\n\n<ul>\n<li>\n/answers/{id}<br/>\n<code>site.Answers().ById(704).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/answers/704<br/>&nbsp;\n</li>\n<li>/answers/{id}/comments<br/>\n<code>site.Answers().ById(704).Comments().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/answers/704/comments</sub><br/>\n</li>\n<li>/badges<br/>\n<code>site.Badges().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/badgeshttp://api.stackapps.com/1.0/badges</sub><br/>&nbsp;</li>\n\n<li>/badges/{id}<br/>\n<code>site.Badges().ById(9).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/badges/9http://api.stackapps.com/1.0/badges/9</sub><br/>&nbsp;</li>\n\n<li>/badges/name<br/>\n<code>site.Badges().ByName().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/badges/name</sub><br/>&nbsp;</li>\n\n<li>/badges/tags<br/>\n<code>site.Badges().ByTags().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/badges/tags</sub><br/>&nbsp;</li>\n\n<li>/comments/{id}<br/>\n<code>site.Comments().ById(1489).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/comments/1489</sub><br/>&nbsp;</li>\n<li>/errors/{id}<br/>\nerrors has a path on the ApiContext but is not exposed via Site<br/>&nbsp;</li>\n<li>/posts/{id}/comments<br/>\n<code>site.Posts().ById(704).Comments().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/posts/704/comments</sub><br/>&nbsp;</li>\n\n<li>/questions<br/>\n<code>site.Questions().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions</sub><br/>&nbsp;</li>\n\n<li>/questions/{id}<br/>\n<code>site.Questions().ById(386).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions/386</sub><br/>&nbsp;</li>\n\n<li>/questions/{id}/answers<br/>\n<code>site.Questions().ById(386).Answers().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions/386/answers</sub><br/>&nbsp;</li>\n\n<li>/questions/{id}/comments<br/>\n<code>site.Questions().ById(386).Comments().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions/386/comments</sub><br/>&nbsp;</li>\n\n<li>/questions/{id}/timeline<br/>\n<code>site.Questions().ById(386).Timeline().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions/386/timeline</sub><br/>&nbsp;</li>\n\n<li>/questions/Unanswered<br/>\n<code>site.Questions().Unanswered().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/questions/unanswered</sub><br/>&nbsp;</li>\n\n<li>/Revisions/{id}<br/>\n<code>site.Posts().ById(386).Revisions().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/revisions/386</sub><br/>&nbsp;</li>\n\n<li>/Revisions/{id}/{revisionguid}<br/>\n<code>site.Posts().ById(386).Revisions().ByRevisionGuid(\"e452e755-a3fe-45d0-976f-e319ec460200\").invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/revisions/386/e452e755-a3fe-45d0-976f-e319ec460200</sub><br/>&nbsp;</li>\n\n<li>/search<br/>\n<code>site.Search().intitle(\"soapi.js\").invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/search?intitle=soapi.js</sub><br/>&nbsp;</li>\n\n<li>/stats <br/>\n<code>site.Stats().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/stats</sub><br/>&nbsp;</li>\n\n<li>/tags<br/>\n<code>site.Tags().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/tags</sub><br/>&nbsp;</li>\n\n<li>/users<br/>\n<code>site.Users().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users</sub><br/>&nbsp;</li>\n\n<li>/users/{id}<br/>\n<code>site.Users().ById(14).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/answers<br/>\n<code>site.Users().ById(14).Answers().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/answers</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/badges<br/>\n<code>site.Users().ById(14).Badges().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/badges</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/comments<br/>\n<code>site.Users().ById(14).Comments().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/comments</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/comments/{toid}<br/>\n<code>site.Users().ById(14).CommentsTo(18).invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/comments/18</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/favorites<br/>\n<code>site.Users().ById(14).Favorites().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/favorites</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/mentioned<br/>\n<code>site.Users().ById(14).Mentioned().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/mentioned</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/questions<br/>\n<code>site.Users().ById(14).Questions().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/questions</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/reputation<br/>\n<code>site.Users().ById(14).Reputation().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/reputation</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/tags<br/>\n<code>site.Users().ById(14).Tags().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/tags</sub><br/>&nbsp;</li>\n\n<li>/users/{id}/timeline<br/>\n<code>site.Users().ById(14).Timeline().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/14/timeline</sub><br/>&nbsp;</li>\n\n<li>/users/moderators<br/>\n<code>site.Moderators().invoke(/*handlers here*/);</code><br/>\n<sub>http://api.stackapps.com/1.0/users/moderators</sub><br/>&nbsp;</li>\n</ul>\n\n<p><strong>StackAuth Routes</strong></p>\n\n<ul>\n<li>/sites - always available after ApiContext initialization<br/>\n<code>ctx.sites;</code><br/>\n<sub>http://stackauth.com/1.0/sites</sub><br/>&nbsp;</li>\n\n\n<li>/users/{id}/associated<br/>\n<code>site.Users().ByIdAssociated(\"e58345f5-0f7b-4261-b449-3959c596f91f\").invoke(/*handlers here*/);</code><br/>\nhttp://stackauth.com/1.0/users/e58345f5-0f7b-4261-b449-3959c596f91f/associated</sub><br/>&nbsp;</li>\n</ul>\n\n<p><strong>NEXT:</strong> <a href=\"#1437\" rel=\"nofollow\">Relational Queries</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1437,
          "accepted": false,
          "answer_comments_url": "/answers/1437/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282295460,
          "last_edit_date": 1282392951,
          "last_activity_date": 1282392951,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Relational Queries</h3>\n\n<p>When JSON results are received from the API, they are used to build domain objects from the <code>Soapi.Domain</code> namespace.</p>\n\n<p>Upon these objects are strategically placed queries, the same queries you will find rooted on the <code>Site</code> object, that are pre-keyed to return data for that object.</p>\n\n<p><strong>NOTE</strong>: </p>\n\n<p>Query methods are upper-cased to make it clear that it is a query method, not a property.</p>\n\n<ul>\n<li><code>user.reputation</code> <sub>(a json property)</sub><br/></li>\n<li><code>user.Reputation()</code> <sub>(an api query)</sub><br/>\n&nbsp;<br/></li>\n<li><code>answer.comments</code> <sub>(a json property)</sub><br/></li>\n<li><code>answer.Comments()</code> <sub>(an api query)</sub><br/></li>\n</ul>\n\n<hr>\n\n<p><strong>Soapi.Domain.User</strong></p>\n\n<ul>\n<li><code>user.Answers().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/answers</sub><br/>&nbsp;</li>\n\n<li><code>user.Badges().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/badges</sub><br/>&nbsp;</li>\n\n<li><code>user.Comments().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/comments</sub><br/>&nbsp;</li>\n\n<li><code>user.CommentsTo(18).invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/comments/18</sub><br/>&nbsp;</li>\n\n<li><code>user.Favorites().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/favorites</sub><br/>&nbsp;</li>\n\n<li><code>user.Mentioned().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/mentioned</sub><br/>&nbsp;</li>\n\n<li><code>user.Questions().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/questions</sub><br/>&nbsp;</li>\n\n<li><code>user.Reputation().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/reputation</sub><br/>&nbsp;</li>\n\n<li><code>user.Tags().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/tags</sub><br/>&nbsp;</li>\n\n<li><code>user.Timeline().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/users/14/timeline</sub><br/>&nbsp;</li>\n</ul>\n\n<p><strong>Soapi.Domain.Answer</strong></p>\n\n<ul>\n\n<li><code>answer.Comments().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/answers/1305/comments</sub><br/>&nbsp;</li>\n\n<li><code>answer.Revisions().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/revisions/1305</sub><br/>&nbsp;</li>\n\n<li><code>answer.Revisions().ByRevisionGuid(\"0eabd918-e2c9-4176-8dbd-d56fc8bd1dd2\").invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/revisions/1305/0eabd918-e2c9-4176-8dbd-d56fc8bd1dd2</sub><br/>&nbsp;</li>\n</ul>\n\n<p><strong>Soapi.Domain.Question</strong></p>\n\n<ul>\n<li><code>question.Answers().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/questions/386/answers</sub><br/>&nbsp;</li>\n\n<li><code>question.Comments().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/questions/386/comments</sub><br/>&nbsp;</li>\n\n<li><code>question.Timeline().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/questions/386/timeline</sub><br/>&nbsp;</li>\n\n<li><code>question.Revisions().invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/revisions/386</sub><br/>&nbsp;</li>\n\n<li><code>question.Revisions().ByRevisionGuid(\"e452e755-a3fe-45d0-976f-e319ec460200\").invoke(/*handlers here*/);</code><br/><sub>\nhttp://api.stackapps.com/1.0/revisions/386/e452e755-a3fe-45d0-976f-e319ec460200</sub><br/>&nbsp;</li>\n</ul>\n\n<p>Where you see <code>.invoke(/*handlers here*/)</code> is where you would implement a standard asynchronous pattern as described in the next post.....</p>\n\n<p><strong>NEXT:</strong> <a href=\"#1435\" rel=\"nofollow\">Soapi.JS2 Async Pattern</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1438,
          "accepted": false,
          "answer_comments_url": "/answers/1438/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282296490,
          "last_edit_date": 1282393053,
          "last_activity_date": 1282393053,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Stubs</h3>\n\n<p>Many of the json results coming from the api contain either 'stub' objects, typically user objects, or just an object reference id.</p>\n\n<p>e.g.</p>\n\n<pre><code>{\n \"total\": 879225,\n \"page\": 1,\n \"pagesize\": 30,\n \"questions\": [\n  {\n   \"tags\": [\n    \"c#\"\n   ],\n   \"answer_count\": 12,\n   \"accepted_answer_id\": 7, // &lt;-- reference\n   \"question_id\": 4,\n   \"owner\": {               // &lt;-- stub\n    \"user_id\": 8,\n    \"user_type\": \"registered\",\n    \"display_name\": \"Eggs McLaren\",\n    \"reputation\": 193,\n    \"email_hash\": \"c7ec7dec48168d2a7d792e2b0acc78d1\"\n   },\n   \"creation_date\": 1217540572,\n   \"last_edit_date\": 1248550390,\n</code></pre>\n\n<p>Two measures have been taken to facilitate retrieval of these objects:</p>\n\n<ol>\n<li><p>Every <code>Soapi.Domain.User</code> object has a <code>.Fetch()</code> method which can be used to retrieve the full object, which you may use to overwrite the stub.\ne.g. <code>question.user.Fetch().invoke(/**/);</code></p></li>\n<li><p>Appropriately named and keyed query objects are emplaced on objects that contain unambiguouous reference id fields.</p>\n\n<ul>\n<li><code>Tag.User().invoke(/*handlers here*/);</code></li>\n<li><code>UserTimeline.User().invoke(/*handlers here*/);</code></li>\n<li><code>RepChange.User().invoke(/*handlers here*/);</code></li>\n<li><code>Migrated.Question().invoke(/*handlers here*/);</code></li>\n<li><code>Question.AcceptedAnswer().invoke(/*handlers here*/);</code></li>\n<li><code>Answer.Question().invoke(/*handlers here*/);</code> </li>\n</ul></li>\n</ol>\n\n<p>If you need to programatically determine if an object is a 'stub', simply check if <code>object._isStub === true</code>.</p>\n\n<p><strong>NEXT:</strong> <a href=\"#1448\" rel=\"nofollow\">Throttling and Caching</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1440,
          "accepted": false,
          "answer_comments_url": "/answers/1440/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282303992,
          "last_edit_date": 1282392997,
          "last_activity_date": 1282392997,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Parameterization And Paging</h3>\n\n<p><strong>Overview:</strong></p>\n\n<p>Soapi.JS2 facilitates query parameterization using 'fluent' or 'chained' setter methods and maintains full parity with the documention found on the <a href=\"http://api.stackoverflow.com/1.0/help\">API help pages</a>.</p>\n\n<p>For example: the route <a href=\"http://api.stackoverflow.com/1.0/help/method?method=answers/%7bid%7d\">/answers/{id}</a> is serviced by Soapi.JS2 as follows:</p>\n\n<pre><code>site.Answers()\n .ById(200)\n .withBody(true)\n .withComments(true)\n .fromdate(\"1/1/1970\")           // &lt;-- any parsable date value\n .todate(Date.parse(\"1/1/2040\")) // &lt;-- or a date (or number)\n .sort(\"votes\")\n .min(0)\n .max(10)\n .order(\"desc\")\n .page(2)\n .pagesize(100);\n</code></pre>\n\n<hr>\n\n<p><strong>ID Handling:</strong></p>\n\n<p>For queries that require a 'vectorized id', you may specify a single number or string, an array of numbers or strings or simply provide a semi-colon delimited list as described on the help pages.</p>\n\n<pre><code>site.Questions().ById(1).invoke();\nsite.Questions().ById(\"1\").invoke();\nsite.Questions().ById([1, 2]).invoke();\nsite.Questions().ById(\"1;2\").invoke();\n</code></pre>\n\n<p>The same principal applies to any API parameter that calls for a list of string.</p>\n\n<pre><code>site.Questions().tagged([\"app\", \"library\"]).invoke();\nsite.Questions().tagged([\"app;library\"]).invoke();\n</code></pre>\n\n<p><strong>Content Parameters</strong></p>\n\n<p>The boolean content flags are prefixed with 'with' to avoid collisions</p>\n\n<pre><code>site\n.Questions()\n.withAnswers(true)\n.withBody(true)\n.withComments(true)\n.invoke();\n</code></pre>\n\n<p><strong>Date Handling:</strong></p>\n\n<p>All dates in Soapi, in and out, are in JavaScript date format and are in Local time. If the UTC value is needed, simply use the methods on the Date object.</p>\n\n<p>Any parameter that requires or will accept a Date (unix timestamp on the API side) values will accept any parsable representation of a date.</p>\n\n<pre><code>site\n.Questions()\n.fromdate(\"1/1/1980\")\n.todate(Date.parse(\"1/1/2020\"))\n.invoke();\n</code></pre>\n\n<p><strong>Min/Max</strong></p>\n\n<p>Min/Max, the types and values, are contextually bound to the <code>sort</code> that is applied to the query. </p>\n\n<p>When <code>Date</code> values are indicated by the selected <code>sort</code>, the same date parsing features described above apply.</p>\n\n<p>For more information about min/max see: <a href=\"http://stackapps.com/questions/922/how-to-use-min-max-with-sort\">How to use min/max with sort</a></p>\n\n<p><strong>Paging:</strong></p>\n\n<p>In addition to the <code>.page()</code> and <code>.pagesize()</code> parameters, which behave as documented on the API help pages, Soapi.JS2 supports fetching of multiple pages using the <code>.pagecount()</code> parameter.</p>\n\n<pre><code>site.Questions()\n.tagged(\"c#\").pagecount(3)\n.invoke(function(data) {\n   // three pages worth of items\n});\n</code></pre>\n\n<p>To retrieve all available pages, specify <code>.pagecount(0)</code>. </p>\n\n<p>Soapi.JS2 ALPHA does not yet provide a mechanism for cancellation of a paging operation, so you will want to be aware of the potential size of the dataset you are asking for before sending an 'all pages' requests, which makes the <code>.total()</code> method even more useful....</p>\n\n<p>All queries expose an async <code>.total()</code> method that will return the total count of records that match the query as parameterized.</p>\n\n<pre><code>site.Questions().tagged(\"c#\").total(function(total) {\n    alert(\"there are \" + total + \" c# questions\");\n});\n</code></pre>\n\n<p><strong>NEXT:</strong> <a href=\"#1438\" rel=\"nofollow\">Stubs</a> (partially populated objects)</p>\n",
          "comments": []
        },
        {
          "answer_id": 1441,
          "accepted": false,
          "answer_comments_url": "/answers/1441/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282306051,
          "last_edit_date": 1282392908,
          "last_activity_date": 1282392908,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>ApiContext</h3>\n\n<p>Query based Soapi.JS2 usage is rooted on the <code>ApiContext</code> object. This object maintains the list of Site that are available for query and provides central services.</p>\n\n<p>You gotta have one and it must be initialized.</p>\n\n<pre><code>var context = new Soapi.ApiContext(apiKey);\n\ncontext.initialize(function onSuccess(){\n\n   // proceed \n\n}, function onFailed(error){\n   // handle error;\n});\n</code></pre>\n\n<p>Once you have an intialized context, all query based activity will be rooted on a Site. </p>\n\n<p>The <code>ApiContext</code> provides access to all Stack Exchange sites via the <code>.context.find(apiendpoint)</code> method which will return a <code>Site</code> object.</p>\n\n<pre><code>var site = context.find(\"api.stackapps.com\");\n</code></pre>\n\n<p>The <code>official</code> sites, e.g. those not living in Area51, also have a convenience accessor, <code>context.official.xxxx</code>.</p>\n\n<pre><code>var site = context.official.stackOverflow;\n</code></pre>\n\n<p>Living on the Site object are the properties you would expect, with reference to the data structure returned by <code>/sites</code>, as well as query methods that provide full coverage of the Stack Exchange API.</p>\n\n<p><strong>NEXT:</strong> <a href=\"#1436\" rel=\"nofollow\">API Query Coverage</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1448,
          "accepted": false,
          "answer_comments_url": "/answers/1448/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282392688,
          "last_edit_date": 1283576077,
          "last_activity_date": 1283576077,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Throttling and Caching</h3>\n\n<p>In order to provide maximum data throughput and at the same time protect your application from, and obviate coding for, server errors due to throttle rate violations and/or polling abuse, Soapi.JS2 implements a caching throttle implementation, <code>Soapi.Net.ThrottleCache</code>, that throttles on a sliding window with a governor supplemented by a per route configurable request cache.</p>\n\n<p>Throttling and caching is optional but <strong>strongly</strong> recommended and is enabled by default.</p>\n\n<p>All http requests are handled by a static instance of <code>ThrottleCache</code> that lives @ <code>Soapi.Net.Throttle</code>.</p>\n\n<p>e.g. </p>\n\n<pre><code>// internal code\nSoapi.Net.Throttle = \n    new Soapi.Net.ThrottleCache(throttleWindowTime, throttleWindowCount, \n    maxActiveRequests, defaultCacheDuration);\n\n// Allow [throttleWindowCount] requests per [throttleWindowTime] \n//       while active requests &lt; maxActiveRequests \n\n// Cache all results [defaultCacheDuration] if an explicit cache rule for that route, \n// e.g. '/users/{id}' is not found.\n\n\nSoapi.Net.Throttle.enqueue(request);\n</code></pre>\n\n<p><strong>Throttling</strong></p>\n\n<p>As a request is accepted by the throttle, the internal request cache is checked for matching results, if found the request is satisified immediately and the workflow is complete.</p>\n\n<p>If a cache hit is not found, the request is placed in a queue which is processed at a regular polling interval. The resolution of this polling timer is arbitrary and can be changed by stopping and restarting the throttle.</p>\n\n<pre><code>Soapi.Net.Throttle.suspend();\nSoapi.Net.Throttle.start(pollingIntervalInMs);\n</code></pre>\n\n<p>At polling time, there are 3 conditions that must be met in order for a request to be sent to the API:</p>\n\n<ol>\n<li>that the cache has not received matching data while the request sat in the queue. If this is the case, the request is satsified from the cache.</li>\n<li>that the number of active requests does not exceed the configured maximum active request count. If the number of active requests meets or exceeds the max allowed, processing of the queue is deferred.</li>\n<li>that the interval, in ms, between now and the n<sup>th</sup> previous request, where n<sup>th</sup> is the window count, is equal to or greater than the configured window interval, otherwise processing of the queue is deferred.</li>\n</ol>\n\n<p>When these conditions are met, a request is popped from the queue and sent to the API.</p>\n\n<p><strong>Caching</strong></p>\n\n<p>Each successful request, <strong><em>after</em></strong> the json has been converted into domain objects, it is placed in a request cache, keyed by the url. </p>\n\n<p>Each cache item is scheduled to be removed from the cache [defaultCacheDuration] milliseconds after it is placed, unless an explicit cache rule has been added for that route, e.g.</p>\n\n<pre><code>// cache stackauth.com/1.0/sites for 5 minutes\nSoapi.Net.Throttle.addCacheRule('/sites', 360000); \n</code></pre>\n\n<p>You can 'seed' the cache with data for fault tolerance or testing purposes by using the same mechanism used internally when a successful response is received and processed, e.g.</p>\n\n<pre><code>Soapi.Net.Throttle.signal(manuallyConstructedSites, '/sites', 'http://stackauth.com/sites?key=yourkey')\n</code></pre>\n\n<p>The single static instance of ThrottleCache will be used by any and all ApiContext instances you may have in play on any single page.</p>\n\n<hr>\n\n<p><strong>Example:</strong></p>\n\n<p>Throttle-cache log from AlphaQuickStart.htm with 30 requests per 5 second window with max 15 active requests and a 60 second default cache duration - note the cache scavenging happening as the browser was left idle.</p>\n\n<pre>\nthrottle: 2010-07-20 20:27:44.830 - request processed: interval: 1282361264830ms\nthrottle: 2010-07-20 20:27:45.027 - request processed: interval: 197ms\nthrottle: 2010-07-20 20:27:45.037 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.047 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.057 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.067 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.077 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.087 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.097 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.107 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.117 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.128 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:45.138 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.148 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.158 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.168 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:45.178 - active queue full\nthrottle: 2010-07-20 20:27:45.268 - request processed: interval: 100ms\nthrottle: 2010-07-20 20:27:45.278 - active queue full\nthrottle: 2010-07-20 20:27:45.568 - request processed: interval: 300ms\nthrottle: 2010-07-20 20:27:45.578 - active queue full\nthrottle: 2010-07-20 20:27:46.730 - request processed: interval: 1162ms\nthrottle: 2010-07-20 20:27:46.740 - active queue full\nthrottle: 2010-07-20 20:27:47.010 - request processed: interval: 280ms\nthrottle: 2010-07-20 20:27:47.020 - active queue full\nthrottle: 2010-07-20 20:27:47.040 - request processed: interval: 30ms\nthrottle: 2010-07-20 20:27:47.050 - active queue full\nthrottle: 2010-07-20 20:27:47.365 - request processed: interval: 325ms\nthrottle: 2010-07-20 20:27:47.376 - active queue full\nthrottle: 2010-07-20 20:27:47.449 - request processed: interval: 84ms\nthrottle: 2010-07-20 20:27:47.465 - active queue full\nthrottle: 2010-07-20 20:27:47.535 - request processed: interval: 86ms\nthrottle: 2010-07-20 20:27:47.546 - active queue full\nthrottle: 2010-07-20 20:27:47.746 - request processed: interval: 211ms\nthrottle: 2010-07-20 20:27:47.756 - active queue full\nthrottle: 2010-07-20 20:27:47.997 - request processed: interval: 251ms\nthrottle: 2010-07-20 20:27:48.007 - active queue full\nthrottle: 2010-07-20 20:27:48.097 - request processed: interval: 100ms\nthrottle: 2010-07-20 20:27:48.107 - active queue full\nthrottle: 2010-07-20 20:27:48.327 - request processed: interval: 230ms\nthrottle: 2010-07-20 20:27:48.337 - active queue full\nthrottle: 2010-07-20 20:27:48.898 - request processed: interval: 571ms\nthrottle: 2010-07-20 20:27:48.908 - active queue full\nthrottle: 2010-07-20 20:27:48.921 - request processed: interval: 23ms\nthrottle: 2010-07-20 20:27:48.939 - active queue full\nthrottle: 2010-07-20 20:27:49.020 -  waiting 810ms\nthrottle: 2010-07-20 20:27:49.832 - request processed: interval: 911ms\nthrottle: 2010-07-20 20:27:49.843 -  waiting 184ms\nthrottle: 2010-07-20 20:27:50.027 - request processed: interval: 195ms\nthrottle: 2010-07-20 20:27:50.037 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.047 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.057 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.067 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.077 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.087 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.097 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.107 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.117 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.128 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:50.138 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.148 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:50.158 - active queue full\nthrottle: 2010-07-20 20:27:50.170 - request processed: interval: 22ms\nthrottle: 2010-07-20 20:27:50.181 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:50.192 - active queue full\nthrottle: 2010-07-20 20:27:50.262 -  waiting 6ms\nthrottle: 2010-07-20 20:27:50.273 - request processed: interval: 92ms\nthrottle: 2010-07-20 20:27:50.284 -  waiting 284ms\ncache: 2010-07-20 20:27:50.387 - served from cache: http://api.stackapps.com/1.0/users/14/answers\ncache: 2010-07-20 20:27:50.388 - served from cache: http://api.stackapps.com/1.0/users/14/badges\ncache: 2010-07-20 20:27:50.388 - served from cache: http://api.stackapps.com/1.0/users/14/comments\ncache: 2010-07-20 20:27:50.388 - served from cache: http://api.stackapps.com/1.0/users/14/comments/18\ncache: 2010-07-20 20:27:50.388 - served from cache: http://api.stackapps.com/1.0/users/14/favorites\ncache: 2010-07-20 20:27:50.388 - served from cache: http://api.stackapps.com/1.0/users/14/mentioned\ncache: 2010-07-20 20:27:50.389 - served from cache: http://api.stackapps.com/1.0/users/14/reputation\ncache: 2010-07-20 20:27:50.389 - served from cache: http://api.stackapps.com/1.0/users/14/tags\ncache: 2010-07-20 20:27:50.389 - served from cache: http://api.stackapps.com/1.0/users/14/timeline\nthrottle: 2010-07-20 20:27:50.575 - request processed: interval: 302ms\nthrottle: 2010-07-20 20:27:50.586 -  waiting 1144ms\ncache: 2010-07-20 20:27:51.397 - served from cache: http://api.stackapps.com/1.0/questions/386/answers\ncache: 2010-07-20 20:27:51.397 - served from cache: http://api.stackapps.com/1.0/questions/386/comments\ncache: 2010-07-20 20:27:51.397 - served from cache: http://api.stackapps.com/1.0/questions/386/timeline\ncache: 2010-07-20 20:27:51.398 - served from cache: http://api.stackapps.com/1.0/revisions/386\ncache: 2010-07-20 20:27:51.398 - served from cache: http://api.stackapps.com/1.0/revisions/386/e452e755-a3fe-45d0-976f-e319ec460200\nthrottle: 2010-07-20 20:27:51.732 - request processed: interval: 1157ms\nthrottle: 2010-07-20 20:27:51.742 -  waiting 268ms\nthrottle: 2010-07-20 20:27:52.012 - request processed: interval: 280ms\nthrottle: 2010-07-20 20:27:52.022 -  waiting 18ms\nthrottle: 2010-07-20 20:27:52.042 - request processed: interval: 30ms\nthrottle: 2010-07-20 20:27:52.052 -  waiting 313ms\nthrottle: 2010-07-20 20:27:52.373 - request processed: interval: 331ms\nthrottle: 2010-07-20 20:27:52.383 -  waiting 66ms\nthrottle: 2010-07-20 20:27:52.453 - request processed: interval: 80ms\nthrottle: 2010-07-20 20:27:52.463 -  waiting 72ms\nthrottle: 2010-07-20 20:27:52.544 - request processed: interval: 91ms\nthrottle: 2010-07-20 20:27:52.554 -  waiting 192ms\nthrottle: 2010-07-20 20:27:52.755 - request processed: interval: 211ms\nthrottle: 2010-07-20 20:27:52.766 -  waiting 231ms\nthrottle: 2010-07-20 20:27:53.001 - request processed: interval: 246ms\nthrottle: 2010-07-20 20:27:53.011 -  waiting 86ms\nthrottle: 2010-07-20 20:27:53.101 - request processed: interval: 100ms\nthrottle: 2010-07-20 20:27:53.112 -  waiting 215ms\nthrottle: 2010-07-20 20:27:53.334 - request processed: interval: 233ms\nthrottle: 2010-07-20 20:27:53.345 -  waiting 553ms\nthrottle: 2010-07-20 20:27:53.903 - request processed: interval: 569ms\nthrottle: 2010-07-20 20:27:53.914 -  waiting 7ms\nthrottle: 2010-07-20 20:27:53.924 - request processed: interval: 21ms\nthrottle: 2010-07-20 20:27:53.935 -  waiting 897ms\nthrottle: 2010-07-20 20:27:54.839 - request processed: interval: 915ms\nthrottle: 2010-07-20 20:27:54.849 -  waiting 178ms\nthrottle: 2010-07-20 20:27:55.029 - request processed: interval: 190ms\nthrottle: 2010-07-20 20:27:55.040 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.051 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.062 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.073 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.084 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.094 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.104 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.114 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.124 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.134 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.145 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:27:55.155 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:55.166 -  waiting 4ms\nthrottle: 2010-07-20 20:27:55.176 - request processed: interval: 21ms\nthrottle: 2010-07-20 20:27:55.187 - active queue full\nthrottle: 2010-07-20 20:27:56.079 - request processed: interval: 903ms\nthrottle: 2010-07-20 20:27:56.090 - active queue full\nthrottle: 2010-07-20 20:27:56.212 - request processed: interval: 133ms\nthrottle: 2010-07-20 20:27:56.222 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:27:56.232 -  waiting 500ms\nthrottle: 2010-07-20 20:27:56.735 - request processed: interval: 513ms\nthrottle: 2010-07-20 20:27:56.745 -  waiting 267ms\nthrottle: 2010-07-20 20:27:57.018 - request processed: interval: 283ms\nthrottle: 2010-07-20 20:27:57.028 -  waiting 14ms\nthrottle: 2010-07-20 20:27:57.049 - request processed: interval: 31ms\nthrottle: 2010-07-20 20:27:57.059 - active queue full\nthrottle: 2010-07-20 20:27:57.261 -  waiting 112ms\nthrottle: 2010-07-20 20:27:57.373 - request processed: interval: 324ms\nthrottle: 2010-07-20 20:27:57.383 -  waiting 70ms\nthrottle: 2010-07-20 20:27:57.455 - request processed: interval: 82ms\nthrottle: 2010-07-20 20:27:57.465 -  waiting 79ms\nthrottle: 2010-07-20 20:27:57.545 - request processed: interval: 90ms\nthrottle: 2010-07-20 20:27:57.566 -  waiting 189ms\nthrottle: 2010-07-20 20:27:57.774 - request processed: interval: 229ms\nthrottle: 2010-07-20 20:27:57.796 -  waiting 205ms\nthrottle: 2010-07-20 20:27:58.003 - request processed: interval: 229ms\nthrottle: 2010-07-20 20:27:58.023 -  waiting 78ms\nthrottle: 2010-07-20 20:27:58.103 - request processed: interval: 100ms\nthrottle: 2010-07-20 20:27:58.123 - active queue full\nthrottle: 2010-07-20 20:27:58.351 - request processed: interval: 248ms\nthrottle: 2010-07-20 20:27:58.361 - active queue full\nthrottle: 2010-07-20 20:27:58.412 -  waiting 491ms\nthrottle: 2010-07-20 20:27:58.907 - request processed: interval: 556ms\nthrottle: 2010-07-20 20:27:58.918 -  waiting 6ms\nthrottle: 2010-07-20 20:27:58.928 - request processed: interval: 21ms\nthrottle: 2010-07-20 20:27:58.938 -  waiting 901ms\nthrottle: 2010-07-20 20:27:59.842 - request processed: interval: 914ms\nthrottle: 2010-07-20 20:27:59.852 -  waiting 177ms\nthrottle: 2010-07-20 20:28:0.033 - request processed: interval: 191ms\nthrottle: 2010-07-20 20:28:0.043 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.053 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.063 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.073 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.083 -  waiting 1ms\nthrottle: 2010-07-20 20:28:0.093 - request processed: interval: 20ms\nthrottle: 2010-07-20 20:28:0.104 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:28:0.115 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:28:0.125 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.135 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.145 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.155 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.165 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:0.175 - active queue full\nthrottle: 2010-07-20 20:28:0.216 - request processed: interval: 51ms\nthrottle: 2010-07-20 20:28:0.227 - active queue full\nthrottle: 2010-07-20 20:28:0.237 -  waiting 842ms\nthrottle: 2010-07-20 20:28:1.081 - request processed: interval: 865ms\nthrottle: 2010-07-20 20:28:1.092 -  waiting 120ms\nthrottle: 2010-07-20 20:28:1.215 - request processed: interval: 134ms\nthrottle: 2010-07-20 20:28:1.226 - request processed: interval: 11ms\nthrottle: 2010-07-20 20:28:1.237 -  waiting 498ms\nthrottle: 2010-07-20 20:28:1.735 - request processed: interval: 509ms\nthrottle: 2010-07-20 20:28:1.746 -  waiting 272ms\nthrottle: 2010-07-20 20:28:2.026 - request processed: interval: 291ms\nthrottle: 2010-07-20 20:28:2.036 -  waiting 13ms\nthrottle: 2010-07-20 20:28:2.056 - request processed: interval: 30ms\nthrottle: 2010-07-20 20:28:2.066 -  waiting 307ms\nthrottle: 2010-07-20 20:28:2.376 - request processed: interval: 320ms\nthrottle: 2010-07-20 20:28:2.387 -  waiting 68ms\nthrottle: 2010-07-20 20:28:2.457 - request processed: interval: 81ms\nthrottle: 2010-07-20 20:28:2.467 -  waiting 78ms\nthrottle: 2010-07-20 20:28:2.548 - request processed: interval: 91ms\nthrottle: 2010-07-20 20:28:2.559 -  waiting 215ms\nthrottle: 2010-07-20 20:28:2.779 - request processed: interval: 231ms\nthrottle: 2010-07-20 20:28:2.790 -  waiting 213ms\nthrottle: 2010-07-20 20:28:3.011 - request processed: interval: 232ms\nthrottle: 2010-07-20 20:28:3.022 -  waiting 81ms\nthrottle: 2010-07-20 20:28:3.112 - request processed: interval: 101ms\nthrottle: 2010-07-20 20:28:3.122 - active queue full\nthrottle: 2010-07-20 20:28:3.343 -  waiting 8ms\nthrottle: 2010-07-20 20:28:3.354 - request processed: interval: 242ms\nthrottle: 2010-07-20 20:28:3.365 - active queue full\nthrottle: 2010-07-20 20:28:3.385 -  waiting 522ms\nthrottle: 2010-07-20 20:28:3.916 - request processed: interval: 562ms\nthrottle: 2010-07-20 20:28:3.927 -  waiting 1ms\nthrottle: 2010-07-20 20:28:3.938 - request processed: interval: 22ms\nthrottle: 2010-07-20 20:28:3.948 -  waiting 894ms\nthrottle: 2010-07-20 20:28:4.846 - request processed: interval: 908ms\nthrottle: 2010-07-20 20:28:4.856 -  waiting 177ms\nthrottle: 2010-07-20 20:28:5.036 - request processed: interval: 190ms\nthrottle: 2010-07-20 20:28:5.046 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:5.056 - request processed: interval: 10ms\nthrottle: 2010-07-20 20:28:5.066 - active queue full\nthrottle: 2010-07-20 20:28:5.106 - request processed: interval: 50ms\nthrottle: 2010-07-20 20:28:5.117 - active queue full\nthrottle: 2010-07-20 20:28:5.198 - request processed: interval: 92ms\nthrottle: 2010-07-20 20:28:5.208 - active queue full\nthrottle: 2010-07-20 20:28:5.270 - request processed: interval: 72ms\nthrottle: 2010-07-20 20:28:5.280 - active queue full\nthrottle: 2010-07-20 20:28:5.340 - request processed: interval: 70ms\nthrottle: 2010-07-20 20:28:7.424 - request processed: interval: 2084ms\nthrottle: 2010-07-20 20:28:9.329 - request processed: interval: 1905ms\nthrottle: 2010-07-20 20:28:13.267 - request processed: interval: 3938ms\nthrottle: 2010-07-20 20:28:14.359 - request processed: interval: 1092ms\ncache: 2010-07-20 20:28:45.017 - removed from cache: http://stackauth.com/1.0/sites\ncache: 2010-07-20 20:28:45.560 - removed from cache: http://api.stackapps.com/1.0/answers/704/comments\ncache: 2010-07-20 20:28:46.720 - removed from cache: http://api.stackapps.com/1.0/badges/name\ncache: 2010-07-20 20:28:47.002 - removed from cache: http://api.stackapps.com/1.0/answers/704\ncache: 2010-07-20 20:28:47.037 - removed from cache: http://api.stackapps.com/1.0/badges\n[-- truncated for size --]\ncache: 2010-07-20 20:29:13.267 - removed from cache: http://api.stackapps.com/1.0/questions?pagesize=100&page=5\ncache: 2010-07-20 20:29:14.356 - removed from cache: http://api.stackapps.com/1.0/questions?pagesize=100&page=6\ncache: 2010-07-20 20:29:15.175 - removed from cache: http://api.stackapps.com/1.0/questions?pagesize=100&page=7\n>>>\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1459,
          "accepted": false,
          "answer_comments_url": "/answers/1459/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282492603,
          "last_activity_date": 1282492603,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Sample Code: RepReport</h3>\n\n<p><img src=\"http://i.stack.imgur.com/fMifE.png\" alt=\"alt text\"></p>\n\n<p>RepReport is an example of using Soapi.JS2 to provide a custom view on your reputation data.</p>\n\n<p>You can find RepReport.htm in the source download.</p>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head&gt;\n    &lt;title&gt;Soapi2.RepReport&lt;/title&gt;\n    &lt;script src=\"third-party/jquery-1.4.1.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"third-party/linq.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"Scripts/Soapi2.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"Scripts/Soapi2.Throttle.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;style type=\"text/css\"&gt;\n        body {\n            font-family: Sans-Serif;\n        }\n        .month-row, .month-row td {\n            font-size: 14px;\n            background-color: #4682B4;\n            color: White;\n            font-weight: bold;\n        }\n        .day-row, .day-row td {\n            font-size: 12px;\n            background-color: #B0C4DE;\n            color: black;\n            font-weight: bold;\n        }\n        .event-row, .event-row td {\n            border-bottom: dotted 1px #EFEFEF;\n            font-size: 10px;\n        }\n        .post-cell {\n            text-align: left;\n            font-size: 10px;\n        }\n        .right td {\n            text-align: right;\n        }\n    &lt;/style&gt;\n\n    &lt;script type=\"text/javascript\"&gt;\n        // Soapi JavaScript Library V2-ALPHA\n        // http://stackapps.com/questions/1433\n        // http://soapi.info/\n        //-------------------------------------------------------------------------------\n\n        (function repReport() {\n\n            var u$ = Soapi.Utilities;\n            var d$ = Soapi.Domain;\n            var ctx = new Soapi.ApiContext(\"qgAq_KfDu0KYzlNG-qaTuw\");\n\n            $(function() {\n                ctx.initialize(function() {\n                    $(\"#input\")\n                        .append(\"&lt;br/&gt;&lt;label for='site-dropdown'&gt;Site:&lt;/label&gt;&lt;br/&gt;\")\n                        .append($(\"&lt;select id='site-dropdown'/&gt;\")\n                            .append(Enumerable.From(ctx.sites)\n                                .OrderBy(\"$.name\")\n                                .Select(function(s) {\n                                    return \"&lt;option value='\" + s.api_endpoint + \"'&gt;\" + s.name + \"&lt;/option&gt;\\n\";\n                                }).ToString()))\n                        .append(\"&lt;br/&gt;&lt;label for='input-user-id'&gt;UserId:&lt;/label&gt;\")\n                        .append(\"&lt;br/&gt;&lt;input type='text' id='input-user-id' title='enter user id'/&gt;&lt;br/&gt;\")\n                        .append($(\"&lt;input type='button' id='input-draft-report' value='draft report'/&gt;\")\n                            .click(function(e) {\n                                chartReport($(\"#site-dropdown\").val(), $(\"#input-user-id\").val());\n                            }));\n                });\n            });\n\n\n            function chartReport(endpoint, userId) {\n\n                ctx.find(endpoint).Users().ById(userId).invoke(function(users) {\n\n                    var user = users.FirstOrDefault();\n                    if (typeof (user) == 'undefined') {\n                        $(\"#report\").html(\"\").append($(\"&lt;h3/&gt;\").html(\"No user with id \" + userId + \" found on \" + endpoint));\n                        return;\n                    }\n                    $(\"#report\").html(\"\").append($(\"&lt;h3/&gt;\").html(user.display_name));\n\n\n                    user.Reputation().fromdate(\"1/1/1990\").todate(\"1/1/2020\").pagecount(0).pagesize(100)\n                        .invoke(function(repchanges) {\n\n                            repchanges = repchanges.Reverse();\n\n                            var table = $(\"&lt;table cellpadding='0' cellspacing='0' style='width:100%'&gt;&lt;/table&gt;\").appendTo(\"#report\");\n\n                            // first, we want to group by day\n                            repchanges.GroupBy(function(r) {\n                                return u$.formatTimeStamp(r.on_date, 2)\n                            }) // then group thos groups by month\n                            .GroupBy(function(g) {\n                                return u$.formatTimeStamp(g.First().on_date, 1)\n                            })\n                            .ForEach(function(monthGroup) {\n                                // add a row for the month with sum of month's rep\n                                $(\"&lt;tr class='month-row'&gt;&lt;td&gt;\" + monthGroup.Key()\n                                    + \"&lt;/td&gt;&lt;td class='right'&gt;\" + monthGroup.Sum(function(g) {\n                                        return g.Sum(function(i) {\n                                            return i.positive_rep - i.negative_rep;\n                                        });\n                                    })\n                                    + \"&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;\").appendTo(table);\n\n                                monthGroup.ForEach(function(dayGroup) {\n                                    // add a row for day with sum of day's rep\n                                    $(\"&lt;tr class='day-row'&gt;&lt;td&gt;\" + dayGroup.Key()\n                                        + \"&lt;/td&gt;&lt;td class='right'&gt;\" + dayGroup.Sum(function(i) {\n                                            return i.positive_rep - i.negative_rep;\n                                        }) + \"&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;\")\n                                        .appendTo(table);\n\n                                    dayGroup.ForEach(function(r) {\n                                        // add a row for each event\n                                        $(\"&lt;tr class='event-row' &gt;&lt;td&gt;\" + r.on_date.toTimeString()\n                                            + \"&lt;/td&gt;&lt;td class='right'&gt;+\" + r.positive_rep\n                                            + \"&lt;/td&gt;&lt;td class='right'&gt;-\" + r.negative_rep\n                                            + \"&lt;/td&gt;&lt;td class='post-cell'&gt;\" + r.title\n                                            + \"&lt;/td&gt;&lt;/tr&gt;\")\n                                            .appendTo(table);\n                                    });\n                                });\n                            });\n                        });\n                });\n            };\n        })();\n    &lt;/script&gt;\n\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;h2&gt;\n        RepReport&lt;/h2&gt;\n    &lt;p&gt;\n        powered by &lt;a href=\"http://stackapps.com/questions/1433\"&gt;Soapi.JS2&lt;/a&gt;&lt;/p&gt;\n    &lt;div id=\"input\"&gt;\n    &lt;/div&gt;\n    &lt;div id=\"report\"&gt;\n    &lt;/div&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1460,
          "accepted": false,
          "answer_comments_url": "/answers/1460/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282492866,
          "last_activity_date": 1282492866,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<h3>Sample Code: SiteMonitor</h3>\n\n<p><img src=\"http://i.stack.imgur.com/MwTOw.png\" alt=\"alt text\"></p>\n\n<p>SiteMonitor is an example of using Soapi.JS2 to retrieve and display status and statistics for all of the sites in the Stack Exchange network.</p>\n\n<p>SiteMonitor.htm can be found in the Soapi.JS2 source download.</p>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\" &gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;/title&gt;\n    &lt;script src=\"third-party/linq.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"Scripts/Soapi2.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"Scripts/Soapi2.Throttle.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;style type=\"text/css\"&gt;\n        html {\n            font-family: Sans-Serif;\n            font-size: 12px;\n        }\n        .stats {\n            font-size: 9px;\n            border: solid 1px silver;\n            padding-right: 3px;\n            text-align: right;\n        }\n        tr.header td {\n            border-bottom: solid 2px black;\n            padding: 3px;\n        }\n    &lt;/style&gt;\n\n    &lt;script type=\"text/javascript\"&gt;\n        function doYourThang_DoWhatYaWannaDo() {\n\n            var apiKey = \"qgAq_KfDu0KYzlNG-qaTuw\";\n\n            var ctx = new Soapi.ApiContext(apiKey);\n\n            ctx.initialize(function() {\n\n                // all available sites have been loaded from stackauth\n\n                // to track loading of stats\n                var counter = 0;\n\n                // now we load the .stats property of the Site object\n\n                Enumerable.From(ctx.sites).ForEach(function(site) {\n\n                    counter++;\n\n                    site.Stats().invoke(function(data, site_as_context) {\n                        // tack the stats onto the site object\n                        site_as_context.stats = data.First();\n                        document.getElementById(\"output\").innerHTML\n                        = \"loaded stats for \" + site_as_context.name;\n\n                        soupYet();\n                    },\n                    function(error, site_as_context) { // site sent as userContext\n                        // keep the user informed\n                        document.getElementById(\"output\").innerHTML\n                        = \"failed to loaded stats for \" + site_as_context.name;\n\n                        // the request failed but we must decrement the counter\n                        soupYet();\n\n                    }, site /* as context */);\n                });\n\n                // output code\n                function soupYet() {\n\n                    // check to see if all sites have been loaded\n                    if (--counter == 0) {\n                        // dump all to table\n\n                        var output = \"&lt;table cellpadding='0' cellspacing='0' style='border:solid 1px silver;'&gt; \\\n                                    &lt;tr class='header'&gt;&lt;td&gt;Site&lt;/td&gt;&lt;td&gt;State&lt;/td&gt;&lt;td&gt;Tags&lt;/td&gt;&lt;td&gt;Logo&lt;/td&gt;&lt;td&gt;API&lt;/td&gt; \\\n                                    &lt;td&gt;v.p.d&lt;/td&gt;&lt;td&gt;users&lt;/td&gt;&lt;td&gt;questions&lt;/td&gt;&lt;td&gt;q.p.m.&lt;/td&gt;&lt;td&gt;accepted&lt;/td&gt; \\\n                                    &lt;td&gt;unanswered&lt;/td&gt;&lt;td&gt;answers&lt;/td&gt;&lt;td&gt;a.p.m&lt;/td&gt;&lt;td&gt;comments&lt;/td&gt;&lt;td&gt;votes&lt;/td&gt; \\\n                                    &lt;td&gt;badges&lt;/td&gt;&lt;td&gt;b.p.m.&lt;/td&gt;&lt;/tr&gt;\";\n\n                        Enumerable.From(ctx.sites).ForEach(function(site) {\n                            if (!site.stats) {\n                                // handle 503 errors. I wonder what rookie decided it was a good idea\n                                // to deploy major UNTESTED infrastructure changes on the weekend.\n                                site.stats = new Soapi.Domain.Stats(site);\n                            }\n\n                            output += \"&lt;tr&gt;\"\n                                + \"&lt;td&gt;&lt;img src='\" + site.icon_url + \"' style='width:32px;height:32px;'/&gt;\"\n                                + \"&lt;a href='\" + site.site_url + \"' style='color:\" + site.styling.link_color\n                                + \";' target='_blank' title='\" + site.description.replace(\"'\", \"`\") + \"'&gt;\" + site.name + \"&lt;/a&gt;&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.state + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;&lt;span style='color:\" + site.styling.tag_foreground_color + \";background-color:\"\n                                + site.styling.tag_background_color + \";'&gt;[tags]&lt;/span&gt;&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;&amp;nbsp;&lt;a href='\" + site.logo_url + \"' target='_blank'&gt;logo&lt;/a&gt;&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;&amp;nbsp;&lt;a href='\" + site.api_endpoint + \"/\" + site.stats.api_version.version\n                                + \"/help' target='_blank'&gt;\" + site.stats.api_version.version + \" \" + site.stats.api_version.revision + \"&lt;/a&gt;&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + Math.ceil(site.stats.views_per_day) + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_users + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_questions + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + Math.ceil(site.stats.questions_per_minute) + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_accepted + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_unanswered + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_answers + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + Math.ceil(site.stats.answers_per_minute) + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_comments + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_votes + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + site.stats.total_badges + \"&lt;/td&gt;\"\n                                + \"&lt;td class='stats'&gt;\" + Math.ceil(site.stats.badges_per_minute) + \"&lt;/td&gt;\"\n                                + \"&lt;/tr&gt;\";\n                        });\n\n                        output += \"&lt;/table&gt;\";\n                        document.getElementById(\"output\").innerHTML = output;\n                    }\n                };\n            }, function(error) {\n                alert(error.message);\n            });\n        };\n\n    &lt;/script&gt;\n\n&lt;/head&gt;\n&lt;body onload=\"doYourThang_DoWhatYaWannaDo()\"&gt;\n    &lt;div id=\"output\"&gt;\n    &lt;/div&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1535,
          "accepted": false,
          "answer_comments_url": "/answers/1535/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1283566935,
          "last_activity_date": 1283566935,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<p>You have a very serious problem on <a href=\"http://soapi.info/Code/JS2/latest/docs/index.htm\" rel=\"nofollow\">the page you reference above</a>.</p>\n\n<p>It includes the following JavaScript file which is over 5MB in size. I have a 256kbps Internet connection, so you can only imagine how long I had to wait for the page to load.</p>\n\n<p><a href=\"http://soapi.info/Code/JS2/latest/docs/content/SoapiProjectData.js\" rel=\"nofollow\">http://soapi.info/Code/JS2/latest/docs/content/SoapiProjectData.js</a></p>\n\n<p>If this is not a glitch, please consider adding a warning page so that users know why the page is taking 2 minutes to load.</p>\n",
          "comments": [
            {
              "comment_id": 4028,
              "creation_date": 1283568540,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1535,
              "post_type": "answer",
              "score": 0,
              "body": "that is the documentation data. you can alleviate latency by downloading the package and accessing the documentation locally. but your point is valid. I should add a size and explanation."
            },
            {
              "comment_id": 4029,
              "creation_date": 1283569077,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1535,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Ya, I downloaded the ZIP and discovered that... don&#39;t worry about it :) By the way, do you think that Soapi2.JS is stable enough to use in <a href=\"http://stackapps.com/questions/1114/stackcenter-your-one-stop-for-everything-stackexchange\">StackCenter</a>?"
            },
            {
              "comment_id": 4031,
              "creation_date": 1283574351,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1535,
              "post_type": "answer",
              "score": 0,
              "body": "yes, it seems stable enough. I don&#39;t anticipate any changes in the existing functionality, only additions.  but... while I have reduced the code size significantly using run-time code generation, I still need to do some optimization for minification and add that to my build process. If you minify it yourself and the resulting script passes the unit tests you should be good to go until then."
            },
            {
              "comment_id": 4033,
              "creation_date": 1283574747,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1535,
              "post_type": "answer",
              "score": 0,
              "body": "ooops. your other note brought up the only possible functional change that <i>may</i> be coming down the pike."
            }
          ]
        },
        {
          "answer_id": 1536,
          "accepted": false,
          "answer_comments_url": "/answers/1536/comments",
          "question_id": 1433,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1283572380,
          "last_edit_date": 1283572889,
          "last_activity_date": 1283572889,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
          "body": "<p><strike>I can't seem to find a <code>ByIdMentioned</code> method for <code>Users</code> objects. Am I missing something or is this a yet-to-be-added feature?</strike> <em>Never mind - I found it!</em></p>\n\n<hr>\n\n<p><strike>\nAlso, I'm having trouble getting Area51 sites to work with the <code>find()</code> method:</p>\n\n<blockquote>\n  <p>&gt;&gt; context.find(\"http://api.cooking.stackexchange.com\")</p>\n</blockquote>\n\n<p>returns:</p>\n\n<pre><code>undefined\n</code></pre>\n\n<p>In Google Chrome 6 beta. (On Ubuntu 10.04, of course :))\n</strike></p>\n\n<p><em>Never mind - I figured that one out too... I forgot to call <code>initialize()</code></em></p>\n",
          "comments": [
            {
              "comment_id": 4030,
              "creation_date": 1283572913,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "Boy... I&#39;m having a bad day :)"
            },
            {
              "comment_id": 4032,
              "creation_date": 1283574689,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "with only one exception, i believe, any time there is an id involved .ById(id).XXX is the pattern. I am not in front of the code right now but I believe the exception is Users.ByIdAssociated and I am still undecided about that. I would like to maintain convention but IIRC there was an issue. I am not in front of the code right now, but that may be the only functional change to the library that <i>may</i> be coming down the pike. It will be noted in the change log."
            },
            {
              "comment_id": 4034,
              "creation_date": 1283574983,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "edit_count": 4,
              "body": "Does Soapi2.JS have throttling enabled by default or do I have to call some method first? Just wonderin&#39; because some of the queries are completely failing. (Like they&#39;re not getting a response from the server.)"
            },
            {
              "comment_id": 4035,
              "creation_date": 1283576387,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "yes, in the current download the throttle is set to 30 per 7 seconds. If you are getting failures, make sure that it isn&#39;t one of those long running queries such as question with answers and comments or search which can take up to 40 seconds to complete. Try watching the traffic with an external tool. again, we may be running into a platform specific javascript implementation issue. I have yet to run tests on linux or apple. but this is not terribly likely (famous last words). are your failures on specific methods, if so, which?"
            },
            {
              "comment_id": 4036,
              "creation_date": 1283577644,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "seems that the tests are failing in webkit so i would refrain from public usage at the moment."
            },
            {
              "comment_id": 4037,
              "creation_date": 1283578149,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "@code: the methods are: <code>Users.ById().Mentioned</code> and <code>Users.ById().Reputation</code>"
            },
            {
              "comment_id": 4045,
              "creation_date": 1283632854,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1536,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Well, I finished the new version of StackCenter. I&#39;m not releasing it into the wild quite yet - considering the throttling problems - but it&#39;s ready to go otherwise. You can get a sneak peek <a href=\"http://stackcenter.quickmediasolutions.com/display2.php\" rel=\"nofollow\">here</a>."
            }
          ]
        }
      ],
      "favorite_count": 7,
      "question_timeline_url": "/questions/1433/timeline",
      "question_comments_url": "/questions/1433/comments",
      "question_answers_url": "/questions/1433/answers",
      "question_id": 1433,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282262932,
      "last_edit_date": 1339375164,
      "last_activity_date": 1339375164,
      "up_vote_count": 11,
      "down_vote_count": 1,
      "view_count": 796,
      "score": 10,
      "community_owned": false,
      "title": "Soapi.JS2: a fully relational JavaScript client library for the Stack Exchange API - beta preview",
      "body": "<h2>Soapi.JS2</h2>\n\n<pre><code>    var context = new Soapi.ApiContext(yourApiKey);\n\n    context.initialize(function() {\n        context.official.stackApps\n        .Users().ById(14)\n        .invoke(function(users) {\n            alert(users[0].display_name);\n        });\n    });\n</code></pre>\n\n<h2>About</h2>\n\n<p>Soapi.JS2 is being released separately from <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a> as it is a completely different take on accessing the API via JavaScript.</p>\n\n<p><a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a> is a very lightweight library that provides full API coverage.</p>\n\n<p>Soapi.JS2 takes it to version 11 with a complete paradigm shift. It is a bit heavier and revolves around a fluent, relational query approach similar to that of the <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a> library, providing a seamless view on the data served by the API.</p>\n\n<h3>License</h3>\n\n<p>MIT-X11/GPL</p>\n\n<h3>Documentation</h3>\n\n<p>The documentation is available in the download or can be viewed online here: <a href=\"http://soapi.info/Code/JS2/latest/docs/index.htm\" rel=\"nofollow\">http://soapi.info/Code/JS2/latest/docs/index.htm</a> (documentation data is 5&nbsp;MB so you may wish to access the help file from the download).</p>\n\n<h3>Download</h3>\n\n<p>A <strong><em>beta</em></strong> version available at <a href=\"http://soapi.info/Downloads/Soapi.JS2-beta-09-17-2010.zip\" rel=\"nofollow\">http://soapi.info/Downloads/Soapi.JS2-beta-09-17-2010.zip</a>.</p>\n\n<p><strong>Known Issues:</strong></p>\n\n<ul>\n<li>JavaScript implementation differences break the throttle on webkit browsers on Linux and Mac&nbsp;OS&nbsp;X</li>\n</ul>\n\n<p><strong>ChangeLog:</strong></p>\n\n<p>Soapi.JS2-beta-09-17-2010</p>\n\n<ul>\n<li>minor code and documentation improvements</li>\n<li>added sync initialize with JSON</li>\n<li><strong>implemented live samples in documentation</strong> (Soapi.JS2.docs.htm) - just a key handful so far, but it is pretty helpful to see a code snippet that you can run right there in the documentation. Now that the major code churn is over, I will be sprinkling relevant live samples throughout the documentation.</li>\n</ul>\n\n<p>Soapi.JS2-beta-09-09-2010</p>\n\n<ul>\n<li>Minor code improvements</li>\n<li>Added JS2+CS UserIndexer and UserFinder demo to <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a> samples (the Soapi.JS2 source lives with <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a>)</li>\n<li>Added Soapi2.Contrib.js to support samples</li>\n</ul>\n\n<p>Soapi.JS2-beta-09-06-2010</p>\n\n<ul>\n<li><p>Implemented minification to build process. soapi2.js is minified, soapi2.debug.js is commented and also acts as a Visual Studio IntelliSense source. No need to reference it, just let it sit in the same directory as the references Soapi2.js.</p></li>\n<li><p>The minified size is still around 75&nbsp;KB. Sorry, there is not much I can do as it is mostly public function and type names. If your server supports serving content gzipped it comes down to about 15&nbsp;KB which is not too bad.</p></li>\n</ul>\n\n<p>Soapi.JS2-beta-09-05-2010</p>\n\n<ul>\n<li>Replaced Soapi.enableLogging and Soapi.disableLogging with Soapi.set_logCallback to reduce coupling and enable programmatic processing of Soapi events. See Soapi.log in the documentation for more information.</li>\n</ul>\n\n<p>Soapi.JS2-beta-08-29-2010</p>\n\n<ul>\n<li>Removed linq.js integration. The convenience was outweighed by the limitations imposed. It was a bad design decision in the first place. Simply create <code>Enumerable</code> when you need it by <code>Enumerable.From(item)</code></li>\n<li>Implemented Soapi.Interop (JS2->CS upload) expect dedicated post shortly.</li>\n<li>Completed Soapi API documentation - started adding content</li>\n<li>Added SyntaxHighlighter functionality to the documentation</li>\n<li>Added API compatible custom JSON implementation</li>\n</ul>\n\n<p>Soapi.JS2-beta-08-25-2010</p>\n\n<ul>\n<li>completed preliminary documentation (<code>/docs/index.htm</code>)</li>\n<li>adjusted default throttle to 30 per 6.5 as per current API tolerance</li>\n</ul>\n\n<p>Soapi.JS2-beta-08-19-2010</p>\n\n<ul>\n<li>merged scripts</li>\n<li>made throttle/cache optional</li>\n<li>added RepReport sample</li>\n</ul>\n\n<p>Soapi.JS2-alpha-08-21-2010</p>\n\n<ul>\n<li>implemented ThrotteCache</li>\n</ul>\n\n<p>Soapi.JS2-alpha-08-20-2010</p>\n\n<ul>\n<li>implemented paging fully</li>\n<li>implemented .total method</li>\n</ul>\n\n<p>Soapi.JS2-alpha-08-19-2010</p>\n\n<ul>\n<li>initial release</li>\n</ul>\n\n<h3>Platform</h3>\n\n<p>JavaScript - Any browser that doesn't burn oil.</p>\n\n<ul>\n<li>Windows - all current major browsers tested</li>\n<li>Linux - Firefox and Chrome test good. Opera has issues.</li>\n<li>OSX - Firefox, Chrome and Safari test good. Opera has issues.</li>\n</ul>\n\n<p>Apparently Opera on Mac&nbsp;OS&nbsp;X and Linux burns oil. The library performs as expected but the internal throttle does not so caveat emptor until notified otherwise.</p>\n\n<p>Remember, we are still in beta. Soapi.JS2 will be fully compatible with all common browsers on all platforms before RC1.</p>\n\n<p>If you would like to provide compatibility feedback, you may run the <a href=\"http://soapi.info/Code/JS2/latest/Tests/Tests.Integration.html\" rel=\"nofollow\">integration test suite</a> and add a comment or answer.</p>\n\n<h2>Contact</h2>\n\n<p>code poet</p>\n\n<h2>Code</h2>\n\n<p>Included in the alpha ZIP file is a full coverage test suite and a rather detailed walkthrough.</p>\n\n<h3>QuickStart</h3>\n\n<ul>\n<li>ApiContext - the root of all queries &lt;-- <strong>start here</strong></li>\n<li>Api Coverage - how Soapi.JS2 maps to the API</li>\n<li>Relational Queries - how to treat the API like a database</li>\n<li>Async usage pattern - how to call and what to expect</li>\n<li>Parameterization And Paging - how to get exactly what you want from the API</li>\n<li>Stubs - filling placeholder objects</li>\n<li>Throttling and Caching - concentrate on features, not plumbing..</li>\n</ul>\n\n<h3>Sample Code</h3>\n\n<ul>\n<li>Basic Usage Example 01 - demonstrates how to retrieve related data from the API using Soapi.JS2</li>\n<li>RepReport - an example of using Soapi.JS2 to provide a custom view on your reputation points data.</li>\n<li>SiteMonitor - an example of using Soapi.JS2 to retrieve and display status and statistics for all of the sites in the Stack Exchange network.</li>\n</ul>\n\n<h3>Apps that use Soapi.JS2</h3>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/1114/stackcenter-your-one-stop-for-everything-stackexchange\">StackCenter</a> - Your One Stop for Everything Stack Exchange</li>\n<li>insert your app here (or leave a comment and I will do it)</li>\n</ul>\n\n<h3>Reference</h3>\n\n<ul>\n<li><a href=\"http://linqjs.codeplex.com/\" rel=\"nofollow\">Linq.js</a> - This is highly recommended reading for anyone working with Soapi.JS2. Most sample code I provide will leverage this amazing little library.</li>\n</ul>\n\n<hr>\n\n<h2>PLEASE NOTE:</h2>\n\n<p>I try to provide quality documentation and I do appreciate the approval indicated by upvotes, but the Stack Overflow anti-vote fraud system is silently reversing votes cast in rapid succession.</p>\n\n<p>So, if you would like to upvote the documentation, please do so in moderation, perhaps no more three or four votes per day?</p>\n\n<hr>\n",
      "comments": [
        {
          "comment_id": 3729,
          "creation_date": 1282312011,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "+8 (as of now ;) - that&#39;s freakin awesome and impressive: how do you keep to manage churning out code at that rate and still maintain the highest quality and most thorough documentation around? I&#39;m literally jealous ..."
        },
        {
          "comment_id": 3730,
          "creation_date": 1282312071,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Btw.: your <b>QuickStart</b> documentation style with the <b>Next</b> link on each answer is a very nifty idea to get the most out of the limits imposed by the answer format here! A possible improvement: technically it would be sufficient and especially easier/nicer to use to have relative in page links to the anchors only (e.g. href=&quot;#1441&quot;) - I don&#39;t know whether that hurts SEO, but I doubt search engines will handle these different than simply adding the implied absolute URL."
        },
        {
          "comment_id": 3731,
          "creation_date": 1282313375,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "@steffen - glad you like it. i think my apparent delivery rate may be helped by my fundamental need to identify and mitigate salient risks which enables the rapid development of a stable core upon which to layer abstractions. So, in reality, a lot of the work has been done, in increments, in plain sight over the last few months. regarding the links: i totally see your point and will adjust the links. relative anchors will simply scroll the page as opposed to refetching. Germans and detail...."
        },
        {
          "comment_id": 3736,
          "creation_date": 1282354380,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "Wow. Just when I thought Soapi.JS couldn&#39;t get more awesome... would it be easy (in your opinion) to port a Soapi.JS 1.0 app to 2.0? Just wonderin&#39;..."
        },
        {
          "comment_id": 3737,
          "creation_date": 1282355780,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "@geo - yes, it <i>will</i> be painless. I have an upgrade path in mind, I just need to finalize the throttle-cache before I publish the guidance. expect more info this weekend. Like I said, it <i>will</i> be painless."
        },
        {
          "comment_id": 3742,
          "creation_date": 1282402735,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 2,
          "body": "Those closing braces remind me of <a href=\"http://en.wikipedia.org/wiki/Lisp_%28programming_language%29\" rel=\"nofollow\">Lisp</a>"
        },
        {
          "comment_id": 3743,
          "creation_date": 1282403557,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@geo - I am pondering on an HTML5 add-on that uses WebWorkers so that queries can be synchronous, e.g. <code>site.Tags().ForEach(function(tag){ });</code> it will be a novelty except for use in browser extensions but should be interesting. But the closures will be dramatically reduced."
        },
        {
          "comment_id": 3744,
          "creation_date": 1282403725,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@code: That would be quite neat! Unfortunately I almost never have the opportunity to write HTML5 code :( Pretty much all my stuff has to work with HTML4 or XHTML1."
        },
        {
          "comment_id": 4090,
          "creation_date": 1283725433,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "@code: Good news and bad news. The bad news is that StackCenter is no longer a Soapi.JS app. The good news is that it is now a Soapi2.JS app. Feel free to list it as an example application developed with Soapi2!"
        },
        {
          "comment_id": 4093,
          "creation_date": 1283726086,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "body": "@geo - Remember that we are still in beta and that the throttle does not yet work in Opera on either OSX or Linux. I guess I also need to get a minified build going for you. Expect that later tonight or tomorrow."
        },
        {
          "comment_id": 4094,
          "creation_date": 1283726145,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@code: Thanks! But I already minified it. (With <a href=\"http://jscompress.com\" rel=\"nofollow\">JSCompress</a>.)"
        },
        {
          "comment_id": 4098,
          "creation_date": 1283726939,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1433,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@geo - did you reference it in the tests.integration.html and run it? if it passes, you should host the test suite on your site and run it from all devices you plan to support, mobile devices especially, and report failing tests by name and reason as an answer so I can target them. I need ya to do this if you can. Actually it would be great if you can also run the uncompressed unit tests listed in the post and report results for mobile devices you support."
        }
      ]
    },
    {
      "tags": [
        "support"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1665,
          "accepted": true,
          "answer_comments_url": "/answers/1665/comments",
          "question_id": 1664,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1286237592,
          "last_activity_date": 1286237592,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Which nested objects and arrays are optional?",
          "body": "<p>Technically, all of them.  In the event some difficulty is found in loading them, they won't be returned.</p>\n\n<p>The API does go to great lengths to try and guarantee most are always returned.</p>\n",
          "comments": [
            {
              "comment_id": 4447,
              "creation_date": 1286246835,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1665,
              "post_type": "answer",
              "score": 1,
              "body": "strangely, i am not annoyed with this rather vague and non-committal reply.  good enough."
            }
          ]
        }
      ],
      "accepted_answer_id": 1665,
      "favorite_count": 2,
      "question_timeline_url": "/questions/1664/timeline",
      "question_comments_url": "/questions/1664/comments",
      "question_answers_url": "/questions/1664/answers",
      "question_id": 1664,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1286174956,
      "last_edit_date": 1338149368,
      "last_activity_date": 1338149368,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 137,
      "score": 2,
      "community_owned": false,
      "title": "Which nested objects and arrays are optional?",
      "body": "<p>I am handcrafting a <a href=\"http://groups.google.com/group/json-schema\" rel=\"nofollow\">JSON Schema</a> for the API, and there is some meta missing from the nested 'returns' objects and arrays.</p>\n\n<p>The relevant information I need is:</p>\n\n<ul>\n<li>if it is an array, can it be undefined (missing) or will it simply be empty?</li>\n<li>if it is an object, can it be undefined (missing)?</li>\n</ul>\n\n<p>Types in question:</p>\n\n<ul>\n<li><code>site.styling</code> - ?</li>\n<li><code>site.aliases</code> - can be undefined</li>\n<li><code>associated_user_stub.on_site</code> - ?</li>\n<li><code>user.badge_counts</code> - ?</li>\n<li><code>statistics.api_version</code> - ?</li>\n<li><code>question.migrated</code> - ?</li>\n<li><code>question.owner</code> - ?</li>\n<li><code>question.tags</code> - ?</li>\n<li><code>answer.owner</code> - ?</li>\n<li><code>comment.owner</code> - ?</li>\n<li><code>comment.reply_to_user</code> - ?</li>\n<li><code>badge.user</code> - ?</li>\n<li><code>post_timeline.user</code> - ?</li>\n<li><code>post_timeline.owner</code> - ?</li>\n<li><code>revision.user</code> - ?</li>\n<li><code>revision.tags</code> - ?</li>\n<li><code>revision.last_tags</code> - ?</li>\n</ul>\n\n<h3>Implementation note</h3>\n\n<p>The reason I am handcrafting this instead of parsing and generating is directly related to the reason for this post, that is, the auto format used to produce the 'returns' structure documentation does not produce any meta data on these elements.</p>\n\n<p>The 'returns' structures, for the most part, are clear and easy to understand, but the lack of this meta leaves a lot to be guessed. Computers and programmers who try to tell them what to do do not really like to guess at the structure of core data structures. ;-)</p>\n\n<p>It is my hope that after I publish a JSON schema for the API, the benefits of such a format may become apparent to those designing the next API.</p>\n\n<p>I don't think I would suggest replacing the help page structures, which are easy to read and fine for casual perusal with the more verbose and normative JSON schema.</p>\n\n<p>Rather, the machine readable JSON schema could be served with a <code>/?schema</code> parameter much the same way as a <a href=\"http://en.wikipedia.org/wiki/Web_Services_Description_Language\" rel=\"nofollow\">WSDL</a>.</p>\n\n<p>As a reference, what follows is a JSON schema fragment that describes a question. Notice the lack of ambiguity, especially for <code>.tags</code> and <code>.owner</code>.</p>\n\n<pre><code>\"question\": {\n  \"description\": \"\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"tags\": {\n      \"description\": \"\",\n      \"optional\": true,\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"string\"\n      }\n    },\n    \"answer_count\": {\n      \"description\": \"number of answer on this question\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"accepted_answer_id\": {\n      \"description\": \"id of the accepted answer\",\n      \"type\": \"integer\",\n      \"optional\": true\n    },\n    \"favorite_count\": {\n      \"description\": \"number of users who have favorited this question\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"bounty_closes_date\": {\n      \"description\": \"date the bounty closes on this question\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"bounty_amount\": {\n      \"description\": \"amount of rep the bounty is worth\",\n      \"type\": \"integer\",\n      \"optional\": true\n    },\n    \"closed_date\": {\n      \"description\": \"date this question was closed\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"closed_reason\": {\n      \"description\": \"why this question was closed\",\n      \"type\": \"string\",\n      \"maxLength\": 500,\n      \"optional\": true\n    },\n    \"protected_date\": {\n      \"description\": \"date this question was protected\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"question_timeline_url\": {\n      \"description\": \"link to the timeline of this question\",\n      \"type\": \"string\",\n      \"format\": \"uri\",\n      \"optional\": false\n    },\n    \"question_comments_url\": {\n      \"description\": \"link to the comments on this question\",\n      \"type\": \"string\",\n      \"format\": \"uri\",\n      \"optional\": false\n    },\n    \"question_answers_url\": {\n      \"description\": \"link to the answers on this question\",\n      \"type\": \"string\",\n      \"format\": \"uri\",\n      \"optional\": false\n    },\n    \"question_id\": {\n      \"description\": \"id of the question this post is or is on\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"locked_date\": {\n      \"description\": \"date this question was locked\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"creation_date\": {\n      \"description\": \"date this post was created\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": false\n    },\n    \"last_edit_date\": {\n      \"description\": \"last time this post was edited\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"last_activity_date\": {\n      \"description\": \"last time this post had any activity\",\n      \"type\": \"integer\",\n      \"format\": \"utc-seconds\",\n      \"optional\": true\n    },\n    \"up_vote_count\": {\n      \"description\": \"number of up votes on this post\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"down_vote_count\": {\n      \"description\": \"number of down votes on this post\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"view_count\": {\n      \"description\": \"number of times this post has been viewed\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"score\": {\n      \"description\": \"score of this post\",\n      \"type\": \"integer\",\n      \"optional\": false\n    },\n    \"community_owned\": {\n      \"description\": \"whether this post is community owned\",\n      \"type\": \"boolean\",\n      \"optional\": false\n    },\n    \"title\": {\n      \"description\": \"title of this post, in plaintext\",\n      \"type\": \"string\",\n      \"optional\": false,\n      \"maxLength\": 200\n    },\n    \"body\": {\n      \"description\": \"body of this post, rendered as HTML\",\n      \"type\": \"string\",\n      \"maxLength\": 40000,\n      \"optional\": true\n    },\n    \"owner\": {\n      \"description\": \"\",\n      \"optional\": true,\n      \"type\": \"#.properties.user_stub\"\n    },\n    \"migrated\": {\n      \"description\": \"\",\n      \"optional\": true,\n      \"extends\": {\n        \"$ref\": \"#.properties.migration\"\n      }\n    },\n    \"answers\": {\n      \"description\": \"\",\n      \"optional\": true,\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"#.properties.answer\"\n      }\n    },\n    \"comments\": {\n      \"description\": \"\",\n      \"optional\": true,\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"#.properties.comment\"\n      }\n    }\n  }\n}\n</code></pre>\n",
      "comments": []
    },
    {
      "tags": [
        "app",
        "dev-tool"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 535,
          "accepted": false,
          "answer_comments_url": "/answers/535/comments",
          "question_id": 534,
          "owner": {
            "user_id": 448,
            "user_type": "registered",
            "display_name": "Dave DeLong",
            "reputation": 5074,
            "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
          },
          "creation_date": 1275687509,
          "last_activity_date": 1275687509,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "SOAPI-WATCH: A realtime service that notifies subscribers via Twitter when the API changes in any way",
          "body": "<p>I wouldn't mind twitter updates.  That'd be quite useful.</p>\n",
          "comments": [
            {
              "comment_id": 913,
              "creation_date": 1275724936,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 535,
              "post_type": "answer",
              "score": 1,
              "body": "<a href=\"http://twitter.com/SOAPIWATCH\" rel=\"nofollow\">twitter.com/SOAPIWATCH</a>"
            },
            {
              "comment_id": 969,
              "creation_date": 1275811838,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 535,
              "post_type": "answer",
              "score": 0,
              "body": "congratulations, you are amongst the 5 users to receive the first real notification from SOAPI-WATCH! lol."
            },
            {
              "comment_id": 1035,
              "creation_date": 1275928342,
              "owner": {
                "user_id": 448,
                "user_type": "registered",
                "display_name": "Dave DeLong",
                "reputation": 5074,
                "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 535,
              "post_type": "answer",
              "score": 1,
              "body": "@code poet thanks! having these updates has been incredibly useful!"
            }
          ]
        },
        {
          "answer_id": 536,
          "accepted": false,
          "answer_comments_url": "/answers/536/comments",
          "question_id": 534,
          "owner": {
            "user_id": 11,
            "user_type": "registered",
            "display_name": "lfoust",
            "reputation": 5785,
            "email_hash": "44a71cbfdb672befcb01b103a05b4c79"
          },
          "creation_date": 1275689923,
          "last_activity_date": 1275689923,
          "up_vote_count": 4,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 4,
          "community_owned": false,
          "title": "SOAPI-WATCH: A realtime service that notifies subscribers via Twitter when the API changes in any way",
          "body": "<p>This is a great idea. I would prefer updates via RSS.</p>\n",
          "comments": [
            {
              "comment_id": 891,
              "creation_date": 1275691013,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 536,
              "post_type": "answer",
              "score": 0,
              "body": "++ great idea - keep them coming. I am building the www service now."
            },
            {
              "comment_id": 950,
              "creation_date": 1275789340,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 536,
              "post_type": "answer",
              "score": 0,
              "body": "What kind of data would you expect to see in an rss feed concerning api changes?"
            },
            {
              "comment_id": 954,
              "creation_date": 1275796062,
              "owner": {
                "user_id": 11,
                "user_type": "registered",
                "display_name": "lfoust",
                "reputation": 5785,
                "email_hash": "44a71cbfdb672befcb01b103a05b4c79"
              },
              "post_id": 536,
              "post_type": "answer",
              "score": 0,
              "body": "I like your idea of a diff just listing the items that have been changed. I am not too particular about the format of the diff I just want to know when things are changed."
            },
            {
              "comment_id": 970,
              "creation_date": 1275811915,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 536,
              "post_type": "answer",
              "score": 0,
              "body": "sorry, you are not amongst the 5 users to receive the first real notification from SOAPI-WATCH. ;-)  check the diff <a href=\"http://skysanders.net/soapi/watch/diff\" rel=\"nofollow\">skysanders.net/soapi/watch/diff</a>"
            },
            {
              "comment_id": 1159,
              "creation_date": 1276222219,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 11,
                "user_type": "registered",
                "display_name": "lfoust",
                "reputation": 5785,
                "email_hash": "44a71cbfdb672befcb01b103a05b4c79"
              },
              "post_id": 536,
              "post_type": "answer",
              "score": 0,
              "body": "I am working on a compact diff format right now. will post to soapiwatch when finished"
            }
          ]
        }
      ],
      "favorite_count": 4,
      "question_timeline_url": "/questions/534/timeline",
      "question_comments_url": "/questions/534/comments",
      "question_answers_url": "/questions/534/answers",
      "question_id": 534,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1275686313,
      "last_edit_date": 1331747316,
      "last_activity_date": 1331747316,
      "up_vote_count": 15,
      "down_vote_count": 0,
      "view_count": 605,
      "score": 15,
      "community_owned": false,
      "title": "SOAPI-WATCH: A realtime service that notifies subscribers via Twitter when the API changes in any way",
      "body": "<h2>SOAPI-WATCH</h2>\n\n<hr>\n\n<p><sub>This post was one of the two that were listed regarding SOAPI.</sub></p>\n\n<p><sub>For a full overview of the SOAPI ecosystem see <a href=\"http://stackapps.com/questions/1352/what-is-soapi-and-why-should-i-care\">What is SOAPI and why should I care?</a></sub></p>\n\n<hr>\n\n<p>At four hour intervals, <a href=\"http://soapi.info/Services/Watch.aspx\" rel=\"nofollow\"><strong>SOAPI-WATCH</strong></a> parses the complete Stack Overflow API documentation and generates a complete object graph representing the API including all routes, parameters and return formats.</p>\n\n<p>This object graph is then compared, in minute detail, to the last known changed version.</p>\n\n<p>Summary information differences do not trigger a change condition.</p>\n\n<p>If changes are detected, the version just parsed is persisted and marked as latest and a Twitter status update is sent to <a href=\"http://twitter.com/soapiwatch\" rel=\"nofollow\"><strong>@SOAPIWATCH</strong></a> with a timestamp and link to the <a href=\"http://soapi.info/Tools/Diff.aspx\" rel=\"nofollow\"><strong>SOAPI-DIFF</strong></a> page, where changes are easily noted. </p>\n\n<p>To be notified of API changes, follow <a href=\"http://twitter.com/soapiwatch\" rel=\"nofollow\"><strong>@SOAPIWATCH</strong></a>.</p>\n\n<p><strong>Latest</strong></p>\n\n<p>The latest API specification, according to SOAPI, can be obtained via GET or POST at <a href=\"http://soapi.info/rest/api\" rel=\"nofollow\"><strong>http://soapi.info/rest/api</strong></a>.</p>\n\n<p>The default format is a human friendly, but complete, text dump that may be used for diff'ing API versions.</p>\n\n<p>Formats available</p>\n\n<ul>\n<li><p><a href=\"http://soapi.info/rest/api?format=txt\" rel=\"nofollow\">http://soapi.info/rest/api?format=txt</a> - \na formatted textual representation suitable for information/differencing.</p></li>\n<li><p><a href=\"http://soapi.info/rest/api?format=json\" rel=\"nofollow\">http://soapi.info/rest/api?format=json</a> - \na direct JSON serialization of the parsed API object graph.</p></li>\n<li><p><a href=\"http://soapi.info/rest/api?format=json&amp;jsonp=foo\" rel=\"nofollow\">http://soapi.info/rest/api?format=json&amp;jsonp=foo</a>  -\na direct JSON serialization of the parsed API object graph with padding. Useful for consuming the SOAPI from JavaScript applications. See <a href=\"http://stackapps.com/questions/603/\">SOAPI-EXPLORE</a> and <a href=\"http://stackapps.com/questions/710\">SOAPI-PARAM-EXAM</a> for examples.</p></li>\n<li><p><a href=\"http://soapi.info/rest/api?format=xml\" rel=\"nofollow\">http://soapi.info/rest/api?format=xml</a> - \na direct XML serialization of the parsed API object graph</p></li>\n</ul>\n",
      "comments": [
        {
          "comment_id": 1190,
          "creation_date": 1276297565,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "How does the &quot;email&quot; part work? I don&#39;t use Twitter but I see your title says it can email notifications. I don&#39;t see that option on the page or in the question though. I can see that this is going to be a very useful application though, as I&#39;ve already had one of my apps break because of a change."
        },
        {
          "comment_id": 1191,
          "creation_date": 1276298268,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "@farseeker - still working on a compact diff format. When it is complete I will expose a sub/unsub endpoint on the soapi.info/rest endpoint. When the compact diff format is complete I will build both email and rss.  Right now I am concentrating on writing examples and docs for the c#/silverlight wrapper. All of this should be wrapped up by the end of the weekend."
        },
        {
          "comment_id": 1192,
          "creation_date": 1276298452,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "@farseeker - and I actually never saw a use for twitter until now. it is actually a very low friction mechanism for notifications. I am sold on it for that purpose. as far as &#39;twitting&#39; what i just saw or how i feel... not sure that my initial eval of ridiculous is not still valid. ;-)"
        },
        {
          "comment_id": 1193,
          "creation_date": 1276298649,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "@code, cool - thanks. I don&#39;t use twitter on the basis that if you can say it in &lt; 160 characters, it probably doesn&#39;t deserve to be said..."
        },
        {
          "comment_id": 1565,
          "creation_date": 1276879911,
          "owner": {
            "user_id": 448,
            "user_type": "registered",
            "display_name": "Dave DeLong",
            "reputation": 5074,
            "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "@code poet - WRT the twitter updates, it&#39;d be nice if you could detect when the only thing that&#39;s changed is the first line of the api ;) That would help eliminate most of the &quot;false positive&quot; tweets."
        },
        {
          "comment_id": 1567,
          "creation_date": 1276880865,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 448,
            "user_type": "registered",
            "display_name": "Dave DeLong",
            "reputation": 5074,
            "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 1,
          "body": "@Dave - Yeah, I noticed that last week and have not gotten around to it. will address it later today. thanks for the nudge."
        },
        {
          "comment_id": 1678,
          "creation_date": 1277122605,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 448,
            "user_type": "registered",
            "display_name": "Dave DeLong",
            "reputation": 5074,
            "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "@dave - removed the revision number from the comparison. unless i broke something else things should quiet down."
        },
        {
          "comment_id": 5236,
          "creation_date": 1297792579,
          "owner": {
            "user_id": 4,
            "user_type": "moderator",
            "display_name": "Jeff Atwood",
            "reputation": 750,
            "email_hash": "51d623f33f8b83095db84ff35e15dbe8"
          },
          "post_id": 534,
          "post_type": "question",
          "score": 0,
          "body": "note that with 1.1 changes (/help is deprecated), this method may not work any more."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed",
        "api-v2",
        "documentation"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 3120,
          "accepted": true,
          "answer_comments_url": "/answers/3120/comments",
          "question_id": 3115,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1329158960,
          "last_activity_date": 1329158960,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "There is a small discrepancy in the docs for users-id-associated",
          "body": "<p>The latest deploy fixed this.</p>\n\n<p>As George pointed out, the method does take multiple account ids.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 3120,
      "favorite_count": 0,
      "question_timeline_url": "/questions/3115/timeline",
      "question_comments_url": "/questions/3115/comments",
      "question_answers_url": "/questions/3115/answers",
      "question_id": 3115,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1329072817,
      "last_edit_date": 1329158927,
      "last_activity_date": 1329158960,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 31,
      "score": 2,
      "community_owned": false,
      "title": "There is a small discrepancy in the docs for users-id-associated",
      "body": "<p>The main doc page, <a href=\"https://api.stackexchange.com/docs\">https://api.stackexchange.com/docs</a>, shows /users/{id}/associated while the method page, <a href=\"https://api.stackexchange.com/docs/associated-users\">https://api.stackexchange.com/docs/associated-users</a>, uses /users/{ids}/associated.</p>\n\n<p>It's minor but it's there.</p>\n",
      "comments": [
        {
          "comment_id": 7437,
          "creation_date": 1329078721,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 3115,
          "post_type": "question",
          "score": 0,
          "body": "I can confirm this - a quick test reveals that the method accepts multiple account IDs though the home page would indicate that it only accepts one."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed",
        "api-v2",
        "authentication"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 3117,
          "accepted": true,
          "answer_comments_url": "/answers/3117/comments",
          "question_id": 3116,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1329091811,
          "last_activity_date": 1329091811,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "the stack exchange javascript library is 404",
          "body": "<p>DNS went wonky on our end, this has been fixed, those responsible have been beaten.</p>\n\n<p>While there's a chance it still won't resolve for some folks, all that should shake itself out within the next 15 minutes or so.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 3117,
      "favorite_count": 0,
      "question_timeline_url": "/questions/3116/timeline",
      "question_comments_url": "/questions/3116/comments",
      "question_answers_url": "/questions/3116/answers",
      "question_id": 3116,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1329080967,
      "last_edit_date": 1329091740,
      "last_activity_date": 1329091811,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 55,
      "score": 2,
      "community_owned": false,
      "title": "the stack exchange javascript library is 404",
      "body": "<p>the library listed on the doc page for Authentication</p>\n\n<p><a href=\"https://api.stackexchange.com/js/2.0/all.js\">https://api.stackexchange.com/js/2.0/all.js</a></p>\n\n<p>ultimately redirects to </p>\n\n<p><a href=\"https://api-v2cdn.sstatic.net/js/all.js\" rel=\"nofollow\">https://api-v2cdn.sstatic.net/js/all.js</a></p>\n\n<p>which results in varying degrees of failure. sometimes simple 404 but i am currently getting</p>\n\n<pre><code>This webpage is not available\nThe webpage at https://api-v2cdn.sstatic.net/js/all.js might be temporarily down or it may have moved permanently to a new web address.\nError 111 (net::ERR_TUNNEL_CONNECTION_FAILED): Unknown error\n</code></pre>\n",
      "comments": []
    },
    {
      "tags": [
        "discussion",
        "dev-tip"
      ],
      "answer_count": 7,
      "answers": [
        {
          "answer_id": 1011,
          "accepted": false,
          "answer_comments_url": "/answers/1011/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1278304836,
          "last_activity_date": 1278304836,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>Looks good. I did a very similar thing for stack.PHP, but it wasn't as elagant.</p>\n\n<p>Is this code public domain?</p>\n\n<p>P.S. On SO, it would look something like this:</p>\n\n<ul>\n<li>0 sec. ago - 59 sec. ago</li>\n<li>1 min. ago - 59 min. ago</li>\n<li>1 hr. ago - 23 hr. ago</li>\n<li>yesterday</li>\n<li>2 days ago</li>\n<li>MM DD</li>\n<li>MM DD, YY</li>\n</ul>\n",
          "comments": [
            {
              "comment_id": 2393,
              "creation_date": 1278305349,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1011,
              "post_type": "answer",
              "score": 1,
              "body": "as per my profile: All code posted is tested and works on my machine. Unless otherwise noted, it is public domain and you are free to do with as you please."
            },
            {
              "comment_id": 2395,
              "creation_date": 1278306448,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1011,
              "post_type": "answer",
              "score": 0,
              "body": "Ah, well... thank you!"
            },
            {
              "comment_id": 2410,
              "creation_date": 1278345802,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1011,
              "post_type": "answer",
              "score": 0,
              "body": "post your implementation, that is what this post is about."
            },
            {
              "comment_id": 2778,
              "creation_date": 1279221730,
              "owner": {
                "user_id": 1189,
                "user_type": "registered",
                "display_name": "Chase Florell",
                "reputation": 141,
                "email_hash": "b3d89a508a9f98b52633193292ae91b1"
              },
              "post_id": 1011,
              "post_type": "answer",
              "score": 0,
              "body": "yup, let&#39;s see the PHP."
            },
            {
              "comment_id": 2780,
              "creation_date": 1279224623,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 1189,
                "user_type": "registered",
                "display_name": "Chase Florell",
                "reputation": 141,
                "email_hash": "b3d89a508a9f98b52633193292ae91b1"
              },
              "post_id": 1011,
              "post_type": "answer",
              "score": 0,
              "body": "@rock: See <a href=\"http://stackapps.com/questions/1009/dev-tip-how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exch/1018#1018\">my answer</a> above."
            }
          ]
        },
        {
          "answer_id": 1013,
          "accepted": false,
          "answer_comments_url": "/answers/1013/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 53,
            "user_type": "registered",
            "display_name": "Mef",
            "reputation": 2151,
            "email_hash": "87cafbd0ee11e0bac41a303e8908b034"
          },
          "creation_date": 1278316962,
          "last_activity_date": 1278316962,
          "up_vote_count": 5,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 5,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>For all the jQuery developers, there is - as always - a decent plugin available: <a href=\"http://timeago.yarp.com/\" rel=\"nofollow\"><strong>timeago</strong></a>...</p>\n\n<p>Bonus: comes with auto-refresh, supports a semantic approach and is kind of progressive enhancement-ish, since it will turn something like</p>\n\n<pre><code>&lt;abbr class=\"timeago\" title=\"2008-07-17T09:24:17Z\"&gt;July 17, 2008&lt;/abbr&gt;\n</code></pre>\n\n<p>into timestamps like</p>\n\n<pre><code>about a year ago\n</code></pre>\n\n<p>As ususal, one line of jQuery does the job...</p>\n\n<pre><code>jQuery(document).ready(function() {\n    jQuery(\"abbr.timeago\").timeago();\n});\n</code></pre>\n\n<p>Having that said, I want to emphasize that I don't know the author of this plugin in any way and don't get paid for making propaganda for it =)</p>\n",
          "comments": [
            {
              "comment_id": 2400,
              "creation_date": 1278318037,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1013,
              "post_type": "answer",
              "score": 1,
              "body": "+ thanks for that."
            },
            {
              "comment_id": 4740,
              "creation_date": 1289849595,
              "owner": {
                "user_id": 1189,
                "user_type": "registered",
                "display_name": "Chase Florell",
                "reputation": 141,
                "email_hash": "b3d89a508a9f98b52633193292ae91b1"
              },
              "post_id": 1013,
              "post_type": "answer",
              "score": 0,
              "body": "I use this as the primary method, and I use my method below for server side calculations... for users without JS enabled."
            }
          ]
        },
        {
          "answer_id": 1017,
          "accepted": false,
          "answer_comments_url": "/answers/1017/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 1189,
            "user_type": "registered",
            "display_name": "Chase Florell",
            "reputation": 141,
            "email_hash": "b3d89a508a9f98b52633193292ae91b1"
          },
          "creation_date": 1278343821,
          "last_edit_date": 1328811645,
          "last_activity_date": 1328811645,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>Here's a quick and dirty way of how I did mine in .NET</p>\n\n<p>Visual Basic</p>\n\n\n\n<pre><code>    ''# &lt;summary&gt;\n    ''# Return how long in the past something happend\n    ''# &lt;/summary&gt;\n    ''# &lt;param name=\"input\"&gt;The date of an event in UTC time&lt;/param&gt;\n    ''# &lt;param name=\"append\"&gt;append characters to the end of the string \n    ''# example: \"suffixAgo\"&lt;/param&gt;\n    ''# &lt;returns&gt;a logical string \"10 mins ago\"&lt;/returns&gt;\n    ''# &lt;remarks&gt;This function is primarily used in Views to format Model data.&lt;/remarks&gt;\n    Public Shared Function GetDateRange(ByVal input As DateTime, Optional ByVal suffixAgo As String = Nothing) As String\n        Dim output As String\n        Dim theDate As DateTime = dt\n        Dim DateInterval As TimeSpan = DateTime.UtcNow - theDate\n        Dim SecondsAppart As Integer = Math.Floor(DateInterval.TotalSeconds)\n        If (SecondsAppart &lt; 86400) Then\n            If SecondsAppart &lt; 59 Then\n                output = (\"less than a minute \" + suffixAgo)\n            ElseIf SecondsAppart &lt; 119 Then\n                output = (\"about a minute \" + suffixAgo)\n            ElseIf SecondsAppart &lt; 3599 Then\n                output = String.Format(\"{0} minutes {1}\", Math.Floor(DateInterval.TotalMinutes), suffixAgo)\n            ElseIf SecondsAppart &lt; 7199 Then\n                output = \"about an hour \" + suffixAgo\n            Else\n                output = String.Format(\"{0} hours {1}\", Math.Floor(DateInterval.TotalHours), suffixAgo)\n            End If\n        Else\n            Dim DaysAppart As Integer = Math.Floor(DateInterval.TotalDays)\n            If DaysAppart &lt;= 1 Then\n                output = \"yesterday\"\n            ElseIf DaysAppart &lt; 30 Then\n                output = String.Format(\"{0} days {1}\", Math.Floor(DateInterval.TotalDays), suffixAgo)\n            ElseIf DaysAppart &lt; 60 Then\n                output = \"about a month \" + suffixAgo\n            ElseIf DaysAppart &lt; 365 Then\n                output = String.Format(\"{0} months {1}\", Math.Floor(DateInterval.TotalDays / 30), suffixAgo)\n            ElseIf DaysAppart &lt; 730 Then\n                output = (\"about a year \" + suffixAgo)\n            Else\n                output = String.Format(\"{0} years {1}\", Math.Floor(DateInterval.TotalDays / 365), suffixAgo)\n            End If\n        End If \n\n            Return output\n    End Function\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 2409,
              "creation_date": 1278345147,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1017,
              "post_type": "answer",
              "score": 0,
              "body": "+1 thanks for that."
            }
          ]
        },
        {
          "answer_id": 1018,
          "accepted": false,
          "answer_comments_url": "/answers/1018/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1278346269,
          "last_edit_date": 1328827535,
          "last_activity_date": 1328827535,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>Here is a similar function in PHP:</p>\n\n<pre><code>function Pluralize($amount, $unit)\n{\n    if($amount == 1)\n        return \"$amount $unit ago\";\n    else\n        return \"$amount {$unit}s ago\";\n}\n\nfunction RelativeTime($timestamp)\n{\n    // Calculate the difference\n    $current_time = time();\n    $difference = $current_time - $timestamp;\n\n    if($difference == 0)\n        return 'just now';\n    elseif($difference &lt; 60)\n        return Pluralize($difference, 'second');\n    elseif($difference &lt; self::Hour)\n        return Pluralize(floor($difference / 60), 'minute');\n    elseif($difference &lt; self::Day)\n        return Pluralize(floor($difference / self::Hour), 'hour');\n    elseif($difference &lt; (self::Day * 2))\n        return 'yesterday';\n    elseif($difference &lt; self::Month)\n        return Pluralize(floor($difference / self::Day), 'day');\n    elseif($difference &lt; self::Year)\n        return Pluralize(floor($difference / self::Month), 'month');\n    else\n        return Pluralize(floor($difference / self::Year), 'year');\n}\n</code></pre>\n\n<p><em>Note: this is borrowed from my <a href=\"http://stackapps.com/questions/826/stack-php-clean-easy-to-use-wrapper-for-php\">Stack.PHP wrapper</a>.</em></p>\n",
          "comments": [
            {
              "comment_id": 2413,
              "creation_date": 1278348826,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1018,
              "post_type": "answer",
              "score": 1,
              "body": "thats good. is there a link to php date format strings? i would like to refactor the JS version."
            },
            {
              "comment_id": 2418,
              "creation_date": 1278351828,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1018,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@code: <a href=\"http://php.net/manual/en/function.date.php\" rel=\"nofollow\">php.net/manual/en/function.date.php</a>"
            }
          ]
        },
        {
          "answer_id": 1034,
          "accepted": false,
          "answer_comments_url": "/answers/1034/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 9,
            "user_type": "registered",
            "display_name": "Bill the Lizard",
            "reputation": 2830,
            "email_hash": "fc763c6ff6c160ddad05741e87e517b6"
          },
          "creation_date": 1278476246,
          "last_edit_date": 1278476591,
          "last_activity_date": 1278476591,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>Here's a Java implementation that was heavily influenced by the answers on the SO question <a href=\"http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time/12#12\">How do I calculate relative time?</a>, particularly <a href=\"http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time/12#12\">@Jeff's</a> and the accepted answer by <a href=\"http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time/1248#1248\">@Vincent Robert</a>.</p>\n\n<pre><code>/**\n * Formats the time elapsed between fromDate and now.\n * See http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time/\n * \n * @param fromDate the start time, a unix epoch datetime stamp.\n * @return the formatted time elapsed.\n */\npublic static String formatElapsedTime(long fromDate) {\n    int SECOND = 1;\n    int MINUTE = 60 * SECOND;\n    int HOUR = 60 * MINUTE;\n    int DAY = 24 * HOUR;\n    int MONTH = 30 * DAY;\n\n    long now = (new Date()).getTime();\n    long delta = (now / 1000) - fromDate;\n\n    if (delta &lt; 1 * MINUTE) {\n        return delta == 1 ? \"one second ago\" : delta + \" seconds ago\";\n    }\n    if (delta &lt; 2 * MINUTE) {\n        return \"a minute ago\";\n    }\n    if (delta &lt; 45 * MINUTE) {\n        return (delta / MINUTE) + \" minutes ago\";\n    }\n    if (delta &lt; 90 * MINUTE) {\n        return \"an hour ago\";\n    }\n    if (delta &lt; 24 * HOUR) {\n        return (delta / HOUR) + \" hours ago\";\n    }\n    if (delta &lt; 48 * HOUR) {\n        return \"yesterday\";\n    }\n    if (delta &lt; 30 * DAY) {\n        return (delta / DAY) + \" days ago\";\n    }\n    if (delta &lt; 12 * MONTH) {\n        int months = (int)(Math.floor((double) ((delta / DAY) / 30)));\n        return months &lt;= 1 ? \"one month ago\" : months + \" months ago\";\n    } else {\n        int years = (int)(Math.floor((double) (delta / DAY) / 365));\n        return years &lt;= 1 ? \"one year ago\" : years + \" years ago\";\n    }\n}\n</code></pre>\n\n<p>Here are some passing JUnit tests that show what kind of results you can expect.</p>\n\n<pre><code>@Test\npublic void testFormatElapsedTime() {\n    long now = (new Date()).getTime() / 1000;\n\n    assertEquals( \"one second ago\", formatElapsedTime(now - 1) );\n    assertEquals( \"2 seconds ago\", formatElapsedTime(now - 2) );\n    assertEquals( \"30 seconds ago\", formatElapsedTime(now - 30) );\n    assertEquals( \"59 seconds ago\", formatElapsedTime(now - 59) );\n\n    assertEquals( \"a minute ago\", formatElapsedTime(now - 60) );\n    assertEquals( \"a minute ago\", formatElapsedTime(now - 61) );\n    assertEquals( \"a minute ago\", formatElapsedTime(now - 119) );\n\n    assertEquals( \"2 minutes ago\", formatElapsedTime(now - 120) );\n    assertEquals( \"2 minutes ago\", formatElapsedTime(now - 121) );\n    assertEquals( \"2 minutes ago\", formatElapsedTime(now - 179) );\n    assertEquals( \"3 minutes ago\", formatElapsedTime(now - 180) );\n    assertEquals( \"44 minutes ago\", formatElapsedTime(now - (44 * 60)) );\n\n    assertEquals( \"an hour ago\", formatElapsedTime(now - (45 * 60)) );\n    assertEquals( \"an hour ago\", formatElapsedTime(now - (89 * 60)) );\n    assertEquals( \"1 hours ago\", formatElapsedTime(now - (90 * 60)) );\n    assertEquals( \"1 hours ago\", formatElapsedTime(now - (119 * 60)) );\n    assertEquals( \"2 hours ago\", formatElapsedTime(now - (120 * 60)) );\n    assertEquals( \"2 hours ago\", formatElapsedTime(now - (179 * 60)) );\n    assertEquals( \"3 hours ago\", formatElapsedTime(now - (180 * 60)) );\n    assertEquals( \"23 hours ago\", formatElapsedTime(now - (23 * 60 * 60)) );\n\n    assertEquals( \"yesterday\", formatElapsedTime(now - (24 * 60 * 60)) );\n    assertEquals( \"yesterday\", formatElapsedTime(now - (47 * 60 * 60)) );\n    assertEquals( \"2 days ago\", formatElapsedTime(now - (48 * 60 * 60)) );\n    assertEquals( \"3 days ago\", formatElapsedTime(now - (3 * 24 * 60 * 60)) );\n    assertEquals( \"14 days ago\", formatElapsedTime(now - (14 * 24 * 60 * 60)) );\n    assertEquals( \"29 days ago\", formatElapsedTime(now - (29 * 24 * 60 * 60)) );\n\n    assertEquals( \"one month ago\", formatElapsedTime(now - (30 * 24 * 60 * 60)) );\n    assertEquals( \"one month ago\", formatElapsedTime(now - (59 * 24 * 60 * 60)) );\n    assertEquals( \"2 months ago\", formatElapsedTime(now - (60 * 24 * 60 * 60)) );\n    assertEquals( \"2 months ago\", formatElapsedTime(now - (89 * 24 * 60 * 60)));\n    assertEquals( \"3 months ago\", formatElapsedTime(now - (3 * 30 * 24 * 60 * 60)) );\n    assertEquals( \"11 months ago\", formatElapsedTime(now - (11 * 30 * 24 * 60 * 60)) );\n\n    assertEquals( \"one year ago\", formatElapsedTime(now - (12 * 30 * 24 * 60 * 60)) );\n    assertEquals( \"one year ago\", formatElapsedTime(now - (18 * 30 * 24 * 60 * 60)) );\n    assertEquals( \"one year ago\", formatElapsedTime(now - (23 * 30 * 24 * 60 * 60)) );\n\n    // a little bit of error in the calculation shows up here.\n    assertEquals( \"one year ago\", formatElapsedTime(now - (24 * 30 * 24 * 60 * 60)) );\n    assertEquals( \"2 years ago\", formatElapsedTime(now - (25 * 30 * 24 * 60 * 60)) );\n}\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 3487,
              "creation_date": 1281426241,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1034,
              "post_type": "answer",
              "score": 0,
              "body": "your name in lights: <a href=\"http://stackapps.com/questions/1009/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site/1343#1343\" title=\"how to format time since xxx e g 4 minutes ago similar to stack exchange site\">stackapps.com/questions/1009/&hellip;</a>"
            },
            {
              "comment_id": 3614,
              "creation_date": 1281730250,
              "owner": {
                "user_id": 280,
                "user_type": "registered",
                "display_name": "Juha Syrjälä",
                "reputation": 2121,
                "email_hash": "69d0034bbc8ef52aeaf67aaa69f37c6d"
              },
              "post_id": 1034,
              "post_type": "answer",
              "score": 0,
              "body": "&quot;an hour ago&quot; vs. &quot;1 hours ago&quot; ??"
            },
            {
              "comment_id": 3617,
              "creation_date": 1281731339,
              "owner": {
                "user_id": 9,
                "user_type": "registered",
                "display_name": "Bill the Lizard",
                "reputation": 2830,
                "email_hash": "fc763c6ff6c160ddad05741e87e517b6"
              },
              "reply_to_user": {
                "user_id": 280,
                "user_type": "registered",
                "display_name": "Juha Syrjälä",
                "reputation": 2121,
                "email_hash": "69d0034bbc8ef52aeaf67aaa69f37c6d"
              },
              "post_id": 1034,
              "post_type": "answer",
              "score": 0,
              "body": "@Juha: Yeah, I&#39;m not crazy about that either.  It&#39;s an artifact of the way that &quot;an hour ago&quot; is defined as 45 - 90 minutes ago and anything more than that (within the last 24 hours) is displayed as an integer number of hours.  I wanted to stay true to the original implementation though."
            },
            {
              "comment_id": 3623,
              "creation_date": 1281732719,
              "owner": {
                "user_id": 280,
                "user_type": "registered",
                "display_name": "Juha Syrjälä",
                "reputation": 2121,
                "email_hash": "69d0034bbc8ef52aeaf67aaa69f37c6d"
              },
              "post_id": 1034,
              "post_type": "answer",
              "score": 0,
              "body": "Actually SO does not currently use this algorithm. It says &quot;1 hour ago&quot; for 60-120 minutes ago."
            }
          ]
        },
        {
          "answer_id": 1343,
          "accepted": false,
          "answer_comments_url": "/answers/1343/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281426216,
          "last_edit_date": 1284862089,
          "last_activity_date": 1284862089,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<h3>C# and Javascript port of Bill's answer</h3>\n\n<p>Works for me - adding it to both Soapi libraries.  See the JS version in action <a href=\"http://stackusers.com/Users/Query\" rel=\"nofollow\">here</a></p>\n\n<p>One thing to keep in mind is that dates coming from the API are UTC. In order to get a viable diff, you need to convert your <code>Now</code> to UTC.</p>\n\n<p><strong>c#</strong></p>\n\n<pre><code>    /// &lt;summary&gt;\n    /// Formats the time elapsed between fromDate and now.\n    /// See http://stackoverflow.com/questions/11/how-do-i-calculate-relative-time/\n    /// and http://stackapps.com/questions/1009/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site/1034#1034\n    /// &lt;/summary&gt;\n    /// &lt;param name=\"fromDate\"&gt;the start time&lt;/param&gt;\n    /// &lt;returns&gt;the formatted time elapsed.&lt;/returns&gt;\n    /// &lt;remarks&gt;A direct port of Bill the Lizards answer&lt;/remarks&gt;\n    public static string FormatElapsedTime(DateTime fromDate)\n    {\n        const int second = 1;\n        const int minute = 60 * second;\n        const int hour = 60 * minute;\n        const int day = 24 * hour;\n        const int month = 30 * day;\n\n\n        int delta = (int) (DateTime.Now.ToUniversalTime() - fromDate).TotalSeconds;\n\n        if (delta &lt; 1 * minute)\n        {\n            return delta == 1 ? \"one second ago\" : delta + \" seconds ago\";\n        }\n        if (delta &lt; 2 * minute)\n        {\n            return \"a minute ago\";\n        }\n        if (delta &lt; 45 * minute)\n        {\n            return (delta / minute) + \" minutes ago\";\n        }\n        if (delta &lt; 90 * minute)\n        {\n            return \"an hour ago\";\n        }\n        if (delta &lt; 24 * hour)\n        {\n            return (delta / hour) + \" hours ago\";\n        }\n        if (delta &lt; 48 * hour)\n        {\n            return \"yesterday\";\n        }\n        if (delta &lt; 30 * day)\n        {\n            return (delta / day) + \" days ago\";\n        }\n        if (delta &lt; 12 * month)\n        {\n            int months = (int) (Math.Floor(((delta / day) / 30)));\n            return months &lt;= 1 ? \"one month ago\" : months + \" months ago\";\n        }\n\n        int years = (int)(Math.Floor((delta / day) / 365));\n        return years &lt;= 1 ? \"one year ago\" : years + \" years ago\";\n    }\n}\n</code></pre>\n\n<p><strong>JavaScript</strong></p>\n\n<pre><code>&lt;!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"&gt;\n&lt;html&gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;/title&gt;\n    &lt;script type=\"text/javascript\"&gt;\n\n        function formatElapsedTime(fromDate)\n        {\n            var second = 1;\n            var minute = 60 * second;\n            var hour = 60 * minute;\n            var day = 24 * hour;\n            var month = 30 * day;\n\n            var delta = (new Date() - fromDate) / 1000;\n\n            if (delta &lt; 1 * minute)\n            {\n                return delta == 1 ? \"one second ago\" : Math.floor(delta) + \" seconds ago\";\n            }\n            if (delta &lt; 2 * minute)\n            {\n                return \"a minute ago\";\n            }\n            if (delta &lt; 45 * minute)\n            {\n                return Math.floor(delta / minute) + \" minutes ago\";\n            }\n            if (delta &lt; 90 * minute)\n            {\n                return \"an hour ago\";\n            }\n            if (delta &lt; 24 * hour)\n            {\n                return Math.floor(delta / hour) + \" hours ago\";\n            }\n            if (delta &lt; 48 * hour)\n            {\n                return \"yesterday\";\n            }\n            if (delta &lt; 30 * day)\n            {\n                return Math.floor(delta / day) + \" days ago\";\n            }\n            if (delta &lt; 12 * month)\n            {\n                var months = Math.floor((delta / day) / 30);\n                return months &lt;= 1 ? \"one month ago\" : months + \" months ago\";\n            }\n            var years = Math.floor((delta / day) / 365);\n            return years &lt;= 1 ? \"one year ago\" : years + \" years ago\";\n        }\n\n\n        function tests()\n        {\n\n            function assertEquals(expected, actual)\n            {\n                var equals = expected == actual;\n                var output = document.getElementById(\"output\");\n                var div = document.createElement(\"div\");\n                div.innerHTML = (equals ? \"passed\" : \"FAILED\") + \" : expected \" + expected + \" and got \" + actual;\n                output.appendChild(div)\n            }\n\n            var now = (new Date()).getTime();\n\n            assertEquals(\"one second ago\", formatElapsedTime(now - 1000));\n            assertEquals(\"2 seconds ago\", formatElapsedTime(now - 2000));\n            assertEquals(\"30 seconds ago\", formatElapsedTime(now - 30000));\n            assertEquals(\"59 seconds ago\", formatElapsedTime(now - 59000));\n\n            assertEquals(\"a minute ago\", formatElapsedTime(now - 60000));\n            assertEquals(\"a minute ago\", formatElapsedTime(now - 61000));\n            assertEquals(\"a minute ago\", formatElapsedTime(now - 119000));\n\n            assertEquals(\"2 minutes ago\", formatElapsedTime(now - 120000));\n            assertEquals(\"2 minutes ago\", formatElapsedTime(now - 121000));\n            assertEquals(\"2 minutes ago\", formatElapsedTime(now - 179000));\n            assertEquals(\"3 minutes ago\", formatElapsedTime(now - 180000));\n            assertEquals(\"44 minutes ago\", formatElapsedTime(now - (44 * 60000)));\n\n            assertEquals(\"an hour ago\", formatElapsedTime(now - (45 * 60000)));\n            assertEquals(\"an hour ago\", formatElapsedTime(now - (89 * 60000)));\n            assertEquals(\"1 hours ago\", formatElapsedTime(now - (90 * 60000)));\n            assertEquals(\"1 hours ago\", formatElapsedTime(now - (119 * 60000)));\n            assertEquals(\"2 hours ago\", formatElapsedTime(now - (120 * 60000)));\n            assertEquals(\"2 hours ago\", formatElapsedTime(now - (179 * 60000)));\n            assertEquals(\"3 hours ago\", formatElapsedTime(now - (180 * 60000)));\n            assertEquals(\"23 hours ago\", formatElapsedTime(now - (23 * 60 * 60000)));\n\n            assertEquals(\"yesterday\", formatElapsedTime(now - (24 * 60 * 60000)));\n            assertEquals(\"yesterday\", formatElapsedTime(now - (47 * 60 * 60000)));\n            assertEquals(\"2 days ago\", formatElapsedTime(now - (48 * 60 * 60000)));\n            assertEquals(\"3 days ago\", formatElapsedTime(now - (3 * 24 * 60 * 60000)));\n            assertEquals(\"14 days ago\", formatElapsedTime(now - (14 * 24 * 60 * 60000)));\n            assertEquals(\"29 days ago\", formatElapsedTime(now - (29 * 24 * 60 * 60000)));\n\n            assertEquals(\"one month ago\", formatElapsedTime(now - (30 * 24 * 60 * 60000)));\n            assertEquals(\"one month ago\", formatElapsedTime(now - (59 * 24 * 60 * 60000)));\n            assertEquals(\"2 months ago\", formatElapsedTime(now - (60 * 24 * 60 * 60000)));\n            assertEquals(\"2 months ago\", formatElapsedTime(now - (89 * 24 * 60 * 60000)));\n            assertEquals(\"3 months ago\", formatElapsedTime(now - (3 * 30 * 24 * 60 * 60000)));\n            assertEquals(\"11 months ago\", formatElapsedTime(now - (11 * 30 * 24 * 60 * 60000)));\n\n            assertEquals(\"one year ago\", formatElapsedTime(now - (12 * 30 * 24 * 60 * 60000)));\n            assertEquals(\"one year ago\", formatElapsedTime(now - (18 * 30 * 24 * 60 * 60000)));\n            assertEquals(\"one year ago\", formatElapsedTime(now - (23 * 30 * 24 * 60 * 60000)));\n\n            // a little bit of error in the calculation shows up here.\n            assertEquals(\"one year ago\", formatElapsedTime(now - (24 * 30 * 24 * 60 * 60000)));\n            assertEquals(\"2 years ago\", formatElapsedTime(now - (25 * 30 * 24 * 60 * 60000)));\n        }\n    &lt;/script&gt;\n&lt;/head&gt;\n&lt;body onload=\"tests()\"&gt;\n    &lt;div id=\"output\"&gt;\n    &lt;/div&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n\n<p><strong>Test Results</strong></p>\n\n<pre>\npassed : expected one second ago and got one second ago\npassed : expected 2 seconds ago and got 2 seconds ago\npassed : expected 30 seconds ago and got 30 seconds ago\npassed : expected 59 seconds ago and got 59 seconds ago\npassed : expected a minute ago and got a minute ago\npassed : expected a minute ago and got a minute ago\npassed : expected a minute ago and got a minute ago\npassed : expected 2 minutes ago and got 2 minutes ago\npassed : expected 2 minutes ago and got 2 minutes ago\npassed : expected 2 minutes ago and got 2 minutes ago\npassed : expected 3 minutes ago and got 3 minutes ago\npassed : expected 44 minutes ago and got 44 minutes ago\npassed : expected an hour ago and got an hour ago\npassed : expected an hour ago and got an hour ago\npassed : expected 1 hours ago and got 1 hours ago\npassed : expected 1 hours ago and got 1 hours ago\npassed : expected 2 hours ago and got 2 hours ago\npassed : expected 2 hours ago and got 2 hours ago\npassed : expected 3 hours ago and got 3 hours ago\npassed : expected 23 hours ago and got 23 hours ago\npassed : expected yesterday and got yesterday\npassed : expected yesterday and got yesterday\npassed : expected 2 days ago and got 2 days ago\npassed : expected 3 days ago and got 3 days ago\npassed : expected 14 days ago and got 14 days ago\npassed : expected 29 days ago and got 29 days ago\npassed : expected one month ago and got one month ago\npassed : expected one month ago and got one month ago\npassed : expected 2 months ago and got 2 months ago\npassed : expected 2 months ago and got 2 months ago\npassed : expected 3 months ago and got 3 months ago\npassed : expected 11 months ago and got 11 months ago\npassed : expected one year ago and got one year ago\npassed : expected one year ago and got one year ago\npassed : expected one year ago and got one year ago\npassed : expected one year ago and got one year ago\npassed : expected 2 years ago and got 2 years ago\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1371,
          "accepted": false,
          "answer_comments_url": "/answers/1371/comments",
          "question_id": 1009,
          "owner": {
            "user_id": 570,
            "user_type": "registered",
            "display_name": "Lucas Jones",
            "reputation": 921,
            "email_hash": "7af33908a4aa18412430e704ca6c1253"
          },
          "creation_date": 1281647135,
          "last_edit_date": 1297615509,
          "last_activity_date": 1297615509,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
          "body": "<p>Here's <a href=\"http://github.com/lucjon/Py-StackExchange/blob/master/stackcore.py#L191\" rel=\"nofollow\">my code</a> from <a href=\"http://stackapps.com/questions/198\">Py-StackExchange</a>, in Python:</p>\n\n<pre><code>def format_relative_date(date):\n    \"\"\"Takes a datetime object and returns the date formatted as a string e.g. \"3 minutes ago\", like the real site.\n    This is based roughly on George Edison's code from StackApps:\n    http://stackapps.com/questions/1009/how-to-format-time-since-xxx-e-g-4-minutes-ago-similar-to-stack-exchange-site/1018#1018\"\"\"\n\n    now = datetime.now()\n    diff = (now - date).seconds\n\n    # Anti-repetition! These simplify the code somewhat.\n    plural = lambda d: 's' if d != 1 else ''\n    frmt   = lambda d: (diff / float(d), plural(diff / float(d)))\n\n    if diff &lt; 60:\n        return '%d second%s ago' % frmt(1)\n    elif diff &lt; 3600:\n        return '%d minute%s ago' % frmt(60)\n    elif diff &lt; 86400:\n        return '%d hour%s ago' % frmt(3600)\n    elif diff &lt; 172800:\n        return 'yesterday'\n    else:\n        return date.strftime('M j / y - H:i')\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 3571,
              "creation_date": 1281648175,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1371,
              "post_type": "answer",
              "score": 2,
              "body": "thanks for that."
            }
          ]
        }
      ],
      "favorite_count": 4,
      "question_timeline_url": "/questions/1009/timeline",
      "question_comments_url": "/questions/1009/comments",
      "question_answers_url": "/questions/1009/answers",
      "question_id": 1009,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1278297169,
      "last_edit_date": 1279225969,
      "last_activity_date": 1328827535,
      "up_vote_count": 8,
      "down_vote_count": 0,
      "view_count": 830,
      "score": 8,
      "community_owned": true,
      "title": "How to format time since xxx e.g. \"4 minutes ago\" similar to Stack Exchange sites",
      "body": "<pre><code>function timeSince(date) {\n\n    var seconds = Math.floor((new Date() - date) / 1000);\n\n    var interval = Math.floor(seconds / 31536000);\n\n    if (interval &gt; 1) {\n        return interval + \" years\";\n    }\n    interval = Math.floor(seconds / 2592000);\n    if (interval &gt; 1) {\n        return interval + \" months\";\n    }\n    interval = Math.floor(seconds / 86400);\n    if (interval &gt; 1) {\n        return interval + \" days\";\n    }\n    interval = Math.floor(seconds / 3600);\n    if (interval &gt; 1) {\n        return interval + \" hours\";\n    }\n    interval = Math.floor(seconds / 60);\n    if (interval &gt; 1) {\n        return interval + \" minutes\";\n    }\n    return Math.floor(seconds) + \" seconds\";\n}\n</code></pre>\n\n<p>Post an implementation in your language of choice.</p>\n",
      "comments": [
        {
          "comment_id": 2390,
          "creation_date": 1278300864,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 0,
          "body": "Is there a question? This is more suitable for Stack Overflow."
        },
        {
          "comment_id": 2391,
          "creation_date": 1278301695,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 0,
          "body": "It&#39;s a dev-tip... maybe we should play Jepoardy here as well?"
        },
        {
          "comment_id": 2392,
          "creation_date": 1278301695,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 1,
          "body": "no, there is no question. it is a tip on how to present dates in a friendly format, similar to that used by the stack exchange sites, whose data we are consuming via the api.  If you wanted to format a list of items that have dates, as most do, this might be useful information. I know I had to spend some time figuring it out, no need for others. I am not sure why or how I would post this on stack overflow and am sure that it would not be discoverable."
        },
        {
          "comment_id": 2398,
          "creation_date": 1278315091,
          "owner": {
            "user_id": 1241,
            "user_type": "registered",
            "display_name": "Edan Maor",
            "reputation": 881,
            "email_hash": "10aae09a71c08efc29b09b7a9cf8706d"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 1,
          "body": "@code poet: I&#39;d still post on Stack Overflow and try to give it a good title. This is something lots of people will find useful at some point."
        },
        {
          "comment_id": 2399,
          "creation_date": 1278316338,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1241,
            "user_type": "registered",
            "display_name": "Edan Maor",
            "reputation": 881,
            "email_hash": "10aae09a71c08efc29b09b7a9cf8706d"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 0,
          "body": "@Edan - you are probably right. I will, although I want this post to remain in the relative quiet and more contextually appropriate stackapps as well, so hopefully it won&#39;t suffer &#39;exact duplicate&#39; fate.  dupe cops miss the point sometimes."
        },
        {
          "comment_id": 2491,
          "creation_date": 1278476355,
          "owner": {
            "user_id": 9,
            "user_type": "registered",
            "display_name": "Bill the Lizard",
            "reputation": 2830,
            "email_hash": "fc763c6ff6c160ddad05741e87e517b6"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 0,
          "body": "Follow-up question: There are some slight errors on the elapsed times displayed on the site due to treating all months uniformly as 30 days and ignoring leap years.  Do you think it&#39;s a good idea to keep these errors to match the site (see my answer) or should we try to fix them?"
        },
        {
          "comment_id": 2494,
          "creation_date": 1278476979,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 9,
            "user_type": "registered",
            "display_name": "Bill the Lizard",
            "reputation": 2830,
            "email_hash": "fc763c6ff6c160ddad05741e87e517b6"
          },
          "post_id": 1009,
          "post_type": "question",
          "score": 1,
          "body": "@bill - month is pretty low resolution and the effort doesn&#39;t seem worth it. In any case, as george has pointed out, anything past 2 days is a formatted date. I just have not gotten around to porting his php to javascript, which I plan to do."
        }
      ]
    },
    {
      "tags": [
        "feature-request",
        "status-completed",
        "api-v2",
        "documentation"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 3065,
          "accepted": true,
          "answer_comments_url": "/answers/3065/comments",
          "question_id": 3021,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1328224500,
          "last_activity_date": 1328224500,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "integer and decimal are used to describe fields in return types but not in method parameters",
          "body": "<p>All numbers sent to the API as parameters are whole integers, this is made explicit in the <a href=\"http://api.stackexchange.com/docs/numbers\">Numbers documentation page</a> now.</p>\n\n<p>It has always been explicit in terms of parameter validation in the console, but it's now spelled out (along with bit sizes, which were not available before).</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 3065,
      "favorite_count": 0,
      "question_timeline_url": "/questions/3021/timeline",
      "question_comments_url": "/questions/3021/comments",
      "question_answers_url": "/questions/3021/answers",
      "question_id": 3021,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1327794948,
      "last_edit_date": 1328224375,
      "last_activity_date": 1328224500,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 23,
      "score": 2,
      "community_owned": false,
      "title": "integer and decimal are used to describe fields in return types but not in method parameters",
      "body": "<p>Integer and Decimal designations are useful in creating an accurate model of API methods and types.</p>\n\n<p>These specific 'number' subtypes are used when describing types but the method parameter lists all use the more generic 'number' type.</p>\n\n<p>It would be helpful if the method parameters which are numeric were more specifically typed.</p>\n",
      "comments": [
        {
          "comment_id": 7315,
          "creation_date": 1327812549,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 3021,
          "post_type": "question",
          "score": 1,
          "body": "Hey - great to see you! I haven&#39;t seen you in a while!"
        },
        {
          "comment_id": 7378,
          "creation_date": 1328474963,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 3021,
          "post_type": "question",
          "score": 1,
          "body": "@geo - been busy the last couple years making money writing json api stacks. i won&#39;t be nearly as noisy as last time but there is a v2 release in the works based on the work i have done these past couple years."
        },
        {
          "comment_id": 7379,
          "creation_date": 1328475093,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 3021,
          "post_type": "question",
          "score": 1,
          "body": "Cool. Well, it&#39;s great to have you back here for the v2.0 release."
        }
      ]
    },
    {
      "tags": [
        "feature-request",
        "status-deferred"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1627,
          "accepted": false,
          "answer_comments_url": "/answers/1627/comments",
          "question_id": 1621,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1285260489,
          "last_activity_date": 1285260489,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Please add tags to answers",
          "body": "<p>Hmmm... this is an interesting problem.</p>\n\n<p>Just going off of usage statistics, nearly everybody is grabbing answers as part of <code>/questions/{id}</code> or <code>/questions</code>.  This strongly suggests that what use of <code>*/answers</code> there is, is largely independent of corresponding question (if I had to guess, I'd say its generally user analytics of some sort).</p>\n\n<p>However, one of the points of <code>*/answers</code> is to allow for an optimization in which you skip the corresponding <code>*/questions</code> call.  Obviously this doesn't work if you want to keep tags in sync.</p>\n\n<p>This is very much \"on the margin,\" ultimately.  If better response filtering schemes pan out in a subsequent API version, this will probably be done; if not it probably won't.</p>\n\n<p>In other words, I'd say returning <code>tags</code> on an answer is a waste of bandwidth in the common case but there's a sufficiently valid use case such that an optional return has merit.  I'm putting this on the \"re-evaluate at a later date\" list.</p>\n",
          "comments": [
            {
              "comment_id": 4331,
              "creation_date": 1285261462,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1627,
              "post_type": "answer",
              "score": 0,
              "body": "Consider that I am interactively scrutinizing a particular user and I want to examine their answers. The only vector for user specific answers is /users/id/answers which contains a question stub giving me the context I need to determine if I am interested in pulling the question.. with the exception of the tags. While analytics would be a valid use case, I have a real world case of interactive browsing and the inclusion of tags in the stub would economize the case of browsing a user&#39;s answers."
            },
            {
              "comment_id": 4332,
              "creation_date": 1285261585,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1627,
              "post_type": "answer",
              "score": 1,
              "body": "So, in this case, which will become more common i am sure, the inclusion of a few more bytes in the question stub compared to servicing additional request on /questions would result in significantly  less bandwith overall."
            },
            {
              "comment_id": 6641,
              "creation_date": 1321345985,
              "owner": {
                "user_id": 6559,
                "user_type": "registered",
                "display_name": "Idan Gazit",
                "reputation": 103,
                "email_hash": "f99bacd583cb456b112b2200a6462857"
              },
              "post_id": 1627,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "I&#39;d like to make a stronger case for including tags for each answer. Anybody attempting to do user analytics (as you&#39;ve correctly divined) then has to perform N vectorized calls to /questions/ids, which is bounded by URL length, not number of IDs—an incredibly brittle solution that wastes a ton of API calls and bandwidth just to get a short list of tags.\n\nIOW, providing tags (even as an optional return) is a valuable bit of information about an answer, and punches above its weight in terms of bandwidth &amp; API request savings. Please reconsider and add this feature!"
            }
          ]
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1621/timeline",
      "question_comments_url": "/questions/1621/comments",
      "question_answers_url": "/questions/1621/answers",
      "question_id": 1621,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1285188479,
      "last_edit_date": 1321377967,
      "last_activity_date": 1321377967,
      "up_vote_count": 4,
      "down_vote_count": 1,
      "view_count": 129,
      "score": 3,
      "community_owned": false,
      "title": "Please add tags to answers",
      "body": "<p>When querying any API method which returns answers (<code>/users/ids/answers</code>, <code>/answers/ids</code>, etc.) the result does not include the tag information for the related question.</p>\n\n<p>The API does not support filtering answers by tag, but querying for a user's answers is a relatively inexpensive operation for all but the most prolific users. These can subsequently be filtered/sorted without need for additional API calls if the tag data were included for each answer result.</p>\n\n<p>I feel this would add great value to the data without needing to pull all the questions.</p>\n",
      "comments": [
        {
          "comment_id": 4322,
          "creation_date": 1285222884,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1621,
          "post_type": "question",
          "score": 0,
          "body": "no one else thinks this would be of value? interesting...."
        },
        {
          "comment_id": 4327,
          "creation_date": 1285254671,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1621,
          "post_type": "question",
          "score": 1,
          "body": "hmmm... <i>someone</i> doesn&#39;t like the idea. too bad they didn&#39;t care to share the reason. i would be interested in knowing this."
        }
      ]
    },
    {
      "tags": [
        "app",
        "dev-tool"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 6,
      "question_timeline_url": "/questions/603/timeline",
      "question_comments_url": "/questions/603/comments",
      "question_answers_url": "/questions/603/answers",
      "question_id": 603,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1275964939,
      "last_edit_date": 1297487681,
      "last_activity_date": 1297487681,
      "up_vote_count": 15,
      "down_vote_count": 1,
      "view_count": 1255,
      "score": 14,
      "community_owned": false,
      "title": "SOAPI-EXPLORE: Self-updating single page JavaSript API test harness",
      "body": "<!-- thumbnail: http://i.stack.imgur.com/sweoh.png -->\n\n<h2>SOAPI-EXPLORE</h2>\n\n<hr>\n\n<p><sub>this post was one of the two that were listed regarding SOAPI.</sub></p>\n\n<p><sub>For a full overview of the SOAPI eco-system see <a href=\"http://stackapps.com/questions/1352/what-is-soapi-and-why-should-i-care\">What is SOAPI and why should I care?</a></sub></p>\n\n<p><sub>For a more robust API discovery tool hosted in Silverlight see <a href=\"http://stackapps.com/questions/1377/soapi-explore-silverlight-the-entire-api-at-your-command\">Soapi.Explore (silverlight)</a></sub></p>\n\n<hr>\n\n<p><img src=\"http://soapi.info/images/soapi-explore-beta.png\" alt=\"alt text\"></p>\n\n<p><a href=\"http://soapi.info/Code/JS/Stable/soapi-explore-beta.htm\"><strong>SOAPI-EXPLORE</strong></a> is a single page JavaScript application that downloads the <a href=\"http://soapi.info/rest/api?format=json\">latest API spec</a> and dynamically generates a test harness for each route. </p>\n\n<p>All parameters are documented, and as much as is practical, are validated and/or assisted with appropriate input elements.</p>\n\n<p><a href=\"http://soapi.info/Code/JS/Stable/soapi-explore-beta.htm\"><strong>SOAPI-EXPLORE</strong></a> is always up-to-date and in sync with the API.</p>\n\n<h2>DOWNLOAD</h2>\n\n<p>Right-click <a href=\"http://soapi.info/Code/JS/Stable/soapi-explore-beta.htm\"><strong>SOAPI-EXPLORE</strong></a>, select 'save target as...'. All done.</p>\n\n<h2>LICENSE</h2>\n\n<p><a href=\"http://soapi.info/Code/JS/Stable/soapi-explore-beta.htm\"><strong>SOAPI-EXPLORE</strong></a> is powered by <a href=\"http://stackapps.com/questions/534/soapi-watch-a-realtime-service-that-notifies-subscribers-via-email-twitter-etc\">SOAPI-WATCH</a> and is similarly licensed under GPL v2 and MIT licenses.</p>\n\n<h2>CONTACT</h2>\n\n<p>Comments, suggestions, complaints, praise and adulation can be registered here or via email to SOAPIWATCH@skysanders.net.</p>\n\n<p>Keep an eye on <a href=\"http://soapi.info/\">http://soapi.info/</a> for all things SOAPI. ;-)</p>\n",
      "comments": [
        {
          "comment_id": 1059,
          "creation_date": 1275989412,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 603,
          "post_type": "question",
          "score": 0,
          "body": "You should break this post out into two separate ones, one for the [app] and one for the [library]."
        },
        {
          "comment_id": 1101,
          "creation_date": 1276073036,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "post_id": 603,
          "post_type": "question",
          "score": 0,
          "body": "+1 nice implementation."
        },
        {
          "comment_id": 1380,
          "creation_date": 1276585296,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 603,
          "post_type": "question",
          "score": 0,
          "body": "Thanks for creating the QUnit tests - it helped me discover that my app was not the problem - but rather the trouble was with the API server."
        },
        {
          "comment_id": 9746,
          "creation_date": 1356355844,
          "owner": {
            "user_id": 7653,
            "user_type": "registered",
            "display_name": "Brock Adams",
            "reputation": 559,
            "email_hash": "08ad3e87a75ff0936395b59325d8b151"
          },
          "post_id": 603,
          "post_type": "question",
          "score": 1,
          "body": "All the links to <code>soapi.info</code> are dead and the site has no DNS entry."
        },
        {
          "comment_id": 9864,
          "creation_date": 1360237730,
          "owner": {
            "user_id": 17391,
            "user_type": "registered",
            "display_name": "11684",
            "reputation": 111,
            "email_hash": "7c09991a02e7ffa559c69d159231b07a"
          },
          "post_id": 603,
          "post_type": "question",
          "score": 1,
          "body": "&#39;Google Chrome can&#39;t find soapi.info&#39;..."
        }
      ]
    },
    {
      "tags": [
        "app",
        "users",
        "soapi.js",
        "soapi.cs"
      ],
      "answer_count": 7,
      "answers": [
        {
          "answer_id": 1574,
          "accepted": false,
          "answer_comments_url": "/answers/1574/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1284494749,
          "last_edit_date": 1284981128,
          "last_activity_date": 1284981128,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h2><a href=\"http://stackusers.com/Users/Query\" rel=\"nofollow\">Querying Stack Exchange Users</a></h2>\n\n<p><img src=\"http://i.stack.imgur.com/vFjI4.png\" alt=\"alt text\"></p>\n\n<p>You may leverage the Filtering and Sorting capabilities of the Ajax grid to shape results based upon the entire Stack Exchange user base.</p>\n\n<p>You may export the contents of the current grid page to CSV.</p>\n",
          "comments": [
            {
              "comment_id": 4261,
              "creation_date": 1284758562,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1574,
              "post_type": "answer",
              "score": 0,
              "body": "Just got a chance to try this... very flexible. +1"
            }
          ]
        },
        {
          "answer_id": 1575,
          "accepted": false,
          "answer_comments_url": "/answers/1575/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1284494867,
          "last_edit_date": 1284981048,
          "last_activity_date": 1284981048,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h2><a href=\"http://stackusers.com/Users/Find\" rel=\"nofollow\">Find Stack Exchange Users By UserName OR Email</a></h2>\n\n<p><img src=\"http://i.stack.imgur.com/pzelv.png\" alt=\"alt text\"></p>\n\n<p>You may <a href=\"http://stackusers.com/Users/Find\" rel=\"nofollow\">find any user</a> in the Stackiverse by the email address they supply when registering on any Stack Exchange site or by full or partial user name (display_name).</p>\n\n<p><strike></p>\n\n<h3>JSON API</h3>\n\n<pre><code>{\n    \"email_address\": \"foo@bar.com\",  // yes - this is a real account\n    \"items\": [{\n        \"site_url\": \"http://stackoverflow.com/\",\n        \"user_id\": 370536,\n        \"association_id\": \"00000000-0000-0000-0000-000000000000\"\n    }]\n}\n</code></pre>\n\n<p>Programmatic access to this data <strong><em>may</em></strong> be granted by IP address. Please email <a href=\"http://mailto%3asupport@stackusers.com\" rel=\"nofollow\">support@stackusers.com</a> with a brief explaination of the intended usage and expected traffic pattern.</p>\n\n<p>Once you are authorized, you may access this data via <code>/users/email/foo@bar.com</code>\n</strike></p>\n\n<p><strong>This endpoint will be discontinued shortly. Please see the announcement of the</strong> <a href=\"#1613\" rel=\"nofollow\"><strong>StackUsers JSON API</strong></a></p>\n",
          "comments": [
            {
              "comment_id": 4200,
              "creation_date": 1284529263,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1575,
              "post_type": "answer",
              "score": 1,
              "body": "+1 this is the most useful feature to me."
            },
            {
              "comment_id": 4282,
              "creation_date": 1284916080,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1575,
              "post_type": "answer",
              "score": 0,
              "body": "I&#39;m now using this in the global StackImage wizard. (There&#39;s a link to it at the bottom of <a href=\"http://stackimage.quickmediasolutions.com\" rel=\"nofollow\">this</a> page.)"
            },
            {
              "comment_id": 4284,
              "creation_date": 1284924857,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1575,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - glad you find it useful. your wizards are smooth."
            },
            {
              "comment_id": 5136,
              "creation_date": 1297465965,
              "owner": {
                "user_id": 5211,
                "user_type": "registered",
                "display_name": "wilhil",
                "reputation": 101,
                "email_hash": "8e40b955ba72299d98374726cdc1573d"
              },
              "post_id": 1575,
              "post_type": "answer",
              "score": 0,
              "body": "As good as it is, I use my Gmail account to log on to this site, but it isn&#39;t public... how/why does it link to my account?  Is the login email address public some how?"
            }
          ]
        },
        {
          "answer_id": 1577,
          "accepted": false,
          "answer_comments_url": "/answers/1577/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1284496024,
          "last_edit_date": 1284502338,
          "last_activity_date": 1284502338,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<p>Just wanted to ask / mention a few things and I thought an answer would be more appropriate:</p>\n\n<ul>\n<li><strong>In regards to an API</strong>: I understand your concern about bandwidth. Would you be willing to do what the SO team did and offer a private beta while you work out a key/throttle method?</li>\n<li><strong>In regards to hosting</strong>: how will that work? Are you basically just giving registered users XX MB for JavaScript hosting or what? Could StackCenter be moved there if I removed the PHP code?</li>\n<li><strong>Regarding apps</strong>: I saw that somewhere... is there some kind of app system you're setting up?</li>\n</ul>\n\n<p><sub>Answering questions like this in comments is silly. We can carry on a conversation here...</sub></p>\n\n<p>[sky]: </p>\n\n<p>r.e. Bandwidth: the usage itself is certainly a concern, but the salient concern is DOS, whether it be a hard shutdown via abuse or an administrative shutdown triggered by hogging the resources of the shared host. I will spend a few hours, soon, coming up with a secure method of providing access to certain data.</p>\n\n<p>Currently I provide access to <code>users/email/{address}</code> on a per-IP authorized basis. Please see <a href=\"#1575\" rel=\"nofollow\">this post</a> for more details.</p>\n\n<p>r.e. Hosting: I intend to provide an environment that will support direct access to the datastore via Ajax (same domain, I do not have the resources to expose JSONP to external consumers) as well as server hosted scripting languages (and perhaps even c# using a sandboxed mono compiler I built last year) for saving state for your javascript apps. The server code will be limited and not suitable for developing apps, only for specifying connector endpoints for the browser based javascript/flash/silverlight etc.</p>\n\n<p>[George]<br>\nFlash won't be a problem because it supports cross-domain policy files.</p>\n\n<p>As for the API, no hurry :)</p>\n",
          "comments": [
            {
              "comment_id": 4194,
              "creation_date": 1284501185,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "Well flash won&#39;t be a problem because it supports cross-domain policy files."
            },
            {
              "comment_id": 4195,
              "creation_date": 1284501234,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "Oops. I&#39;ll add that to the answer :)"
            },
            {
              "comment_id": 4196,
              "creation_date": 1284502399,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - i am not emplacing xdomain access files yet. api access is per ip address only, limiting the usefulness of a javascript client."
            },
            {
              "comment_id": 4197,
              "creation_date": 1284522426,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky: Speaking of which... did you get my request email? Just want to make sure you got it - no hurry."
            },
            {
              "comment_id": 4201,
              "creation_date": 1284529295,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "Never mind. Thanks!"
            },
            {
              "comment_id": 4292,
              "creation_date": 1284980194,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - see <a href=\"http://stackapps.com/questions/1573/foo/1613#1613\">stackapps.com/questions/1573/foo/1613#1613</a> - the /users/email route will be discontinued soon."
            },
            {
              "comment_id": 4297,
              "creation_date": 1285009800,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1577,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky: I&#39;ll update my page soon."
            }
          ]
        },
        {
          "answer_id": 1613,
          "accepted": false,
          "answer_comments_url": "/answers/1613/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1284980128,
          "last_edit_date": 1288851547,
          "last_activity_date": 1288851547,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h1>JSON API</h1>\n\n<hr>\n\n<h3>Note:</h3>\n\n<p>I am just one developer and I do not have the time/money/resources to maintain an industrial grade public data source. If it is determined for <em>any reason</em> that you are not using the API in the capacity and terms indicated, your IP <strong>will</strong> be banned with a quickness.</p>\n\n<p>I will shortly implement a <em>private</em> key system. Those interested in using the API now should monitor this post for the announcement of the process to get a key. There will be a 1 week grace period once the key system is in place for you to get a key. After which non-keyed requests will be denied and abusive IPs will be banned.</p>\n\n<p>When and if a need for more resources and a way to finance it presents itself this policy will be reconsidered.</p>\n\n<p>If you would like to help mitigate hosting costs and possibly upgrade the hosting plan for faster response and perhaps a more open API, means to do so at no cost present themselves to you on every page of the site. ;-)</p>\n\n<hr>\n\n<p><strong>User Search</strong></p>\n\n<pre>\n   http://stackusers.com/1.0/users/{term}/search\n</pre>\n\n<p>Where <code>term</code> is an email address or a full or partial display name.</p>\n\n<p>Example: </p>\n\n<p><a href=\"http://stackusers.com/1.0/users/foo@bar.com/search\" rel=\"nofollow\">http://stackusers.com/1.0/users/foo@bar.com/search</a></p>\n\n<p>Results:</p>\n\n<pre><code>{\n    \"term\": \"foo@bar.com\",\n    \"items\": [{\n        \"site_url\": \"http://stackoverflow.com/\",\n        \"site_name\": \"Stack Overflow\",\n        \"endpoint\": \"http://api.stackoverflow.com/\",\n        \"user_id\": 370536,\n        \"association_id\": \"00000000-0000-0000-0000-000000000000\",\n        \"email_hash\": \"f3ada405ce890b6f8204094deb12d8a8\",\n        \"display_name\": \"Cale Gibbard\",\n        \"reputation\": 111\n    }]\n}\n</code></pre>\n\n<p>Results are limited to the first 50 matches. There is no paging. If you cannot find what you are looking for in 50 responses, be more specific.</p>\n\n<p><strong>How It Works:</strong></p>\n\n<p>If the incoming term is an email address, all of the users with either matching <code>email_hash</code> or <code>association_id</code> are returned. This will catch the case of a user that registers on multiple sites with different email addresses. (not sure if this is a valid case, i would have to check with jeff but it is covered anyway)</p>\n\n<p>If the incoming term is not an email address, a simple <code>if(DisplayName.Contains(term))</code> is performed.</p>\n\n<p><strong>TERMS:</strong></p>\n\n<p>This route is provided as a service to developers of applications and websites that would like to streamline the user lookup/identification process.</p>\n\n<p>Again, this route is meant to be used for interactive processes as a means for your application to identify a user in response to an interaction with your end user. </p>\n\n<p>You are encouraged to persist the results of a successful match.</p>\n\n<p>You should not treat this, or any StackUsers endpoint, as a bulk data store. You may build your own data store from the Stack Exchange API.</p>\n\n<p>If you have <em>any</em> questions about these terms please email support@stackusers.com.</p>\n",
          "comments": [
            {
              "comment_id": 4302,
              "creation_date": 1285104628,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1613,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "Thanks for letting me know about the move. I fixed StackImage and it&#39;s using the new URL now. Keep up the good work!"
            }
          ]
        },
        {
          "answer_id": 1618,
          "accepted": false,
          "answer_comments_url": "/answers/1618/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1285121328,
          "last_edit_date": 1285124960,
          "last_activity_date": 1285124960,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h2>CSV output</h2>\n\n<p><img src=\"http://i.stack.imgur.com/rnqsH.png\" alt=\"alt text\"></p>\n\n<p>Any grid on StackUsers provides an <code>Export CSV to Clipboard</code> button that will copy the data from the current grid view. This includes all user fields, not limited to those shown in the grid.</p>\n\n<p>The output is standard CSV and can be opened or consumed by any tabular data editor.</p>\n\n<p>Anonymous StackUsers can page 50 rows, while registered users are provided larger datasets.</p>\n\n<p>If you have registered and would like a record count increase to satisfy a particular usage requirement, just email me @ support@stackusers.com.</p>\n\n<h2>Implementation</h2>\n\n<p>For those interested in converting a homogeneous array of JavaScript objects to CSV, here is the code that I use on StackUsers.</p>\n\n<p>It is freely offered without restriction.</p>\n\n<p><strong>jsonToCSV</strong></p>\n\n<pre><code>function jsonToCSV(sourceRows, omitHeader, fieldsToIgnore)\n{\n\n    /// &lt;summary&gt;\n    /// Converts an array of JSON objects to CSV.\n    ///&lt;/summary&gt;\n    /// &lt;param name=\"sourceRows\" type=\"Object[]\"&gt;\n    /// An array of objects containing a single level of scalar fields.\n    /// e.g. [{ foo: \"bar\", fu: true }, { foo: \"baarbar\", fu: false }]\n    /// \n    /// The first element in the array will define the header row.\n    /// &lt;/param&gt;\n    /// &lt;param name=\"omitHeader\" type=\"Boolean\" optional=\"true\"&gt;if true, header row is not emitted&lt;/param&gt;\n    /// &lt;param name=\"fieldsToIgnore\" type=\"Map\" optional=\"true\"&gt;a map of fields to ignore e.g. { field1:1,field4:1 }&lt;/param&gt;\n\n    /// &lt;returns type=\"String\"&gt;&lt;/returns&gt;\n    /// &lt;author name=\"sky sanders\" contact=\"http://skysanders.net/subtext\" date=\"2010-09-19\"/&gt;\n\n    function quote(value)\n    {\n        return '\"' + value.replace(/\"/g, '\"\"').replace(/\\r/g, \"\\\\r\").replace(/\\n/g, \"\\\\b\") + '\"';\n    };\n    function pad(n)\n    {\n        return n &lt; 10 ? '0' + n : n;\n    };\n\n    var header = \"\";\n    var rows = \"\";\n    var headerComplete = false;\n\n    for (var i = 0; i &lt; sourceRows.length; i++)\n    {\n        var firstElement = true;\n        var row = \"\";\n        for (var key in sourceRows[i])\n        {\n            if (sourceRows[i].hasOwnProperty(key))\n            {\n                if (fieldsToIgnore &amp;&amp; (key in fieldsToIgnore))\n                {\n                    continue;\n                }\n\n                if (!headerComplete)\n                {\n                    if (!firstElement)\n                    {\n                        header = header.concat(\", \");\n                    };\n                    header = header.concat(key);\n                };\n\n                if (!firstElement)\n                {\n                    row = row.concat(\", \");\n                };\n\n                var value = sourceRows[i][key];\n\n                if (typeof value != 'undefined' &amp;&amp; value !== null)\n                {\n                    if (value instanceof Date)\n                    {\n                        var dateResult = value.getUTCFullYear() + '-'\n                                + pad(value.getUTCMonth() + 1) + '-'\n                                + pad(value.getUTCDate()) + 'T'\n                                + pad(value.getUTCHours()) + ':'\n                                + pad(value.getUTCMinutes()) + ':'\n                                + pad(value.getUTCSeconds()) + 'Z';\n                        row = row.concat(dateResult);\n                    }\n                    else if ((value instanceof Boolean) || !isNaN(value))\n                    {\n                        row = row.concat(value.valueOf());\n                    }\n                    else\n                    {\n                        row = row.concat(quote(value.valueOf()));\n                    }\n                }\n                firstElement = false;\n            }\n        }\n        rows = rows.concat(row).concat(\"\\r\\n\");\n        headerComplete = true;\n    }\n    return omitHeader ? rows : header.concat(\"\\r\\n\").concat(rows);\n};\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1619,
          "accepted": false,
          "answer_comments_url": "/answers/1619/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1285122803,
          "last_edit_date": 1285123389,
          "last_activity_date": 1285123389,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h2>Client-side Live Updates</h2>\n\n<hr>\n\n<p>With 370,000 rows of user data to maintain, it is an impossible task to keep every record updated up to the minute.</p>\n\n<p>To mitigate relatively stale data on volatile fields such as <code>last_access_date</code>, \nStackUsers offers optional client-side updates of results using Soapi.JS2.</p>\n\n<p>You must opt in by either clicking the <code>Enable Live Update</code> button or ticking the appropriate check box in your account info page.</p>\n\n<h2>How it works</h2>\n\n<p>When Live Updates are enabled, as data is fetched for the grid, it is preprocessed and fresh data is pulled from the api by your browser using Soapi.JS2.</p>\n\n<p>Differences are indexed and the dataset is presented in the grid.</p>\n\n<p>Both datasets are available for viewing and fields that have changed are indicated by a visual cue.  </p>\n\n<p>A mouseover tooltip will present the previous and current values.</p>\n\n<p>You may toggle the datasets, as shown below, by clicking the <code>Show Live Data</code> button.</p>\n\n<p>CSV export is aware and will produce data for the current grid view.</p>\n\n<p><strong>NOTE:</strong> Sorting is server-side and is not aware of the client side live updates (yet?) so if the <code>Show Live Data</code> mode is active it is the underlying dataset that is being sorted and the visible results may not appear to be sorted. Just an FYI.</p>\n\n<hr>\n\n<p><strong>From Database</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/w05BW.png\"/></p>\n\n<p><strong>With Live Updates</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/5KNha.png\"/></p>\n\n<p><strong>Convenient Tooltips</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/U46x1.png\" alt=\"alt text\"></p>\n\n<h2>Details</h2>\n\n<p>You may monitor all requests issued by Soapi.JS2 by opening the StackUsers Client Log window.</p>\n\n<p>All requests are batched to make the client side processing economical and fast.</p>\n\n<p>The dot next to the Soapi icon acts as a visual cue as to the current state of client side processing.</p>\n\n<p>All site data and site icons are cached and served from StackUsers to mitigate load on the API server(s?) as well as reducing rate-limit consumption.</p>\n\n<p><img src=\"http://i.stack.imgur.com/lIE0J.png\" alt=\"alt text\"></p>\n",
          "comments": [
            {
              "comment_id": 4308,
              "creation_date": 1285140098,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1619,
              "post_type": "answer",
              "score": 1,
              "body": "Wow, freakin impressive: you are covering enormous ground of messy real world issues here, with noticeable attention to detail and pretty high usability already! Did I already mention that&#39;s freakin impressive?"
            },
            {
              "comment_id": 4313,
              "creation_date": 1285166149,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1619,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@steffen - thank you. thank you very much. it is nice to know that the  work is appreciated."
            }
          ]
        },
        {
          "answer_id": 1620,
          "accepted": false,
          "answer_comments_url": "/answers/1620/comments",
          "question_id": 1573,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1285124040,
          "last_activity_date": 1285124040,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
          "body": "<h2>Drill-Down</h2>\n\n<hr>\n\n<p>An evolving feature of the StackApps platform is drill down on any user.  The utility and polish of the features are somewhat affected by the fact that I am cutting my teeth on the completely different, and refreshing, paradigm that MVC presents. So bear with me. And email me suggestions as to what you would like to see.</p>\n\n<h2>Current features</h2>\n\n<p><strong>Standard link out to profile page</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/fI2Jr.png\" alt=\"alt text\"></p>\n\n<hr>\n\n<p><strong>Visual online status indicators</strong></p>\n\n<p>When backed with live update you will be able to see up-to-the-second <code>last_access_date</code>.\n<img src=\"http://i.stack.imgur.com/nDEdp.png\" alt=\"alt text\"></p>\n\n<hr>\n\n<p><strong>Aggregated User Info PopOut</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/PMyhf.png\" alt=\"alt text\"></p>\n\n<p>This feature needs a better head for design than mine and input from you as to what kind of data points would be interesting.</p>\n\n<p>It seems that efficient use of space, which I am obviously not adept, is the key to success here.</p>\n\n<p>If you would like to get involved, open Photoshop, Gimp or notepad and mock up some ideas.  Your input is actively solicited.</p>\n\n<p>Email requests, suggestions, rough sketched, full blown professionally designed royalty free designs and money to support@stackusers.com ;-)</p>\n\n<p>The about page 'thank you' list needs some entries.</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 11,
      "question_timeline_url": "/questions/1573/timeline",
      "question_comments_url": "/questions/1573/comments",
      "question_answers_url": "/questions/1573/answers",
      "question_id": 1573,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284456144,
      "last_edit_date": 1297462651,
      "last_activity_date": 1297462651,
      "up_vote_count": 19,
      "down_vote_count": 0,
      "view_count": 1819,
      "score": 19,
      "community_owned": false,
      "title": "StackUsers.com - everything you ever wanted to know but were afraid to ask. (about an SE user. almost.)",
      "body": "<!-- thumbnail: http://i.stack.imgur.com/lvZfe.png -->\n\n<p><img src=\"http://i.stack.imgur.com/LrHJh.png\" alt=\"alt text\"></p>\n\n<h2>About</h2>\n\n<h3><a href=\"http://stackusers.com\">http://stackusers.com</a></h3>\n\n<p>All Stack Exchange users at your fingertips.  </p>\n\n<p>The core of this application is a robust data acquisition and maintenance platform based on <a href=\"http://stackapps.com/questions/386\">Soapi.CS</a> that reliably and economically maintains a full user info data set.</p>\n\n<h3>Features</h3>\n\n<p>Current features include:</p>\n\n<ul>\n<li>Find Stack Exchange Users By UserName OR Email</li>\n<li>Query Stack Exchange users via Filtered Sortable grid and/or Entity SQL statement</li>\n<li>CSV to Clipboard export</li>\n<li>Drill down functionality on any user</li>\n<li>Optional client side live update via Soapi.JS</li>\n<li><a href=\"http://stackapps.com/questions/1578/sorep-v2-ranked-flair-take-2\">Generate Ranked and Aggregated Custom Flair</a></li>\n<li>JSON API </li>\n<li><em>your idea here...</em></li>\n</ul>\n\n<h3>What's Next?</h3>\n\n<p><em>It is up to you!</em></p>\n\n<ul>\n<li>Your feature requests are welcomed.</li>\n<li>A planned feature, for registered users, is local hosting of JavaScript, both server and client side, that can access the underlying dataset maintained by Soapi and present it in any way you choose.</li>\n</ul>\n\n<h3>Cost</h3>\n\n<p>Free for everyone. <strong>Always</strong>. </p>\n\n<p>If you would like to help mitigate hosting costs and possibly upgrade the hosting plan for faster response and perhaps a more open API, means to do so at no cost present themselves to you on every page of the site. ;-)</p>\n\n<h3>Platform</h3>\n\n<p>Browser Based</p>\n\n<h2>Contact</h2>\n\n<p>Sky Sanders</p>\n\n<h2>Code</h2>\n\n<p>Stack Users is the first application deployed upon a robust server side background processing engine creating using the <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a>/<a href=\"http://stackapps.com/questions/1433/soapi-js2-a-fully-relational-javascript-client-library-for-the-stack-exchange-a\">Soapi.JS2</a> client libraries.</p>\n\n<p><strong>NOTE</strong>: This site is me learning MVC2 as you watch, while breaking in a new web/data host <em>and</em> dog-fooding Soapi all at the same time. Expect the unexpected ;-)</p>\n",
      "comments": [
        {
          "comment_id": 4173,
          "creation_date": 1284461298,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 1,
          "body": "@Sky that&#39;s a huge project"
        },
        {
          "comment_id": 4174,
          "creation_date": 1284466330,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Wow. I likes. +1. Small I18 note - any chance the dates could be formatted YYYY-MM-DD? Makes it easier for those of us outside the US to write dates where the M and D are &lt; 12"
        },
        {
          "comment_id": 4175,
          "creation_date": 1284477038,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 1,
          "body": "Usage note: To filter on a site use Contains and a unique portion of the site name. To exclude a site you need to specify the full URL <i>including a trailing slash</i>: <code>http:&#47;&#47;example.com&#47;</code>."
        },
        {
          "comment_id": 4176,
          "creation_date": 1284477218,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "+1 Very nice. Can you do a stable sort so we can do sub-sorts?"
        },
        {
          "comment_id": 4177,
          "creation_date": 1284480621,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@dennis - yes - i am right now stepping through the client side JS so that I can let base on an entity sql statement. Also - r.e. existing grid filter et al - The grid is just a stock grid I threw on top of the data store - the ui will be customized to the use cases presented by interested users such as your self. I intend to modify the filter popup for the site field to enable things like exluding linked meta etc.  I suppose a wiki or feedback section for each page would be a good idea to collect and make discoverable user feedback.."
        },
        {
          "comment_id": 4178,
          "creation_date": 1284480983,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@dennis - not sure what you mean by stable sort? would sorting on multiple columns be what you mean?"
        },
        {
          "comment_id": 4179,
          "creation_date": 1284484158,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "Would you provide an API so that we can get a user_id based on email?"
        },
        {
          "comment_id": 4180,
          "creation_date": 1284484777,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "I get an error when I try to save my account details."
        },
        {
          "comment_id": 4181,
          "creation_date": 1284485112,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - r.e. api - that is being considered but i first need to decide how to manage many of the same concerns regarding acceptable usage that we have had here. I am just a little guy paying for bandwidth myself so this will have to be considered closely. r.e. error - give me a proper description of the error so that i can respond...."
        },
        {
          "comment_id": 4184,
          "creation_date": 1284486470,
          "owner": {
            "user_id": 1177,
            "user_type": "registered",
            "display_name": "Gelatin",
            "reputation": 534,
            "email_hash": "648c618eba03b8a2d8b47c31ea03710a"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "+1 for the UI ."
        },
        {
          "comment_id": 4185,
          "creation_date": 1284489757,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: Just the generic &quot;Error in / application&quot; error."
        },
        {
          "comment_id": 4188,
          "creation_date": 1284491332,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - not sure the problem - i see valid info and verified email address for you."
        },
        {
          "comment_id": 4189,
          "creation_date": 1284491390,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@dennis check the esql pre-filter in addition to the column sort/filter and see if you can get desired results. let me know."
        },
        {
          "comment_id": 4191,
          "creation_date": 1284493047,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@Sky: Well I&#39;ll try it again. BTW, my website has been down for the last half-hour :P"
        },
        {
          "comment_id": 4192,
          "creation_date": 1284493243,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "It&#39;s saying that the resource &quot;Account/Update&quot; is missing."
        },
        {
          "comment_id": 4193,
          "creation_date": 1284495922,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - it is likely that I was publishing new features and the app got recycled. see the last &#39;NOTE&#39; in the post. caveat emptor."
        },
        {
          "comment_id": 4198,
          "creation_date": 1284525923,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: A stable sort means that when you do a sort on one column then on another the first sort becomes a subsort of the second - so yes it&#39;s similar to/has the same effect as a multicolumn sort."
        },
        {
          "comment_id": 4199,
          "creation_date": 1284528642,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 1,
          "body": "@dennis - i initially had multi-sort enabled, but the latency between the app server and the sql server combined with 360,000 records made it unbearable. The new host eliminates this problem so I re-enabled the multi-sort after your reminder. thanks."
        },
        {
          "comment_id": 4204,
          "creation_date": 1284556388,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - i found a querystring length error in my logs. am sure it is openid callback. what value did you eventually settle on?"
        },
        {
          "comment_id": 4210,
          "creation_date": 1284584089,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: Value? I was just trying to save my account details... but what&#39;s there now is fine."
        },
        {
          "comment_id": 4228,
          "creation_date": 1284622909,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "I just realized that your slogan is almost identical to StackList&#39;s - &quot;All your apps, all the time.&quot;"
        },
        {
          "comment_id": 4229,
          "creation_date": 1284623258,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - did you not have an issue with querystring length when you were getting OpenId working on stacklist? I eventually used 4k. Do you still have an issue? r.e. tag line - are you filing a trademark claim? ;-)"
        },
        {
          "comment_id": 4243,
          "creation_date": 1284661269,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: Don&#39;t worry about the slogan... I just wanted you to know. Yours is fine. I still get the missing file error, yes."
        },
        {
          "comment_id": 4245,
          "creation_date": 1284662947,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - what browser/platform? may need to file a bug with someone upstream. r.e. all xx all the time - i was kidding. do you realize that catch phrase has been in use for decades... all cupcakes, all the time, all hip-hop, all the time, all foo, all the time. you may be getting a trademark infringement notice from all cupcakes, i fear...."
        },
        {
          "comment_id": 4251,
          "creation_date": 1284741379,
          "owner": {
            "user_id": 3085,
            "user_type": "registered",
            "display_name": "makerofthings7",
            "reputation": 275,
            "email_hash": "9cc3e3bb2ff2ef30810be80ca741de70"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@sky - Awesome!  Where did you get that nice grid from?"
        },
        {
          "comment_id": 4252,
          "creation_date": 1284743100,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 3085,
            "user_type": "registered",
            "display_name": "makerofthings7",
            "reputation": 275,
            "email_hash": "9cc3e3bb2ff2ef30810be80ca741de70"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@maker - it is a free open source extension for MVC2 from Telerik - <a href=\"http://www.telerik.com/products/aspnet-mvc.aspx\" rel=\"nofollow\">telerik.com/products/aspnet-mvc.aspx</a>. Saved me many hours of work as well as from my considerably underdeveloped UI skills. I am a coder, not a designer. anyway, glad you like it. more to come."
        },
        {
          "comment_id": 4253,
          "creation_date": 1284743195,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@sys - sorry, did not realize that i hadn&#39;t replied to you: thanks. go big or go home, only way to roll."
        },
        {
          "comment_id": 4260,
          "creation_date": 1284758538,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: Sorry I didn&#39;t get back to you - it wasn&#39;t working on Opera Mini, but it works fine on Chrome. It&#39;s up to you whether you want to fix it or not."
        },
        {
          "comment_id": 4263,
          "creation_date": 1284766115,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@geo - Opera is a pain in the ass, for me,  mini-or-not. it will go on the list of things to do."
        },
        {
          "comment_id": 4264,
          "creation_date": 1284768828,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: No worries."
        },
        {
          "comment_id": 5963,
          "creation_date": 1304661167,
          "owner": {
            "user_id": 3451,
            "user_type": "registered",
            "display_name": "Cawas",
            "reputation": 101,
            "email_hash": "c6768f8be92fe851f2a5502fb9845778"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 0,
          "body": "Does this project still works? I&#39;m curious to see it but couldn&#39;t create a login! :("
        },
        {
          "comment_id": 5994,
          "creation_date": 1305604928,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1573,
          "post_type": "question",
          "score": 5,
          "body": "I can&#39;t get this to work anymore. The home page is 500-ing."
        }
      ]
    },
    {
      "tags": [
        "library",
        ".net",
        "silverlight",
        "windows-phone-7",
        "mono"
      ],
      "answer_count": 11,
      "answers": [
        {
          "answer_id": 416,
          "accepted": false,
          "answer_comments_url": "/answers/416/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1275362256,
          "last_edit_date": 1281688666,
          "last_activity_date": 1281688666,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Soapi Caching and Throttling</h2>\n\n<p><strong>Throttle</strong></p>\n\n<p>All API requests made by Soapi are routed first through Soapi.Net.RequestCache and failing a cache hit, they are then routed through Soapi.Net.RequestThrottle.</p>\n\n<p>The throttle, which is described in detail <a href=\"http://stackapps.com/questions/1322/api-compliant-request-throttle-implementations/1323#1323\">here</a>, works on a sliding window, allowing maximum request rate up to the prescribed limits, currently 30 per 5 seconds, and subsequently blocking requests, in the order received, to maintain the prescribed rate.</p>\n\n<p>An additional measure, that compensates for what seems to be an undocumented rate restriction, once a request passes the rate throttle, it enters the active request queue which limits the number of active requests to a configurable number, currently 10.</p>\n\n<p>Ultimately this means that short bursts of request that are characteristic of an end user discovery or research tool will be serviced as quickly as they are received, improving user experience and long running processes that may involved thousands of requests can be trusted to run reliably to completion as quickly as allowed.</p>\n\n<p>In testing, I have pumped 5000 requests into Soapi as fast as my machine with 50 threads will go and received all responses successfully.</p>\n\n<p><strong>Cache</strong></p>\n\n<p>Implementing the cache proved to be a challenge. My initial attempts were quite naive, simply caching successful results for a specific period of time.</p>\n\n<p>Casual testing showed this to improve performance and reduce API bandwidth usage as expected.</p>\n\n<p>It was when I implemented lazy loading, e.g stub hydration, that the shortcomings of this approach were exposed.</p>\n\n<p>It became clear that many identical request could be pushed into the cache/throttle in immediate succession resulting in multiple identical requests being made simultaneously.</p>\n\n<p>The obvious problem is that each request checks the cache before proceeding and since the initial request has not completed and cached the results for that url, multiple identical request are issued. This is a no-no for several reasons.</p>\n\n<p>Ultimately, the solution is to implement smart cache items that know when they are pending, valid and expired. Thus when the initial request is recieved, an item is placed in the cache with a state of 'pending' until the request completes whereupon the cache item is populated with data and flagged as valid.</p>\n\n<p>Subsequent requests that are received for that url while the request is pending register as 'waiting'. When the original request completes and signals, the waiting requests simply grab the cached data from memory and carry on.</p>\n\n<p>Implementing this was an interesting challenge in thread management, especially when the Silverlight and Windows Phone environments are factored in, but ultimately, the implementation appears successful.</p>\n\n<p><strong>Fault tolerance</strong></p>\n\n<p>When the complimentary services provided by the throttle and cache are combined in a real world scenario, request failures become a big issue.</p>\n\n<p>If a request is pending for a piece of data that 10 other requests are waiting for and it fails, the failure cascades.</p>\n\n<p>Now, if the failure is a hard error, such as might result from bad parameters or repeatable unrecoverable error, all of the requests are going to fail in any case.</p>\n\n<p>But consider transient network problems or the spurious 500 errors that the server throws occasionally. These types of failures are recoverable.</p>\n\n<p>With this in mind, the requests made by Soapi, upon failure simply rest a moment and retry up to a configurable amount of times. Currently 3 is the default retry count.</p>\n\n<p>This capability spans the throttle and the cache providing an impressive degree of reliability and fault tolerance.</p>\n",
          "comments": []
        },
        {
          "answer_id": 690,
          "accepted": false,
          "answer_comments_url": "/answers/690/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276462294,
          "last_edit_date": 1281030463,
          "last_activity_date": 1281030463,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Soapi.CS Full API Coverage</h2>\n\n<pre><code>// instantiate a context\n\nApiContext ctx = new ApiContext(\"qgAq_KfDu0KYzlNG-qaTuw\");\nctx.Initialize().AsyncWaitHandle.WaitOne();\n\n\n// get a site\nSite sofu = ctx.Official.StackOverflow;\n\n// or \n\nSite stackapps = ctx.Sites.First(s=&gt;s.ApiEndpoint == \"http://api.stackapps.com\");\n\n\n---\n\n\n\n// StackAuth Routes\n\n// /sites                          \nctx.Sites.ToList();\n\n// /users/{id}/associated          \nsofu.Users.ById(new Guid(\"d6b99e8e-0f6c-4f68-92d0-6a050feea1fc\")).Associated.ToList();\n\n\n\n\n// /answers/{id}                   \nsofu.Answers.ById(2917525).ToList();\n\n// /answers/{id}/comments          \nsofu.Answers.ById(2907216).Comments.ToList();\n\n\n// /badges                         \nsofu.Badges.ToList();\n\n// /badges/{id}                    \nsofu.Badges.ById(9).ToList();\n\n// /badges/name                    \n\n// /badges/tags                    \nsofu.Badges.Tags.ToList();\n\n\n// /comments/{id}                  \nsofu.Comments(2917319).ToList();\n\n\n// /posts/{id}/comments            \nsofu.PostComments(2912300).ToList();\n\n\n// /questions                      \nsofu.Questions.ToList();\n\n// /questions/{id}                 \nsofu.Questions.ById(2912300).ToList();\n\n// /questions/{id}/answers         \nsofu.Questions.ById(2912300).Answers.ToList();\n\n// /questions/{id}/comments        \nsofu.Questions.ById(2912300).Comments.ToList();\n\n// /questions/{id}/timeline        \nsofu.Questions.ById(2912300).Timeline.ToList();\n\n// /questions/unanswered           \nsofu.Questions.Unanswered.ToList();\n\n// /revisions/{id}                 \nsofu.Revisions.ById(2350874).ToList();\n\n// /revisions/{id}/{revisionguid}  \nsofu.Revisions.ById(2350874).ByRevisionGuid(new Guid(\"d6b99e8e-0f6c-4f68-92d0-6a050feea1fc\")).ToList();\n\n// /search                         \nsofu.Search.InTitle(\"sqlite\").ToList();\n\n// /stats                          \nsofu.Statistics;\n\n// /tags                           \nsofu.Tags.ToList();\n\n// /users                          \nsofu.Users.ToList();\n\n// /users/{id}                     \nsofu.Users.ById(242897).ToList();\n\n// /users/{id}/answers             \nsofu.Users.ById(242897).Answers.ToList();\n\n// /users/{id}/badges              \nsofu.Users.ById(242897).Badges.ToList();\n\n// /users/{id}/comments            \nsofu.Users.ById(242897).Comments.ToList();\n\n// /users/{id}/comments/{toid}     \nsofu.Users.ById(242897).Comments.To(160173).ToList();\n\n// /users/{id}/favorites           \nsofu.Users.ById(242897).Favorites.ToList();\n\n// /users/{id}/mentioned           \nsofu.Users.ById(242897).Mentioned.ToList();\n\n// /users/{id}/questions           \nsofu.Users.ById(242897).Questions.ToList();\n\n// /users/{id}/reputation          \nsofu.Users.ById(242897).Reputation.ToList();\n\n// /users/{id}/tags                \nsofu.Users.ById(242897).Tags.ToList();\n\n// /users/{id}/timeline            \nsofu.Users.ById(242897).Timeline.ToList();\n\n// /users/moderators               \nsofu.Users.Moderators.ToList();\n\n\n\n// from the perspective of a user\n\nsofu.User(242897).Answers.ToList();\nsofu.User(242897).Badges.ToList();\nsofu.User(242897).Comments.ToList();\nsofu.User(242897).CommentsTo(160173).ToList();\nsofu.User(242897).Favorites.ToList();\nsofu.User(242897).Mentioned.ToList();\nsofu.User(242897).Questions.ToList();\nsofu.User(242897).RepChanges.ToList();\nsofu.User(242897).Tags.ToList();\nsofu.User(242897).Timeline.ToList();\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 691,
          "accepted": false,
          "answer_comments_url": "/answers/691/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276462550,
          "last_edit_date": 1281272296,
          "last_activity_date": 1281272296,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Soapi.CS Fluent Configuration</h2>\n\n<pre><code>var ctx = new ApiContext(ApiKey).Options\n    // obviates a call to stackauth\n    .SerializedSites(\"{ 'api_sites': [ {'name': 'Stack....\")\n    // can also be accomplished by seeding the cache\n    .SeedCache(new RequestCacheItem\n        {\n            Uri = new Uri(\"http://stackauth.com/1.0/sites\"),\n            ResponseText = \"{ 'api_sites': [ {'name': 'Stack....\",\n            Expiration = DateTime.Now.AddDays(1)\n        })\n    .UserAgent(\"SOAPI.APP\")\n    // 'stub' objects are fetch individually upon access\n    .LazyLoadingEnabled(true)\n    // all 'stub' objects for a batch are requests as a batch\n    // and pre populated\n    .EagerLoadingEnabled(true) //\n    .Context // fluent terminator\n    .Initialize();\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 694,
          "accepted": false,
          "answer_comments_url": "/answers/694/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276464886,
          "last_edit_date": 1281276301,
          "last_activity_date": 1281276301,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Soapi.CS Paged Results</h2>\n\n<p>Pay particular attention to the third example; thats <strong>all 2800+ stack apps users in less than 5 seconds</strong> without breaking any rules. not too shabby.</p>\n\n<pre><code>// Soapi elegantly handles multi-page requests.\n// Multi-paged requests are issued in parallel making data retrieval quick\n\n// get the default, 1 page of 30 using default sort\n\nvar questions = SO.Questions.ToList();\n// --&gt; 5:05:57 AM    http://api.stackoverflow.com/1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw\n\n// get pages 3-4\n\nvar pages3to4 = SO.Questions.Page(3).PageCount(2).ToList();\n\n// --&gt;5:05:58 AM    http://api.stackoverflow.com/1.0/questions?page=3&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:05:59 AM    http://api.stackoverflow.com/1.0/questions?page=4&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n\n// get all pages of a set\n\nvar stackAppsUsers = CTX.Official.StackApps.Users.PageCount(-1).ToList();\n\n\n// --&gt;5:06:01 AM    http://api.stackapps.com/1.0/users?pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:01 AM    http://api.stackapps.com/1.0/users?page=1&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=2&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=3&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=4&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=5&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=6&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=7&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=8&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=9&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=10&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=11&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=12&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=13&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=14&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=15&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=16&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=17&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:02 AM    http://api.stackapps.com/1.0/users?page=18&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:03 AM    http://api.stackapps.com/1.0/users?page=19&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:03 AM    http://api.stackapps.com/1.0/users?page=20&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:03 AM    http://api.stackapps.com/1.0/users?page=21&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:03 AM    http://api.stackapps.com/1.0/users?page=22&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:04 AM    http://api.stackapps.com/1.0/users?page=23&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:04 AM    http://api.stackapps.com/1.0/users?page=24&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:04 AM    http://api.stackapps.com/1.0/users?page=25&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:04 AM    http://api.stackapps.com/1.0/users?page=26&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:05 AM    http://api.stackapps.com/1.0/users?page=27&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:05 AM    http://api.stackapps.com/1.0/users?page=28&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n// --&gt;5:06:05 AM    http://api.stackapps.com/1.0/users?page=29&amp;pagesize=100&amp;key=qgAq_KfDu0KYzlNG-qaTuw\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 696,
          "accepted": false,
          "answer_comments_url": "/answers/696/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276469748,
          "last_edit_date": 1281271205,
          "last_activity_date": 1281271205,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Asynchronous Requests</h2>\n\n<p>Async requests can be made using the Site's RouteFactory. </p>\n\n<p>A salient use case for this functionality is using Soapi in Silverlight.</p>\n\n<pre><code>[TestMethod, Asynchronous]\npublic void AnswersByIdTestValid()\n{\n\n    // The thing to be aware of is that the IEnumerable, lazyloading\n    // model is synchronous, and since we are on the UI thread here\n    // we need to start with an async request using the site's RouteFactory.\n\n    StackOverflow\n        .RouteFactory\n        .AnswersById(AnswersByIdValidId)\n        .BeginGetResponse(a =&gt;\n        {\n            // we are off the UI thread here so we can use the full power of\n            // Soapi.\n\n            var answers = a.Result.Items;\n\n            var answerersOtherAnswers = answers[0].Owner.Answers.ToList();\n\n            foreach (var otherAnswer in answerersOtherAnswers)\n            {\n                var qTitle = otherAnswer.Question.Title;\n                var aBody = otherAnswer.Body;\n\n            }\n            EnqueueTestComplete();\n        });\n}\n</code></pre>\n\n<p><strong>Requests</strong></p>\n\n<pre>\nhttp://api.stackoverflow.com/clientaccesspolicy.xml\nhttp://api.stackoverflow.com/1.0/answers/2917525?key=qgAq_KfDu0KYzlNG-qaTuw\nhttp://api.stackoverflow.com/1.0/users/242897?key=qgAq_KfDu0KYzlNG-qaTuw\nhttp://api.stackoverflow.com/1.0/users/242897/answers?key=qgAq_KfDu0KYzlNG-qaTuw\nhttp://api.stackoverflow.com/1.0/questions/287903;1890582;1937805;1939446;1988022;2010405;2403263;2952788;2991978;3163678;3261144;3287656;3287957;3298685;3299236;3299480;3299964;3300051;3300386;3301925;3307832;3312226;3312541;3313771;3315860;3326820;3329645;3330028;3333304;3399501?answers=true&body=true&comments=true&key=qgAq_KfDu0KYzlNG-qaTuw\nhttp://api.stackoverflow.com/1.0/users/4333;4639;5309;6068;9382;10039;26160;77775;85040;85606;99256;102937;109676;119396;134430;135731;145682;146857;163728;177333;231821;248616;327528;338195;371434;388364;397880;398084;410007?key=qgAq_KfDu0KYzlNG-qaTuw\n\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 699,
          "accepted": false,
          "answer_comments_url": "/answers/699/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276498480,
          "last_edit_date": 1281272608,
          "last_activity_date": 1281272608,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h2>Building a simple app with Soapi.CS</h2>\n\n<p>Suppose you would like to build a complete dataset containing all of your content and activity for all of your accounts on all Stack Exchange sites.</p>\n\n<p>You would need to:</p>\n\n<ol>\n<li>Get a list of your accounts from stackauth <code>/users/{id}/associated</code></li>\n<li>For each account\n<ol>\n<li>Get all of your questions</li>\n<li>Get all of your answers</li>\n<li>Get all of your reputation events</li>\n<li>Get all of your timeline events</li>\n</ol></li>\n</ol>\n\n<p>The following class does that with Soapi. It uses a separate thread for each site. The throttle and cache are thread-safe.</p>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing Soapi;\nusing Soapi.Domain;\n\nnamespace Samples\n{\n    /// &lt;summary&gt;\n    /// Builds a complete stack exchange dataset of a single user\n    /// &lt;/summary&gt;\n    public class AllMyStuff\n    {\n\n        /// &lt;summary&gt;\n        /// Contains all your data on all sites\n        /// &lt;/summary&gt;\n        public List&lt;UserData&gt; Accounts\n        {\n            get { return _accounts; }\n        }\n\n\n        private const string ApiKey = \"Your Key\";\n        private readonly List&lt;UserData&gt; _accounts;\n        private readonly ApiContext _context;\n\n        /// &lt;summary&gt;\n        /// Provide a reference user from which to get all \n        /// associated accounts.\n        /// &lt;/summary&gt;\n        /// &lt;param name=\"endpoint\"&gt;&lt;/param&gt;\n        /// &lt;param name=\"userId\"&gt;&lt;/param&gt;\n        public AllMyStuff(string endpoint, int userId)\n        {\n            _context = new ApiContext(ApiKey);\n            _context.Options.LazyLoadingEnabled(true);\n            _context.Initialize(false);\n            _accounts = _context.Sites.First(s =&gt; s.ApiEndpoint.StartsWith(endpoint))\n                .User(userId).Associated.Select(u =&gt; new UserData(u)).ToList();\n\n            var initEvent = new AutoResetEvent(false);\n\n            foreach (var item in _accounts)\n            {\n                UserData userData = item;\n                ThreadPool.QueueUserWorkItem(o =&gt;\n                    {\n                        User account = userData.User;\n\n                        userData.Questions = account.Questions\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Answers = account.Answers\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Reputation = account\n                            .RepChanges\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Timeline = account\n                            .Timeline\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Initialized = true;\n\n                        lock (_accounts)\n                            if (_accounts.All(u =&gt; u.Initialized))\n                                initEvent.Set();\n                    });\n            }\n            initEvent.WaitOne();\n        }\n\n\n    }\n\n    public class UserData\n    {\n        public UserData(User user)\n        {\n            User = user;\n            ApiEndpoint = user.Site.ApiEndpoint;\n        }\n\n        public List&lt;Answer&gt; Answers { get; set; }\n        public string ApiEndpoint { get; set; }\n        public bool Initialized { get; set; }\n        public List&lt;Question&gt; Questions { get; set; }\n        public List&lt;RepChange&gt; Reputation { get; set; }\n        public List&lt;UserTimeline&gt; Timeline { get; set; }\n        public User User { get; set; }\n    }\n}\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 704,
          "accepted": false,
          "answer_comments_url": "/answers/704/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276517426,
          "last_edit_date": 1281324616,
          "last_activity_date": 1281324616,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h3>Bulk Data Import</h3>\n\n<p>This is a simple example of using Soapi.CS for bulk data importation. </p>\n\n<p>This sample creates/updates a SQLite database with the the complete profile of all Stack Exchange users with reputation >= 100 and assigns a rank according to order of appearance.</p>\n\n<p>Soapi processes the ~1000 requests required in less than 5 minutes.</p>\n\n<p>You may run this code against the same database and the records are updated in place.</p>\n\n<p>This code requires references to <a href=\"http://sqlite.phxsoftware.com/\" rel=\"nofollow\">System.Data.SQLite</a> and Soapi.dll.</p>\n\n<p>Code very similar to this is the core of the <a href=\"http://stackapps.com/questions/543/sorep-trilogy-site-ranking-for-those-who-need-to-know\">SO-REP</a> service.</p>\n\n<p><strong>Usage:</strong></p>\n\n<pre><code>new SoapiUserIndexer()\n    .Index(\"data source=users.db;new=true\", apikey);\n</code></pre>\n\n<p><strong>Code:</strong></p>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.Data;\nusing System.Data.SQLite;\nusing System.Linq;\nusing Soapi.Domain;\n\nnamespace Soapi.Data\n{\n\n    public class SoapiUserIndexer\n    {\n\n        /// &lt;summary&gt;\n        /// \n        /// Provides you with a local database of all stack exchange users with \n        /// rep &gt;=100, 90,000 records, in less than 5 minutes using Soapi.CS\n        /// \n        /// It is not recommended to decrease the minimum rep value as the numbers\n        /// increase drastically with questionable benefit.\n        /// \n        /// This is the core of the SO-REP Service, which ranks provides \n        /// ranking data.\n        /// \n        /// Requires System.Data.SQLite\n        /// http://sqlite.phxsoftware.com/\n        /// \n        /// &lt;/summary&gt;\n        /// &lt;param name=\"connectionString\"&gt;&lt;/param&gt;\n        /// &lt;param name=\"apiKey\"&gt;&lt;/param&gt;\n        public void Index(string connectionString, string apiKey)\n        {\n            var ctx = new ApiContext(apiKey).Initialize(false);\n\n            var lastModified = DateTime.Now;\n            const int batchSize = 50;\n            const int minRep = 100;\n\n            using (var connection = new SQLiteConnection(connectionString))\n            {\n                connection.Open();\n                var cmd = connection.CreateCommand();\n                cmd.CommandText = CreateUsersTable;\n                cmd.ExecuteNonQuery();\n\n\n                foreach (Site site in ctx.Sites.Where(s =&gt; s.ApiEndpoint.IndexOf(\"stackauth\") == -1))\n                {\n\n                    // get the count of users with Rep &gt;= 100 and div by 100 to get a page count\n                    var pageCount = (int)(Math.Ceiling((double)site.Users.Min(minRep).Total / 100) + 1);\n\n                    var batchCount = Math.Ceiling((double)pageCount / batchSize);\n                    for (int i = 0; i &lt; batchCount; i++)\n                    {\n                        var startPage = i*batchSize + 1;\n                        var rank = (batchCount*i) + 1;\n                        var users = site.Users.PageCount(batchSize).Page(startPage).Min(minRep).ToList();\n\n                        using (var txn = connection.BeginTransaction())\n                        {\n                            cmd = BuildInsertCommand();\n                            cmd.Connection = connection;\n                            foreach (User item in users)\n                            {\n                                cmd.Parameters[\"@ApiEndpoint\"].Value = item.Site.ApiEndpoint;\n                                cmd.Parameters[\"@UserId\"].Value = item.UserId;\n                                cmd.Parameters[\"@AssociationId\"].Value = item.AssociationId;\n                                cmd.Parameters[\"@UserType\"].Value = item.UserType.ToString();\n                                cmd.Parameters[\"@DisplayName\"].Value = item.DisplayName ?? \"\";\n                                cmd.Parameters[\"@AboutMe\"].Value = item.AboutMe ?? \"\";\n                                cmd.Parameters[\"@Location\"].Value = item.Location ?? \"\";\n                                cmd.Parameters[\"@WebsiteUrl\"].Value = item.WebsiteUrl ?? \"\";\n                                cmd.Parameters[\"@EmailHash\"].Value = item.EmailHash ?? \"\";\n                                cmd.Parameters[\"@CreationDate\"].Value = item.CreationDate;\n                                cmd.Parameters[\"@LastAccessDate\"].Value = item.LastAccessDate;\n                                cmd.Parameters[\"@TimedPenaltyDate\"].Value = item.TimedPenaltyDate;\n                                cmd.Parameters[\"@AcceptRate\"].Value = item.AcceptRate;\n                                cmd.Parameters[\"@Age\"].Value = item.Age;\n                                cmd.Parameters[\"@AnswerCount\"].Value = item.AnswerCount;\n                                cmd.Parameters[\"@DownVoteCount\"].Value = item.DownVoteCount;\n                                cmd.Parameters[\"@QuestionCount\"].Value = item.QuestionCount;\n                                cmd.Parameters[\"@Reputation\"].Value = item.Reputation;\n                                cmd.Parameters[\"@UpVoteCount\"].Value = item.UpVoteCount;\n                                cmd.Parameters[\"@ViewCount\"].Value = item.ViewCount;\n                                cmd.Parameters[\"@BadgesGold\"].Value = item.BadgeCounts.Gold;\n                                cmd.Parameters[\"@BadgesSilver\"].Value = item.BadgeCounts.Silver;\n                                cmd.Parameters[\"@BadgesBronze\"].Value = item.BadgeCounts.Bronze;\n                                cmd.Parameters[\"@Rank\"].Value = rank++;\n                                cmd.Parameters[\"@LastModifiedDate\"].Value = lastModified;\n                                cmd.ExecuteNonQuery();\n                            }\n                            txn.Commit();\n                        }\n                    }\n                }\n\n                connection.Close();\n            }\n        }\n\n        private static SQLiteCommand BuildInsertCommand()\n        {\n            var cmd = new SQLiteCommand(SqlUerInsertOrUpdate)\n                {\n                    CommandText = SqlUerInsertOrUpdate\n                };\n\n            foreach (var item in new List&lt;object[]&gt;\n                {\n                    new object[]{\"@ApiEndpoint\", DbType.String,128},\n                    new object[]{\"@UserId\", DbType.Int32},\n                    new object[]{\"@AssociationId\", DbType.Guid},\n                    new object[]{\"@UserType\", DbType.String,20},\n                    new object[]{\"@DisplayName\", DbType.String,50},\n                    new object[]{\"@AboutMe\", DbType.String,4000},\n                    new object[]{\"@Location\", DbType.String,128},\n                    new object[]{\"@WebsiteUrl\", DbType.String,256},\n                    new object[]{\"@EmailHash\", DbType.String,64},\n                    new object[]{\"@CreationDate\", DbType.DateTime},\n                    new object[]{\"@LastAccessDate\", DbType.DateTime},\n                    new object[]{\"@TimedPenaltyDate\", DbType.DateTime},\n                    new object[]{\"@AcceptRate\", DbType.Int32},\n                    new object[]{\"@Age\", DbType.Int32},\n                    new object[]{\"@AnswerCount\", DbType.Int32},\n                    new object[]{\"@DownVoteCount\", DbType.Int32},\n                    new object[]{\"@QuestionCount\", DbType.Int32},\n                    new object[]{\"@Reputation\", DbType.Int32},\n                    new object[]{\"@UpVoteCount\", DbType.Int32},\n                    new object[]{\"@ViewCount\", DbType.Int32},\n                    new object[]{\"@BadgesGold\", DbType.Int32},\n                    new object[]{\"@BadgesSilver\", DbType.Int32},\n                    new object[]{\"@BadgesBronze\", DbType.Int32},\n                    new object[]{\"@Rank\", DbType.Int32},\n                    new object[]{\"@LastModifiedDate\",DbType.DateTime}\n                })\n            {\n                var p = new SQLiteParameter { ParameterName = (string)item[0], DbType = (DbType)item[1] };\n                if (p.DbType == DbType.String)\n                {\n                    p.Size = (int)item[2];\n                }\n                cmd.Parameters.Add(p);\n            }\n            return cmd;\n        }\n\n\n        private const string SqlUerInsertOrUpdate = @\"\n               INSERT OR REPLACE INTO [Users] ([ApiEndpoint],[UserId],[AssociationId],[UserType],[DisplayName],[AboutMe],[Location]\n               ,[WebsiteUrl],[EmailHash],[CreationDate],[LastAccessDate],[TimedPenaltyDate],[AcceptRate],[Age],[AnswerCount],[DownVoteCount]\n               ,[QuestionCount],[Reputation],[UpVoteCount],[ViewCount],[BadgesGold],[BadgesSilver],[BadgesBronze],[Rank],[LastModifiedDate]) \n               VALUES (@ApiEndpoint,@UserId,@AssociationId,@UserType,@DisplayName,@AboutMe,@Location,@WebsiteUrl,@EmailHash,@CreationDate\n               ,@LastAccessDate,@TimedPenaltyDate,@AcceptRate,@Age,@AnswerCount,@DownVoteCount,@QuestionCount,@Reputation,@UpVoteCount\n               ,@ViewCount,@BadgesGold,@BadgesSilver,@BadgesBronze,@Rank,@LastModifiedDate);\";\n\n        private const string CreateUsersTable = @\"\n            CREATE TABLE IF NOT EXISTS [Users] (\n                [RowId] integer PRIMARY KEY AUTOINCREMENT NOT NULL,\n                [ApiEndpoint] varchar(128) NOT NULL,\n                [UserId] int NOT NULL,\n                [AssociationId] guid NOT NULL,\n                [UserType] varchar(20) NOT NULL,\n                [DisplayName] nvarchar(50) NOT NULL,\n                [AboutMe] nvarchar(4000) NOT NULL,\n                [Location] nvarchar(128) NOT NULL,\n                [WebsiteUrl] nvarchar(256) NOT NULL,\n                [EmailHash] varchar(64) NOT NULL,\n                [CreationDate] datetime NOT NULL,\n                [LastAccessDate] datetime NOT NULL,\n                [TimedPenaltyDate] datetime NOT NULL,\n                [AcceptRate] int NOT NULL,\n                [Age] int NOT NULL,\n                [AnswerCount] int NOT NULL,\n                [DownVoteCount] int NOT NULL,\n                [QuestionCount] int NOT NULL,\n                [Reputation] int NOT NULL,\n                [UpVoteCount] int NOT NULL,\n                [ViewCount] int NOT NULL,\n                [BadgesGold] int NOT NULL,\n                [BadgesSilver] int NOT NULL,\n                [BadgesBronze] int NOT NULL,\n                [Rank] int NOT NULL,\n                [LastModifiedDate] datetime NOT NULL\n            );\n\n            CREATE UNIQUE INDEX  IF NOT EXISTS [IX_ApiEndpoint_UserId] ON [Users] ([ApiEndpoint], [UserId]);\";\n    }\n\n}\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1305,
          "accepted": false,
          "answer_comments_url": "/answers/1305/comments",
          "question_id": 386,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281003990,
          "last_edit_date": 1281264525,
          "last_activity_date": 1281264525,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<h3>Soapi.CS - Full Parameter Parity</h3>\n\n<p>Soapi provides full API coverage including parameters.</p>\n\n<pre><code>[Test]\npublic void info_param()\n{\n    // /questions\n    SO.Questions\n        // answers (optional)   When \"true\", the answers to a question will be returned\n        .WithAnswers(true)\n        // body (optional)      When \"true\", a post's body will be included in the response.\n        .WithBody(true)\n        // comments (optional)  When \"true\", any comments on a post will be included in the response.\n        .WithComments(true)\n        // fromdate (optional)  Unix timestamp of the minimum creation date on a returned item.\n        .FromDate(\"january 1, 2001\") // can parse dates\n        // max (optional)       Maximum of the range to include in the response according to the current sort.\n        .Max(2)\n        // min (optional)       Minimum of the range to include in the response according to the current sort.\n        .Min(1)\n        // order (optional)     How the current sort should be ordered.\n        .Order(SortOrder.Asc)\n        // page (optional)      The pagination offset for the current collection. Affected by the specified pagesize.\n        .Page(1)\n        // pagesize (optional)  The number of collection results to display during pagination. Should be between 1 and 100 inclusive.\n        .PageSize(100)\n        // sort (optional)      How a collection should be sorted.\n        .Sort(QuestionSort.Votes)\n        // tagged (optional)    Semicolon delimited list of tags questions must have\n        .Tagged(\"a\", \"b\") // accepts param aary\n        // todate (optional)    Unix timestamp of the maximum creation date on a returned item.\n        .ToDate(new DateTime(2020, 1, 1))\n\n        .PageCount(10) // fetch multiple pages .PageCount(-1) to get all pages\n        .ToList();\n}\n</code></pre>\n\n<p><strong>Request that is issued:</strong> (bogus request, so no paging occurs)</p>\n\n<p><a href=\"http://api.stackoverflow.com/1.0/questions?answers=true&amp;body=true&amp;comments=true&amp;fromdate=978307200&amp;max=2&amp;min=1&amp;order=Asc&amp;page=1&amp;pagesize=100&amp;sort=Votes&amp;tagged=a;b&amp;todate=1577836800\">http://api.stackoverflow.com/1.0/questions?answers=true&amp;body=true&amp;comments=true&amp;fromdate=978307200&amp;max=2&amp;min=1&amp;order=Asc&amp;page=1&amp;pagesize=100&amp;sort=Votes&amp;tagged=a;b&amp;todate=1577836800</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1541,
          "accepted": false,
          "answer_comments_url": "/answers/1541/comments",
          "question_id": 386,
          "owner": {
            "user_id": 3085,
            "user_type": "registered",
            "display_name": "makerofthings7",
            "reputation": 275,
            "email_hash": "9cc3e3bb2ff2ef30810be80ca741de70"
          },
          "creation_date": 1283707053,
          "last_edit_date": 1283719366,
          "last_activity_date": 1283719366,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<p><strong>MakerOfThings7</strong>:</p>\n\n<p>Why is SOAPICS GPL? That really limits it's usage. Can you change it to LGPL?</p>\n\n<p><a href=\"http://soapics.codeplex.com/license\" rel=\"nofollow\">http://soapics.codeplex.com/license</a></p>\n\n<p>My application is proprietary, and the GPL license requires that I distribute source of my app if I simply link to this library.  That's a no-go for me.</p>\n\n<p><strong>code poet</strong>:</p>\n\n<p>There are many reasons that this, and other libraries, are GPL as opposed to LGPL. </p>\n\n<p>You can find a really succinct summary at <a href=\"http://www.gnu.org/licenses/why-not-lgpl.html\" rel=\"nofollow\">here</a>. </p>\n\n<p>The altruistic line is that the more free (as in speech as well as beer) software we publish under FLOSS licenses now, the more there will be in the future.</p>\n\n<p>The pragmatic line, which is the one I tend to defer to, is that I am willing to pay forward the hundreds of hours and countless headaches (and those to come) that went into developing Soapi.CS. Anyone who is writing FLOSS, thus paying back and forward, is welcome to use the code without cost or restriction.</p>\n\n<p>Proprietary, or closed source, software, is not '<a href=\"http://www.gnu.org/philosophy/free-sw.html\" rel=\"nofollow\">free as in speech</a>' and typically not 'free as in beer', and implies that the free (as in speech, definitely not as in beer) work that has been put into the library is being taken out of with nothing put back in.</p>\n\n<p>But back to the pragmatic part: </p>\n\n<p>It is my feeling that if someone wishes to use my work in proprietary or commercial software that, depending on the particular scenario, some type and degree of recompense is in order and that is where an LGPL exception comes into play.</p>\n\n<p>Whether that be a simple thank you, a prominent attribution, a one time fee or a maintenance agreement etc all depends on the particular situation. </p>\n\n<p>I encourage you (and anyone else) to email me directly at sky.sanders at gmail.com with salient details regarding your project and I am confident that satisfactory arrangements can be made.</p>\n\n<p><sub>Note: this is an issue of substance and should be discussed to the satisfaction of all and the form factor here, e.g. main post and cramped comments, does not lend itself well to that, so I will just carry on the conversation with you here in the main body, if you don't mind.</sub></p>\n\n<p><strong>MakerOfThings7</strong>:</p>\n\n<p>In my situation, this code will probably benefit team@stackoverflow.com more than it will benefit myself.  Basically, I'd like to permit users to log into my site and grant them additional permissions if they have a high SO rating.  This will in turn get you more users through an \"Affiliate\" and sell more advertising.  I'll have the benefit of weeding out spammers and non-technical people. </p>\n\n<p>If you believe it's worthwhile to get payment for the library in this use case, perhaps you should sell it to team@stackoverflow.com</p>\n\n<p><strong>code poet</strong>:</p>\n\n<p>What I infer from your last sentence is that you feel that I am asking too much from you in providing free code for free usage but requiring an explicit agreement for taking it out of FLOSS.</p>\n\n<p>Do please correct me if I am reading you wrong, and in any case let me iterate some things and re-iterate others. ;-)</p>\n\n<ol>\n<li>stack overflow does not need a client library for their own codebase</li>\n<li>code poet != stack overflow (and apparently never will be)</li>\n<li>what is worthwile for for Soapi/code poet <strong>!=</strong> what is worthwhile for stack overflow. </li>\n<li>i (hopefully) made it clear that for non FLOSS, <em>some</em> sort of agreement would need to be arrived at and provided some possibilities, including some that involve no cost what-so-ever.</li>\n<li>yes, i feel that my work is of a caliber that deserves compensation in situations that indicate compensation is due. this might just be my ego on overtime, who knows? </li>\n</ol>\n\n<p>With that said, <strong><em>again</em></strong>, I encourage you to email me with salient details regarding your proposed usage of Soapi in a proprietary setting and it is highly likely that satisfactory arrangements can be made but a blanket license shift to LGPL is not in the cards for Soapi.CS.</p>\n\n<p><strong>MakerOfThings7</strong>:</p>\n\n<p>I totally appreciate your work and hope those ideas help you cross promote. I think SO should pay for your library if it drives traffic to their site, since they are getting increased advertising traffic from that.  Maybe you can get compensation from both sides (SO and the consumer).  </p>\n\n<p>When I get closer to actually needing the library, and can find a user based on email hash (has that been implemented?) then I will send you more info at your email addy.</p>\n\n<p><strong>code poet</strong></p>\n\n<p>Regarding the 'users by hash' question, I know the issue has been raised in several posts, <a href=\"http://stackapps.com/questions/394/can-there-be-a-way-to-find-a-user-given-his-email-hash\">here</a>, and in great detail in a meta post that I cannot find, but in short, the only way to do this is to maintain a complete list of users which you index yourself. This is a task that, if handled properly, is not unreasonable from both the perspective of maintenance and that of API usage. The utility of such a dataset goes far beyond simply finding users by email. I will post a CW dev-tip regarding this.</p>\n\n<p><strong>MakerOfThings7</strong>:</p>\n\n<p>Not sure what a CW dev tip is, but I'll look for it when it's ready.  </p>\n",
          "comments": [
            {
              "comment_id": 4079,
              "creation_date": 1283709095,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1541,
              "post_type": "answer",
              "score": 0,
              "body": "++ for a great question, even if it was edited by that dude. ;-)"
            },
            {
              "comment_id": 4087,
              "creation_date": 1283720319,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1541,
              "post_type": "answer",
              "score": 0,
              "body": "Actually, you could re-ask your question as a Question and I could provide an answer, thus complying with the letter of the law as laid down recently with no need for community wiki (CW) where neither of us would be able to gain rep from our efforts. You would probably want to ask specifically how to implement a find by email_hash feature to avoid getting swamped by dupe police and pointed to the abstract discussions of this."
            },
            {
              "comment_id": 4099,
              "creation_date": 1283727244,
              "owner": {
                "user_id": 3085,
                "user_type": "registered",
                "display_name": "makerofthings7",
                "reputation": 275,
                "email_hash": "9cc3e3bb2ff2ef30810be80ca741de70"
              },
              "post_id": 1541,
              "post_type": "answer",
              "score": 0,
              "body": "done: <a href=\"http://stackapps.com/questions/1542/how-do-i-find-a-user-based-upon-email-hash\" title=\"how do i find a user based upon email hash\">stackapps.com/questions/1542/&hellip;</a>"
            },
            {
              "comment_id": 4105,
              "creation_date": 1283741098,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 3085,
                "user_type": "registered",
                "display_name": "makerofthings7",
                "reputation": 275,
                "email_hash": "9cc3e3bb2ff2ef30810be80ca741de70"
              },
              "post_id": 1541,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "and done: <a href=\"http://stackapps.com/questions/1542/how-do-i-find-a-user-based-upon-email-hash/1543#1543\" title=\"how do i find a user based upon email hash\">stackapps.com/questions/1542/&hellip;</a> <i>(psst.. this is your post so you have to @code to get my attention.)</i>"
            }
          ]
        },
        {
          "answer_id": 1666,
          "accepted": false,
          "answer_comments_url": "/answers/1666/comments",
          "question_id": 386,
          "owner": {
            "user_id": 2951,
            "user_type": "registered",
            "display_name": "chanchal1987",
            "reputation": 199,
            "email_hash": "9d474fe1f0a93c3faf349a881346ea84"
          },
          "creation_date": 1286269089,
          "last_activity_date": 1286269089,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<p>So many documentations are missing... Please correct these.\n<img src=\"http://i.stack.imgur.com/pvHX5.jpg\" alt=\"alt text\"></p>\n",
          "comments": [
            {
              "comment_id": 4448,
              "creation_date": 1286278990,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1666,
              "post_type": "answer",
              "score": 0,
              "body": "yeah, sorry bout that. so many things to do, so little time. thanks for the reminder."
            }
          ]
        },
        {
          "answer_id": 1862,
          "accepted": false,
          "answer_comments_url": "/answers/1862/comments",
          "question_id": 386,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1292967576,
          "last_activity_date": 1292967576,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
          "body": "<p>I'm getting an error when using this code:</p>\n\n<pre><code>Soapi.ApiContext context = new Soapi.ApiContext(\"...\").Initialize(false);\n\n// Now we're going to make an attempt to retrieve some questions\n// from the StackExchange API.\nSoapi.Domain.Question thisPost = context.Official\n    .StackApps\n    .Questions.ById(386)\n    .GetEnumerator().Current;\n\n// Now print the question title\nConsole.WriteLine(thisPost.Title);\n</code></pre>\n\n<blockquote>\n  <p><b>Unhandled Exception:</b> <i>System.NullReferenceException:</i> Object reference not set to an instance of an object at Thing.ThingClass.Main (System.String[] args) [0x0001b] in Main.cs:18</p>\n</blockquote>\n\n<p>I'm using Mono 2.4.</p>\n",
          "comments": [
            {
              "comment_id": 4885,
              "creation_date": 1293032013,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1862,
              "post_type": "answer",
              "score": 0,
              "body": "It has been a while but I think the min may be 2.6. not documented, i know. bad me. I have to check."
            },
            {
              "comment_id": 4886,
              "creation_date": 1293040839,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1862,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky: Actually, my bad - I actually <i>am</i> using 2.6 but rather <i>MonoDevelop</i> 2.4. I got the version numbers mixed up - my mistake. But I still am having that problem."
            },
            {
              "comment_id": 4888,
              "creation_date": 1293060165,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1862,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky: I figured it out! It was my mistake. I wasn&#39;t calling <code>.MoveNext()</code> on the enumerator."
            }
          ]
        }
      ],
      "favorite_count": 25,
      "question_timeline_url": "/questions/386/timeline",
      "question_comments_url": "/questions/386/comments",
      "question_answers_url": "/questions/386/answers",
      "question_id": 386,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1275299657,
      "last_edit_date": 1284220577,
      "last_activity_date": 1292967576,
      "up_vote_count": 42,
      "down_vote_count": 0,
      "view_count": 3748,
      "score": 42,
      "community_owned": false,
      "title": "Soapi.CS : A fully relational fluent .NET Stack Exchange API client library",
      "body": "<h2>Soapi.CS for .Net / Silverlight / Windows Phone 7 / Mono</h2>\n\n<p><em><strong>as easy as breathing...</em>:</strong></p>\n\n<pre><code>var context = new ApiContext(apiKey).Initialize(false); \n\nQuestion thisPost = context.Official\n    .StackApps\n    .Questions.ById(386)\n    .WithComments(true)\n    .First();\n\nConsole.WriteLine(thisPost.Title);\n\nthisPost\n  .Owner\n  .Questions\n  .PageSize(5)\n  .Sort(PostSort.Votes)\n  .ToList()\n  .ForEach(q=&gt;\n    {\n        Console.WriteLine(\"\\t\" + q.Score + \"\\t\" + q.Title);\n\n        q.Timeline.ToList().ForEach(t=&gt;\n          Console.WriteLine(\"\\t\\t\" +  \n             t.TimelineType + \"\\t\" + t.Owner.DisplayName));\n\n        Console.WriteLine();\n    });\n\n// if you can think it, you can get it.\n</code></pre>\n\n<p><strong>Output</strong></p>\n\n<pre>\nSoapi.CS : A fully relational fluent .NET Stack Exchange API client library\n  21  Soapi.CS : A fully relational fluent .NET Stack Exchange API client library\n    Revision  code poet\n    Revision  code poet\n    Votes  code poet\n    Votes  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Votes  code poet\n    Comment  code poet\n    Revision  code poet\n    Votes  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Answer  code poet\n    Revision  code poet\n    Revision  code poet\n\n  14  SOAPI-WATCH: A realtime service that notifies subscribers via twitter when the API changes in any way.\n    Votes  code poet\n    Revision  code poet\n    Votes  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Votes  lfoust\n    Votes  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Revision  code poet\n    Comment  lfoust\n    Votes  code poet\n    Revision  code poet\n    Votes  code poet\n    Votes  lfoust\n    Votes  code poet\n    Revision  code poet\n    Comment  Dave DeLong\n    Revision  code poet\n    Revision  code poet\n    Votes  code poet\n    Comment  lfoust\n    Comment  Dave DeLong\n    Comment  lfoust\n    Comment  lfoust\n    Comment  Dave DeLong\n    Revision  code poet\n\n  11  SOAPI-EXPLORE: Self-updating single page JavaSript API test harness\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Comment  code poet\n    Revision  code poet\n    Votes  code poet\n    Revision  code poet\n    Revision  code poet\n    Revision  code poet\n    Comment  code poet\n    Revision  code poet\n    Votes  code poet\n    Comment  code poet\n    Question  code poet\n    Votes  code poet\n\n  11  Soapi.JS V1.0: fluent JavaScript wrapper for the StackOverflow API\n    Comment  George Edison\n    Comment  George Edison\n    Comment  George Edison\n    Comment  George Edison\n    Comment  George Edison\n    Comment  George Edison\n    Answer  George Edison\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Revision  code poet\n    Revision  code poet\n    Answer  code poet\n    Comment  code poet\n    Revision  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Revision  code poet\n    Revision  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Votes  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n    Comment  code poet\n\n  9  SOAPI-DIFF: Your app broke? Check SOAPI-DIFF to find out what changed in the API\n    Votes  code poet\n    Revision  code poet\n    Comment  Dennis Williamson\n    Answer  Dennis Williamson\n    Votes  code poet\n    Votes  Dennis Williamson\n    Comment  code poet\n    Question  code poet\n    Votes  code poet\n\n\n</pre>\n\n<hr>\n\n<h2>About</h2>\n\n<p>A robust, fully relational, <strong>easy to use</strong>, strongly typed, end-to-end StackOverflow API Client Library.</p>\n\n<p>Out of the box, Soapi provides you with a robust client library that abstracts away most all of the messy details of consuming the API and <strong>lets you concentrate on implementing your ideas</strong>.</p>\n\n<p>A few features include:</p>\n\n<ul>\n<li><p>A fully relational model of the API data set exposed via a fully 'dot navigable' IEnumerable (LINQ) implementation. Simply tell Soapi what you want and it will get it for you.</p>\n\n<p>e.g. \"On my first question, from the author of the first comment, get the first page of comments by that person on any post\" </p>\n\n<p><code>my.Questions.First().Comments.First().Owner.Comments.ToList();</code></p>\n\n<p><sub>(yes this is a real expression that returns the data as expressed!)</sub></p></li>\n<li><p>Full coverage of the API, all routes and all parameters with an intuitive syntax.</p></li>\n<li><p>Strongly typed Domain Data Objects for all API data structures.</p></li>\n<li><p><strong>Eager and Lazy Loading</strong> of 'stub' objects. Eager\\Lazy loading may be disabled.</p></li>\n<li><p>When finer grained control of requests is desired, the core RouteMap objects may be leveraged to request data from any of the API paths using all available parameters as documented on the help pages.</p></li>\n<li><p>A rich Asynchronous implementation.</p></li>\n<li><p>A <strong>configurable request cache</strong> to reduce unnecessary network traffic and to simplify your usage logic. There is no need to go out of your way to be frugal. You may set a distinct cache duration for any particular route. </p></li>\n<li><p><strong>A configurable request throttle</strong> to ensure compliance with the api terms of usage and to simplify your code in that you do not have to worry about and respond to 50X errors.</p>\n\n<p>The RequestCache and Throttled Queue are thread-safe, so can make as many requests as you like from as many threads as you like as fast as you like and not worry about abusing the api or having to write reams of management/compensation code.</p></li>\n<li><p><strong>Configurable retry threshold</strong> that will, by default, make up to 3 attempts to retrieve a request before failing. Every request made by Soapi is properly formed and directed so most any http error will be the result of a timeout or other network infrastructure. A retry buffer provides a level of fault tolerance that you can rely on.</p></li>\n<li><p>An almost identical <strong>javascript library</strong>, <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a>, and it's full figured big brother, <a href=\"http://stackapps.com/questions/1433/soapi-js2-a-fully-relational-javascript-client-library-for-the-stack-exchange-a\">Soapi.JS2</a>, that will enable you to leverage your server cycles and bandwidth for only those tasks that require it and offload things like status updates to the client's browser.</p></li>\n</ul>\n\n<h2>License</h2>\n\n<p>Licensed GPL Version 2 license.</p>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library/1541#1541\">Why is Soapi.CS GPL?</a></li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library/1541#1541\">Can I get an LGPL license for Soapi.CS?</a> <sub>(hint: probably)</sub></li>\n</ul>\n\n<h2>Platforms</h2>\n\n<ul>\n<li>.NET 3.5</li>\n<li>.NET 4.0</li>\n<li>Silverlight 3</li>\n<li>Silverlight 4 </li>\n<li>Windows Phone 7</li>\n<li>Mono</li>\n</ul>\n\n<h2>Download</h2>\n\n<p><strike>Source code lives @ <a href=\"http://soapics.codeplex.com\" rel=\"nofollow\">http://soapics.codeplex.com</a>. Binary releases are forthcoming.</strike></p>\n\n<p>codeplex is acting up again.</p>\n\n<p>get the source and binaries @ <a href=\"http://bitbucket.org/bitpusher/soapi.cs/downloads\" rel=\"nofollow\">http://bitbucket.org/bitpusher/soapi.cs/downloads</a></p>\n\n<p>The source is C# 3.5. and includes projects and solutions for the following IDEs</p>\n\n<ul>\n<li>Visual Studio 2008</li>\n<li>Visual Studio 2010</li>\n<li>ModoDevelop 2.4</li>\n</ul>\n\n<h2>Documentation</h2>\n\n<p>Full documentation is available at <a href=\"http://soapi.info/help/cs/index.aspx\" rel=\"nofollow\">http://soapi.info/help/cs/index.aspx</a></p>\n\n<h2>Sample Code / Usage Examples</h2>\n\n<p>Sample code and usage examples will be added as answers to this question. </p>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/690#690\">Full API Coverage</a> all API routes are covered</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/1305#1305\">Full Parameter Parity</a> If the API exposes it, Soapi giftwraps it for you.</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/699#699\">Building a simple app with Soapi.CS</a> - a simple app that gathers all traces of a user in the whole stackiverse.</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/691#691\">Fluent Configuration</a> - Setting up a Soapi.ApiContext could not be easier</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/704#704\">Bulk Data Import</a> - A tiny app that quickly loads a SQLite data file with all users in the stackiverse.</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/694#694\">Paged Results</a> - Soapi.CS transparently handles multi-page operations.</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final/696#696\">Asynchronous Requests</a> - Soapi.CS provides a rich asynchronous model that is especially useful when writing api apps in Silverlight or Windows Phone 7.</li>\n<li><a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library/416#416\">Caching and Throttling</a> - how and why</li>\n</ul>\n\n<h2>Apps that use Soapi.CS</h2>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/1338/finduser-quickly-find-a-any-stack-exchange-user\">Soapi.FindUser</a> - .net utility for locating a user anywhere in the stackiverse</li>\n<li><a href=\"http://stackapps.com/questions/1377/soapi-explore-silverlight-the-entire-api-at-your-command\">Soapi.Explore</a>  - The entire API at your command</li>\n<li><a href=\"http://stackapps.com/questions/1454/soapi-lastseen-list-users-by-last-access-time\">Soapi.LastSeen</a> - List users by last access time</li>\n<li><strong>Add your app/site here - I know you are out there ;-)</strong>  if you are not comfortable editing this post, simply add a comment and I will add it.</li>\n</ul>\n\n<p>The CS/SL/WP7/MONO libraries all compile the same code and with the exception of environmental considerations of Silverlight, the code samples are valid for all libraries.</p>\n\n<p>You may also find guidance in the test suites.</p>\n\n<p><a href=\"http://stackapps.com/questions/1352/what-is-soapi-and-why-should-i-care\">More information on the SOAPI eco-system.</a></p>\n\n<h2>Contact</h2>\n\n<p>This library is currently the effort of me, Sky Sanders (<a href=\"http://stackapps.com/users/14/code-poet\">code poet</a>) and can be reached at gmail - sky.sanders</p>\n\n<p>Any who are interested in improving this library are welcome.</p>\n\n<h2>Support Soapi</h2>\n\n<p>You can help support this project by voting for <a href=\"http://meta.stackoverflow.com/questions/53346/open-source-advertising-sidebar-2h-2010/60263#60263\">Soapi's Open Source Ad post</a></p>\n\n<p>For more information about the origins of Soapi.CS and the rest of the Soapi eco-system see <a href=\"http://stackapps.com/questions/1352/what-is-soapi-and-why-should-i-care\">What is Soapi and why should I care?</a></p>\n\n<hr>\n",
      "comments": [
        {
          "comment_id": 667,
          "creation_date": 1275300746,
          "owner": {
            "user_id": 1174,
            "user_type": "registered",
            "display_name": "Chris S",
            "reputation": 141,
            "email_hash": "f8869c89889c2ceff0fc7d7a253d9f8b"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "Will this just parse the ../help pages?"
        },
        {
          "comment_id": 672,
          "creation_date": 1275301138,
          "owner": {
            "user_id": 1174,
            "user_type": "registered",
            "display_name": "Chris S",
            "reputation": 141,
            "email_hash": "f8869c89889c2ceff0fc7d7a253d9f8b"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Looks like a good idea. Next step: you choose the language it outputs as"
        },
        {
          "comment_id": 678,
          "creation_date": 1275311418,
          "owner": {
            "user_id": 1048,
            "user_type": "registered",
            "display_name": "Mark Rushakoff",
            "reputation": 1121,
            "email_hash": "e9562ede99cb17789af5349379a9ef25"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 1,
          "body": "@code poet: As I&#39;ve gone through writing <a href=\"http://stackapps.com/questions/354/tangoverflow-stackapps-api-using-d-with-tango\">tangoverflow</a>, it was very clear that this API generation was something that should be delegated to a tool -- just due to the size of the StackApps API, if anything.  Good job on this.  You&#39;ll probably like to know that it successfully compiles on MonoDevelop 2.2.2 on OSX.  Well, I was missing some references for the tests (and feeling lazy), but <code>CodeGeneration</code> and <code>Salient.StackApps</code> compiled fine."
        },
        {
          "comment_id": 700,
          "creation_date": 1275356544,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "Does it really count as slaving if you enjoy it?  Also, this is a very neat idea; is there anything we could do to make any improvements possible?  (no promises)"
        },
        {
          "comment_id": 914,
          "creation_date": 1275725964,
          "owner": {
            "user_id": 1265,
            "user_type": "registered",
            "display_name": "SztupY",
            "reputation": 473,
            "email_hash": "cfb74e792db321ba120ffa223197f673"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "Will the C# variant added to the SOAPI-* package too, or are they JS only now? FYI salient.stackapps works fine with mono 2.6.4+ on windows and 2.4.4+ on linux, but fails on windows for 2.6.3"
        },
        {
          "comment_id": 915,
          "creation_date": 1275726509,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1265,
            "user_type": "registered",
            "display_name": "SztupY",
            "reputation": 473,
            "email_hash": "cfb74e792db321ba120ffa223197f673"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "@sztupy - yes, the c# library, as well as a Silverlight lib are in SOAPI. I need to encapsulate the routes into a client object, as they are in the JS lib, in order to allow more flexible use. When I get that done this weekend I will announce SOAPI C# and SilverLight as successor to this prototype."
        },
        {
          "comment_id": 923,
          "creation_date": 1275747363,
          "owner": {
            "user_id": 1265,
            "user_type": "registered",
            "display_name": "SztupY",
            "reputation": 473,
            "email_hash": "cfb74e792db321ba120ffa223197f673"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "Thanks. I&#39;ve chosen to use your library and just wanted to know what it&#39;s future is."
        },
        {
          "comment_id": 1198,
          "creation_date": 1276322585,
          "owner": {
            "user_id": 1265,
            "user_type": "registered",
            "display_name": "SztupY",
            "reputation": 473,
            "email_hash": "cfb74e792db321ba120ffa223197f673"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "I&#39;ve began switching to SOAPI.CS 2 days ago. I&#39;ll let you know if I find bugs/etc."
        },
        {
          "comment_id": 2950,
          "creation_date": 1279654739,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "Mono, eh? Hmmm... I use Ubuntu."
        },
        {
          "comment_id": 2962,
          "creation_date": 1279677085,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 0,
          "body": "@code: All comments have been deleted."
        },
        {
          "comment_id": 3426,
          "creation_date": 1281135826,
          "owner": {
            "user_id": 32,
            "user_type": "registered",
            "display_name": "Maxim Zaslavsky",
            "reputation": 2361,
            "email_hash": "319bd6ef9c9c8d876f731150cb4951c7"
          },
          "post_id": 386,
          "post_type": "question",
          "score": 5,
          "body": "Amazing! ` `` `"
        }
      ]
    },
    {
      "tags": [
        "discussion"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1584,
          "accepted": false,
          "answer_comments_url": "/answers/1584/comments",
          "question_id": 1583,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1284613651,
          "last_edit_date": 1284615082,
          "last_activity_date": 1284615082,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to calculate rank; local to site and globally?",
          "body": "<p>Well, would it work to rank globally based on relative rankings for each site? I'm just thinking out loud.</p>\n\n<p>Here's how it works:</p>\n\n<ul>\n<li>For each site, the user's relative ranking is determined as a percentage.</li>\n<li>The percentages are averaged.</li>\n</ul>\n\n<p>The last step isn't very good - I don't think it'll work very well, but it's an idea.</p>\n",
          "comments": [
            {
              "comment_id": 4218,
              "creation_date": 1284614518,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1584,
              "post_type": "answer",
              "score": 1,
              "body": "can you think aloud in detail? ;-)"
            },
            {
              "comment_id": 4219,
              "creation_date": 1284615128,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1584,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky: I added some more detail."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1583/timeline",
      "question_comments_url": "/questions/1583/comments",
      "question_answers_url": "/questions/1583/answers",
      "question_id": 1583,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284608342,
      "last_activity_date": 1287207842,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 104,
      "score": 1,
      "community_owned": false,
      "title": "How to calculate rank; local to site and globally?",
      "body": "<p>With the available data points, how would you rank users, both on a site basis as well as globally?</p>\n\n<p>Right now I am simply sorting on <code>reputation</code> desc, <code>creation_date</code>, <code>user_id</code>, <code>display_name</code>.</p>\n\n<p>This closely approximates the order of appearance on the Users page but seems to me simplistic.</p>\n\n<p>Does anyone have any thoughts about how to arrive at a valid ranking?</p>\n\n<p>Assume that you have a current database of all users.</p>\n\n<hr>\n\n<p><sub>yes, this is me asking a question, not setting up a dev-tip ;-)</sub></p>\n",
      "comments": []
    },
    {
      "tags": [
        "bug",
        "status-completed",
        "silverlight",
        "flash"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1694,
          "accepted": true,
          "answer_comments_url": "/answers/1694/comments",
          "question_id": 1659,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1286825207,
          "last_activity_date": 1286825207,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "update crossdomain.xml on stackauth.com and api endpoints to work with current Flash",
          "body": "<p>These are rolling out, and should be on all API and StackAuth instances soon-ish.</p>\n",
          "comments": [
            {
              "comment_id": 4504,
              "creation_date": 1286882163,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1694,
              "post_type": "answer",
              "score": 1,
              "body": "<a href=\"http://stackauth.com/crossdomain.xml\">stackauth.com/crossdomain.xml</a> &amp; <a href=\"http://stackauth.com/1.0/crossdomain.xml\">stackauth.com/1.0/crossdomain.xml</a>  are either lagging update or were missed. these are actually the most critical of the bunch."
            }
          ]
        }
      ],
      "accepted_answer_id": 1694,
      "favorite_count": 2,
      "question_timeline_url": "/questions/1659/timeline",
      "question_comments_url": "/questions/1659/comments",
      "question_answers_url": "/questions/1659/answers",
      "question_id": 1659,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1285996509,
      "last_edit_date": 1286825166,
      "last_activity_date": 1286825207,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 190,
      "score": 4,
      "community_owned": false,
      "title": "update crossdomain.xml on stackauth.com and api endpoints to work with current Flash",
      "body": "<p>I am implementing a javascript client that uses the Flash based XHR replacement <a href=\"http://flxhr.flensed.com\" rel=\"nofollow\">Flensed</a> in the interest of providing more robust api communication than that provided by JSONP.</p>\n\n<p>Apparently the current flash version does not like the current crossdomain.xml.</p>\n\n<p>The only difference I can see between a policy file that works with Flensed, thus Flash 10, is the inclusion of the xml directive and doc-type. In other words, a semantically correct crossdomain xml file.</p>\n\n<p>Can we deploy the proposed version of crossdomain.xml on stackauth and all api endpoints?</p>\n\n<p><strong>Current:</strong></p>\n\n<pre>\n   &lt?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n   &lt;cross-domain-policy>\n      &lt;allow-access-from domain=\"*\" />  \n      &lt;site-control permitted-cross-domain-policies=\"master-only\"/>  \n    &lt;/cross-domain-policy>\n</pre>\n\n<p><strong>Proposed:</strong></p>\n\n<pre>\n    &lt;?xml version=\"1.0\"?>\n    &lt;!DOCTYPE cross-domain-policy SYSTEM \"http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd\">\n    &lt;cross-domain-policy>\n      &lt;allow-access-from domain=\"*\" />  \n      &lt;site-control permitted-cross-domain-policies=\"master-only\"/>  \n    &lt;/cross-domain-policy>\n</pre>\n",
      "comments": [
        {
          "comment_id": 4426,
          "creation_date": 1286021285,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1659,
          "post_type": "question",
          "score": 0,
          "edit_count": 2,
          "body": "Given the official <a href=\"http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html\" rel=\"nofollow\">Cross-domain policy file specification</a> (and the fact that it isn&#39;t working correctly currently) I&#39;d qualify this as a bug actually (have retagged accordingly)."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-bydesign",
        "api-help"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1663,
          "accepted": false,
          "answer_comments_url": "/answers/1663/comments",
          "question_id": 1662,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1286142601,
          "last_activity_date": 1286142601,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "user 'about_me' field suggested_buffer_size is too small",
          "body": "<p>Suggested buffer size is just a suggestion, you've always been required to handle larger values should they be encountered.  Exactly how you do so is an [app] specific detail.</p>\n\n<p>In this case, the field backing <code>about_me</code> on the server has been resized since the API was released.  It makes <code>about_me</code> a more acute case, but its always been possible to craft a neurotic entry whose HTML version would be in excess of API's <code>suggested_buffer_size</code> for the field.</p>\n",
          "comments": [
            {
              "comment_id": 4439,
              "creation_date": 1286175367,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 0,
              "body": "i am not sure i agree with the practice of suggesting a value that is known to be insufficient. It is my experience both when writing SODDI for importing the data dump and in pulling all users that it is not uncommon for a post rendered as html to exceed these suggested values simply by virtue of using the alloted markdown characters. Unfortunately, the only way to gather these metrics is to either have access to the DB and do a metrics run, rendering all markdown fields to get an idea of what a safe margin would be or to use the API to pull all records."
            },
            {
              "comment_id": 4440,
              "creation_date": 1286175461,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 0,
              "body": "maybe this is something that deserves a few hours of time on that side of the fence. When you say that we should always be ready to get more data than advertised you are saying that we should guess. and if we guess wrong, data is either truncated or exceptions occur. surely there is a middle ground."
            },
            {
              "comment_id": 4441,
              "creation_date": 1286183055,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky  the two options are: &quot;a concrete number which we <b>say</b> will never change, ... but then we change it when forced to&quot; or &quot;a number which we say is a good <i>buffer size</i> if you&#39;re going to allocate one, but which is not guaranteed to be large enough for all values, forever.&quot;  There isn&#39;t any middle ground, unless you want us to return no guidance at all.  Bluntly, if you&#39;re constraining your data types to the <code>suggested_buffer_size</code> you are explicitly <b>violating the API contract</b> and that&#39;s the problem, not whether the number is a perfect indicator (we say in the name that its not!)."
            },
            {
              "comment_id": 4442,
              "creation_date": 1286184274,
              "owner": {
                "user_id": 3204,
                "user_type": "registered",
                "display_name": "Dan Dumitru",
                "reputation": 273,
                "email_hash": "e3b683bd4d315f9ff85df85f71910090"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 1,
              "body": "+1 - IMO, it all comes down too: &quot;its always been <i>(and it will always be)</i> possible to craft a neurotic entry whose HTML version would be in excess of API&#39;s suggested_buffer_size for the field&quot;"
            },
            {
              "comment_id": 4443,
              "creation_date": 1286187126,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 0,
              "body": "sure, i understand the position. curious as to how using the suggested buffer size is an explicit violation of the api contract."
            },
            {
              "comment_id": 4446,
              "creation_date": 1286232314,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1663,
              "post_type": "answer",
              "score": 0,
              "body": "@Sky - using it as a concrete limit is, using it as a default buffer size (like the name suggests!) isn&#39;t.  Your original question makes it clear you want to do the former, which is a contract violation."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1662/timeline",
      "question_comments_url": "/questions/1662/comments",
      "question_answers_url": "/questions/1662/answers",
      "question_id": 1662,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1286130009,
      "last_edit_date": 1286142372,
      "last_activity_date": 1286142601,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 66,
      "score": 1,
      "community_owned": false,
      "title": "user 'about_me' field suggested_buffer_size is too small",
      "body": "<p>the <code>suggested_buffer_size</code> of <code>user.about_me</code> is currently 3000.</p>\n\n<p>it is apparent that this is the server-side field length.</p>\n\n<p>the problem is that the text is stored server-side in markdown but when served is expanded to html resulting in values that exceed 3000 characters.</p>\n\n<p>when persisting, depending on the consumer, this can result in truncated data or truncation exceptions being thrown from the RDBMS.</p>\n\n<p>it is my experience, gained by maintaining a complete user database, that a value of 4000 for <code>suggested_buffer_size</code> of 4000 is safe and more accurate.</p>\n\n<p>also, I would suspect the same issue would apply to post <code>body</code> fields including comments, though I have not gathered metrics on those fields.</p>\n",
      "comments": [
        {
          "comment_id": 4434,
          "creation_date": 1286134110,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1662,
          "post_type": "question",
          "score": 1,
          "body": "Thanks for noticing this... I never would have."
        }
      ]
    },
    {
      "tags": [
        "discussion"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1661,
          "accepted": true,
          "answer_comments_url": "/answers/1661/comments",
          "question_id": 1660,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1286059045,
          "last_edit_date": 1286059504,
          "last_activity_date": 1286059504,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Why is there no /answers route?",
          "body": "<p>This is linked into the motivations for v1 of the API.</p>\n\n<p>First, we wanted to put everything you could scrape into the API, so there'd be less motivation to do so.</p>\n\n<p>Second, we wanted it to be possible to build read-only versions of the sites using just the API.  The theory being that if this were possible, the majority of interesting [app]s would be possible.  This is why the (now quite out-classed by the community) WWSOC was our example app.</p>\n\n<p>Naturally, this is not an exhaustive list (leaving out things like \"scalable\" and \"flexible\").</p>\n\n<p><code>/answers</code> (and <code>/comments</code>, <code>/revisions</code>, and probably a few more I'm forgetting) don't really jive with the above.  You can't get a stream of new comments or answers anywhere.</p>\n\n<p>Now, that's not to say there never will be an <code>/answers</code> just that it wasn't considered for inclusion into v1.  In general, new ways to slice and dice data are great candidates for subsequent API versions.</p>\n",
          "comments": [
            {
              "comment_id": 4431,
              "creation_date": 1286060407,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1661,
              "post_type": "answer",
              "score": 2,
              "body": "The blog promised v2.0 next year. Will there be an intermediate version?"
            },
            {
              "comment_id": 4432,
              "creation_date": 1286062735,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1661,
              "post_type": "answer",
              "score": 1,
              "edit_count": 1,
              "body": "that makes sense. comments and revisions are dependent on a post, i.e. have no value outside the context of a post, whereas a filterable stream of Answers has definite real world value, e.g. find the top rated answers for the tags <code>asp.net</code> <code>sql-server</code> provides a direct route to (possible) guru answers to the type of questions you may be interested in. Think more of research, edificational reading as opposed to &#39;beeline to solve my problem searching&#39;. I second George&#39;s question: What is the possibility of a v1.x?"
            },
            {
              "comment_id": 4433,
              "creation_date": 1286083000,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1661,
              "post_type": "answer",
              "score": 0,
              "body": "@George - its been discussed, but frankly we don&#39;t know.  It all depends on scheduling.  @Sky - meh, the vast majority of answers have no value without the context of a question (consider all the &quot;Your problem is here <code>line of code</code>...&quot; or &quot;You want to use <code>Class Name</code>...&quot; style answers).  But as I said, it&#39;d be an interesting area to explore in &gt; v1."
            }
          ]
        }
      ],
      "accepted_answer_id": 1661,
      "favorite_count": 2,
      "question_timeline_url": "/questions/1660/timeline",
      "question_comments_url": "/questions/1660/comments",
      "question_answers_url": "/questions/1660/answers",
      "question_id": 1660,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1286000947,
      "last_edit_date": 1286058716,
      "last_activity_date": 1286059504,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 110,
      "score": 2,
      "community_owned": false,
      "title": "Why is there no /answers route?",
      "body": "<p>As I was answering this question, <a href=\"http://meta.stackoverflow.com/questions/66403/find-answers-with-max-upvotes\">http://meta.stackoverflow.com/questions/66403/find-answers-with-max-upvotes</a>, I found myself wondering, quite late in the game, why there is not an <code>/answers</code> route that allows sort and filter such as <code>/questions</code>.</p>\n\n<p>Is there a systemic reason for this omission or is this an oversight that might be corrected?</p>\n",
      "comments": []
    },
    {
      "tags": [
        "app",
        "soapi.cs",
        "flair"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 3,
      "question_timeline_url": "/questions/1578/timeline",
      "question_comments_url": "/questions/1578/comments",
      "question_answers_url": "/questions/1578/answers",
      "question_id": 1578,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284562172,
      "last_edit_date": 1284990208,
      "last_activity_date": 1284990208,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 320,
      "score": 4,
      "community_owned": false,
      "title": "SOREP V2: Ranked Flair Take 2",
      "body": "<h2><a href=\"http://stackusers.com/Users/Flair\" rel=\"nofollow\">SOREP V2</a>: Ranked and aggregated flair</h2>\n\n<h2>About</h2>\n\n<p><a href=\"http://stackusers.com/Users/Flair\" rel=\"nofollow\">SOREP V2</a> is a flair service that is built upon the <a href=\"http://stackapps.com/questions/1573\">StackUser</a> platform that provides ranked flair, both in standard layout and themes as well as custom aggregations.</p>\n\n<ul>\n<li>Site Ranking, both as an ordinal value and a mouseover percentile.</li>\n<li>Aggregated flair - all or specific number, sorted by reputation</li>\n<li>All standard themes supported - <code>default</code>, <code>clean</code>, <code>dark</code>, <code>hotdog</code></li>\n<li>Custom display formats - <code>default</code>, <code>small</code>, <code>tiny</code></li>\n<li><p>Easy selection using a variety of identifiers</p>\n\n<ul>\n<li>user id and site </li>\n</ul>\n\n<p><a href=\"http://stackusers.com/Users/flair/1/stackoverflow.com\" rel=\"nofollow\"><code>/users/flair/{user_id}/{site_url}</code></a></p>\n\n<ul>\n<li>email address</li>\n</ul>\n\n<p><a href=\"http://stackusers.com/Users/flair/jatwood@codinghorror.com\" rel=\"nofollow\"><code>/users/flair/{email address}</code></a></p>\n\n<ul>\n<li>association id</li>\n</ul>\n\n<p><a href=\"http://stackusers.com/Users/flair/febfb878-3f6f-4215-9323-46d15d62ac7d\" rel=\"nofollow\"><code>/users/flair/{association_id}</code></a></p></li>\n</ul>\n\n<p><strong>Default flair layout</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/qYfUa.png\" alt=\"alt text\"></p>\n\n<p><strong>Small flair layout</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/HcCcn.png\" alt=\"alt text\"></p>\n\n<p><strong>Tiny aggregated flair layout</strong></p>\n\n<p><img src=\"http://i.stack.imgur.com/1VGzG.png\" alt=\"alt text\"></p>\n\n<p>See <a href=\"http://stackusers.com/Users/Flair\" rel=\"nofollow\">http://stackusers.com/Users/Flair</a> for more guidance.</p>\n\n<h2>Contact</h2>\n\n<p>Sky Sanders - <a href=\"http://mailto%3asupport@stackusers.com\" rel=\"nofollow\">support@stackusers.com</a></p>\n\n<h2>History</h2>\n\n<p>Since early this year, before the advent of the API, <a href=\"http://stackapps.com/questions/543\">SOREP</a> has been providing ranked flair for the big 4 trilogy sites. With the advent of the API and improved access to data (so long screen scraping!) the groundwork for <a href=\"http://stackusers.com/Users/Flair\" rel=\"nofollow\">SOREP V2</a> with an improved api and layout was put into motion with the <a href=\"http://stackapps.com/questions/386\">Soapi.CS</a> client library upon which the <a href=\"http://stackapps.com/questions/1573\">StackUser</a> data platform is built.</p>\n",
      "comments": [
        {
          "comment_id": 4206,
          "creation_date": 1284570557,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "body": "To say nothing of the upcoming StackImage2... :)"
        },
        {
          "comment_id": 4207,
          "creation_date": 1284573799,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "edit_count": 3,
          "body": "Excellent - I thought about an Area 51 alike aggregate based upon Soapi.JS for a second, but expected you to update SOREP anytime soon anyway, so thanks much for providing an even better server based approach via Soapi.CS/StackUser now :)"
        },
        {
          "comment_id": 4208,
          "creation_date": 1284577540,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "edit_count": 2,
          "body": "@steffen - if we take ranking out of the picture, a client script flair is a perfect use case for soapi.js2. That should be doable in just a few hours. I will knock out a simple implementation today unless you would like to take it. I will make the latest soapi.js2 available to you."
        },
        {
          "comment_id": 4209,
          "creation_date": 1284583942,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: What&#39;s left to be done before Soapi2.JS final is released?"
        },
        {
          "comment_id": 4217,
          "creation_date": 1284610855,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "body": "@geo - I am working on the soapi.cs&lt;-&gt;soapi.js story while dog-fooding. progress is spotty as the main focus is getting stackusers platform finished. there is no rushing it but I will try to publish a current version of js2 tonight so you don&#39;t get hammered by breaking changes later."
        },
        {
          "comment_id": 4278,
          "creation_date": 1284893662,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "body": "@geo - check it out, i added the special 100th percentile title just for you. ;-) <a href=\"http://stackusers.com/Users/flair/18/stackapps.com?mode=tiny&amp;count=0\" rel=\"nofollow\">stackusers.com/Users/flair/18/&hellip;</a>"
        },
        {
          "comment_id": 4281,
          "creation_date": 1284915349,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1578,
          "post_type": "question",
          "score": 0,
          "body": "@Sky: Awesome! The whole thing looks great!"
        }
      ]
    },
    {
      "tags": [
        "support",
        "status-completed",
        "icons"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1612,
          "accepted": true,
          "answer_comments_url": "/answers/1612/comments",
          "question_id": 1610,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1284948255,
          "last_edit_date": 1284948980,
          "last_activity_date": 1284948980,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "stackapps favicon inconsistent rendering",
          "body": "<p>This has been fixed.</p>\n\n<p>Mind, anyone who already has the favicon cached naturally won't see it until it falls out of their local cache.</p>\n",
          "comments": [
            {
              "comment_id": 4290,
              "creation_date": 1284949806,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1612,
              "post_type": "answer",
              "score": 0,
              "body": "Cache... what&#39;s that? - Just kidding :)"
            },
            {
              "comment_id": 4291,
              "creation_date": 1284958109,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1612,
              "post_type": "answer",
              "score": 0,
              "body": "@George - more concerned about browsers than [app]s.  favicon is an unusual beast, and we can&#39;t explicit cache break it."
            }
          ]
        }
      ],
      "accepted_answer_id": 1612,
      "favorite_count": 0,
      "question_timeline_url": "/questions/1610/timeline",
      "question_comments_url": "/questions/1610/comments",
      "question_answers_url": "/questions/1610/answers",
      "question_id": 1610,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284928049,
      "last_edit_date": 1284948273,
      "last_activity_date": 1284948980,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 87,
      "score": 2,
      "community_owned": false,
      "title": "stackapps favicon inconsistent rendering",
      "body": "<p>A lot of us are using the favicon in our apps as it is a quite convenient size.</p>\n\n<p>It seems that IE does not like the stackapps favicon palette and renders the background black.</p>\n\n<p>While I do cache the icons on my server and <em>could</em> fix it and not update it, it might be nice if this could be fixed upstream.</p>\n\n<p><img src=\"http://i.stack.imgur.com/KNv4Y.png\" alt=\"alt text\"></p>\n",
      "comments": []
    },
    {
      "tags": [
        "feature-request",
        "status-declined"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1608,
          "accepted": false,
          "answer_comments_url": "/answers/1608/comments",
          "question_id": 1605,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1284848760,
          "last_activity_date": 1284848760,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Rather than remove site from /sites set status close, at least temporarily",
          "body": "<p>If you're persisting data, the omission of the site is enough of a signal that its been removed (for whatever reason).</p>\n\n<p>Keep old sites around indefinitely is just polluting <code>/sites</code>, and removing them after some fixed time period means any consumers have to deal with their eventual removal anyway.  Might as well just remove them and be done with it.</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1605/timeline",
      "question_comments_url": "/questions/1605/comments",
      "question_answers_url": "/questions/1605/answers",
      "question_id": 1605,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284844647,
      "last_edit_date": 1284849833,
      "last_activity_date": 1284849833,
      "up_vote_count": 2,
      "down_vote_count": 1,
      "view_count": 78,
      "score": 1,
      "community_owned": false,
      "title": "Rather than remove site from /sites set status close, at least temporarily",
      "body": "<p>I noticed today, due to some exceptions, that sites that do not perform in beta can be closed and thus removed from /sites.</p>\n\n<p>If you persist data, you will need to check your data every time you pull /sites.</p>\n\n<p>8-\\</p>\n\n<p>I would suggest adding a <code>site.state</code>, <code>closed</code>, and keep the site in the list for a short period of time to allow an intelligent response to the event.</p>\n\n<hr>\n\n<p><strong>response to kevin</strong></p>\n\n<p>This is assuming that sites behaves perfectly. If, for any reason, sites does something like returning an empty array, or a malformed site, automated processes will erroneously delete or disassociate data. </p>\n\n<p>Where as if an explicit indication that the site is removed were present appropriate and proactive action could be taken. </p>\n\n<p>This is another case where a little bit of compromise in providing fault tolerance upstream would be of great benefit downstream and easily justify a few extra bytes in the /sites response.</p>\n\n<p>see <a href=\"http://area51.stackexchange.com/proposals/614/electronic-gadgets\">http://area51.stackexchange.com/proposals/614/electronic-gadgets</a></p>\n",
      "comments": [
        {
          "comment_id": 4271,
          "creation_date": 1284850846,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "If <code>&#47;sites</code> malfunctioning is the concern, why not be concerned about it erroneously returning <code>closed</code>?  The flaw is deleting data at the drop of a hat, which is purely a client concern.  As soon as there&#39;s a &quot;signal state,&quot; we have to worry about every client seeing it.  What if some client misses the <code>closed</code> state, and now the site is gone (we&#39;re not keeping dead sites around forever, period); how should it behave?"
        },
        {
          "comment_id": 4272,
          "creation_date": 1284852291,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "@kevin - the publisher of a signal is not aware of or concerned with subscribers. it&#39;s job is to publish a signal. it is the job of the subscribers, if any, to monitor and respond to a signal as is appropriate. If someone has some code that wants to proactively and authoritively deal with a site closure then they will monitor sites for that signal. If they don&#39;t monitor, they don&#39;t get the signal. I never even hinted at keeping dead sites around forever. Just leave the entry marked as deleted for a specific number of days, any specific number of days."
        },
        {
          "comment_id": 4273,
          "creation_date": 1284852965,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "@Sky - ok, I&#39;ll get right on making API changes we know any client that doesn&#39;t have complete control over when and how its run won&#39;t be able to consume reliably.  Top of the TODO."
        },
        {
          "comment_id": 4274,
          "creation_date": 1284853943,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "@kevin - huh? the only thing that came though clear was the sarcasm. you seem to be determined to defend a position rather than discuss this. what that position is, other than &#39;no&#39; is not entirely clear."
        },
        {
          "comment_id": 4275,
          "creation_date": 1284857848,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 1,
          "edit_count": 1,
          "body": "@Sky - This idea is fundamentally flawed because a client will <i>always</i> - <b>always</b> - have to handle the case where it never sees <code>state=closed</code> for a site that is taken down, this is a problem with signalling in general over a REST-ful API (unless the &quot;messages&quot; are persisted, which as I said we aren&#39;t going to do).  All implementing this would do is encourage developers to write brittle, subtly broken code.  Remember that [app]s <b>in general</b> do not control when they are run, that is very fundamental to the problem with this feature-request."
        },
        {
          "comment_id": 4279,
          "creation_date": 1284895658,
          "owner": {
            "user_id": 938,
            "user_type": "registered",
            "display_name": "Jonathan. ",
            "reputation": 2244,
            "email_hash": "f3b9829c592fd7617525afc56118a629"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 2,
          "body": "Errm, I&#39;d thought it was more important to let the user know that a site has been closed. The user thinks WhTF is gadgets? At least if there was site status=closed for a few weeks (or w/e) an app could have banner (etc) saying that gadgets has been closed."
        },
        {
          "comment_id": 4280,
          "creation_date": 1284905402,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@jonathon - the scenario you describe, i.e. an end user app supports kevins rather limited evaluation of the situation. A transient app should not rely on transient signals. A salient and concrete example supporting the feature is a persistent automated server process that fetches data - how is it to intelligently determine when to purge orphaned data? a signal, however transient, will be detected and action can be take proactively with confidence rather than reactively with no actual signal other than the absence of the record. but you get a tick from me for recognizing the issue."
        },
        {
          "comment_id": 4287,
          "creation_date": 1284938319,
          "owner": {
            "user_id": 938,
            "user_type": "registered",
            "display_name": "Jonathan. ",
            "reputation": 2244,
            "email_hash": "f3b9829c592fd7617525afc56118a629"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "Right i didn&#39;t really understand what you just said, but effectively it&#39;s easier for sites to miss out a site than it is to get a state variable wrong? As it&#39;s easier to miss something out than to return the wrong value. I have not much idea of trnasient and salient mean or about the example you gave hut that&#39;s more for kevin I guess."
        },
        {
          "comment_id": 4289,
          "creation_date": 1284940958,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 938,
            "user_type": "registered",
            "display_name": "Jonathan. ",
            "reputation": 2244,
            "email_hash": "f3b9829c592fd7617525afc56118a629"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@jon - what i meant is that when we talk about this in the context of, say, an end-user app that may or may not be running at any given time the value of a transient (temporary) signal such as flagging a site as deleted, is of little value and to code to such a signal would indeed result in brittle code. When you say &#39;user&#39; that is what I thought. But... in the case of a web site that provides indexing services, <a href=\"http://stackusers.com\" rel=\"nofollow\">stackusers.com</a> for instance, which is continually running, a transient signal would be of great value in the interest of maintaining data integrity."
        },
        {
          "comment_id": 4294,
          "creation_date": 1284999068,
          "owner": {
            "user_id": 938,
            "user_type": "registered",
            "display_name": "Jonathan. ",
            "reputation": 2244,
            "email_hash": "f3b9829c592fd7617525afc56118a629"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "But stackusers.com isn&#39;t continually checking the API is it?"
        },
        {
          "comment_id": 4295,
          "creation_date": 1285000426,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 938,
            "user_type": "registered",
            "display_name": "Jonathan. ",
            "reputation": 2244,
            "email_hash": "f3b9829c592fd7617525afc56118a629"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "body": "@jon - the site&#39;s data engine runs on a schedule and performs various polls at regular intervals. So yes, it runs continuously but not constantly, if that makes sense. with the current rate limit I need to be pretty conservative in what and how often I pull but it appears that I can accomplish what I am trying to do with the current limits."
        },
        {
          "comment_id": 4303,
          "creation_date": 1285107772,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1605,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@downvoter ;-) - anonymous downvotes are not as anonymous as you think. ;-)"
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-norepro"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1595,
          "accepted": false,
          "answer_comments_url": "/answers/1595/comments",
          "question_id": 1591,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1284660267,
          "last_activity_date": 1284660267,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "question.migrated.to_site null",
          "body": "<p>This was probably related to <code>/sites</code> acting up yesterday, can't reproduce today.</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1591/timeline",
      "question_comments_url": "/questions/1591/comments",
      "question_answers_url": "/questions/1591/answers",
      "question_id": 1591,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1284625918,
      "last_edit_date": 1284660250,
      "last_activity_date": 1284660267,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 68,
      "score": 1,
      "community_owned": false,
      "title": "question.migrated.to_site null",
      "body": "<p><a href=\"http://api.stackoverflow.com/1.0/questions/322108?sort=activity&amp;order=desc\">http://api.stackoverflow.com/1.0/questions/322108?sort=activity&amp;order=desc</a></p>\n\n<pre>\n{\n  \"total\": 1,\n  \"page\": 1,\n  \"pagesize\": 30,\n  \"questions\": [\n    {\n      \"tags\": [\n        \"discussion\",\n        \"fun\"\n      ],\n      \"answer_count\": 0,\n      \"favorite_count\": 7,\n      \"closed_date\": 1251308956,\n      \"closed_reason\": \"belongs on meta\",\n      \"migrated\": {\n        \"new_question_id\": 17817,\n        \"on_date\": 1251308956\n      },\n      \"question_timeline_url\": \"/questions/322108/timeline\",\n      \"question_comments_url\": \"/questions/322108/comments\",\n      \"question_answers_url\": \"/questions/322108/answers\",\n      \"question_id\": 322108,\n      \"locked_date\": 1251308959,\n      \"owner\": {\n        \"user_id\": 23234,\n        \"user_type\": \"registered\",\n        \"display_name\": \"Jeff Yates\",\n        \"reputation\": 16689,\n        \"email_hash\": \"3b0d930715cf8f5729e177981f69f44e\"\n      },\n      \"creation_date\": 1227732863,\n      \"last_edit_date\": 1251308945,\n      \"last_activity_date\": 1251308945,\n      \"up_vote_count\": 21,\n      \"down_vote_count\": 10,\n      \"view_count\": 1041,\n      \"score\": 11,\n      \"community_owned\": true,\n      \"title\": \"Are Shakespeare's monkeys here?\"\n    }\n  ]\n}\n</pre>\n",
      "comments": []
    },
    {
      "tags": [
        "feature-request"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1461,
          "accepted": false,
          "answer_comments_url": "/answers/1461/comments",
          "question_id": 1453,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1282492929,
          "last_activity_date": 1282492929,
          "up_vote_count": 5,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 5,
          "community_owned": false,
          "title": "Add List of Libraries to \"Get Started\" sidebar",
          "body": "<p>You know where it would really be noticed? That little announcement strip at the top of the page under the logo.</p>\n\n<p>Maybe:</p>\n\n<blockquote>\n  <p>Writing an app? Check out the <strong>list of libraries</strong>.</p>\n</blockquote>\n",
          "comments": []
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1453/timeline",
      "question_comments_url": "/questions/1453/comments",
      "question_answers_url": "/questions/1453/answers",
      "question_id": 1453,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282440491,
      "last_edit_date": 1284317830,
      "last_activity_date": 1284317830,
      "up_vote_count": 9,
      "down_vote_count": 0,
      "view_count": 103,
      "score": 9,
      "community_owned": false,
      "title": "Add List of Libraries to \"Get Started\" sidebar",
      "body": "<p>I suggest that a link to the <a href=\"http://stackapps.com/questions/288/list-of-libraries\">List of libraries</a> be added to the \"Get Started\" sidebar to provide a clear and obvious discovery path.</p>\n",
      "comments": [
        {
          "comment_id": 3749,
          "creation_date": 1282492245,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1453,
          "post_type": "question",
          "score": 0,
          "body": "Or at least add the link in your question to the sidebar."
        },
        {
          "comment_id": 3750,
          "creation_date": 1282492588,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1453,
          "post_type": "question",
          "score": 0,
          "body": "+1 Otherwise, people don&#39;t even know it exists."
        },
        {
          "comment_id": 3752,
          "creation_date": 1282513375,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1453,
          "post_type": "question",
          "score": 0,
          "body": "@dennis - that is what i meant to say"
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed"
      ],
      "answer_count": 3,
      "answers": [
        {
          "answer_id": 1469,
          "accepted": false,
          "answer_comments_url": "/answers/1469/comments",
          "question_id": 1457,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282615669,
          "last_activity_date": 1282615669,
          "up_vote_count": 1,
          "down_vote_count": 1,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "API usage triggering 503 (Too Many Requests)",
          "body": "<p>API throttling has been fixed.</p>\n\n<p>\"30 reqs per 5 seconds\" is now strictly true again, rather than just true for common use cases.</p>\n",
          "comments": []
        },
        {
          "answer_id": 1516,
          "accepted": false,
          "answer_comments_url": "/answers/1516/comments",
          "question_id": 1457,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "creation_date": 1283161331,
          "last_activity_date": 1283161331,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "API usage triggering 503 (Too Many Requests)",
          "body": "<p>My results from <a href=\"http://soapi.info/Code/JS2/latest/Tests/ThrottleTests.htm\" rel=\"nofollow\">your test</a> across 3 browsers with different JavaScript implementations:</p>\n\n<ul>\n<li>Like <a href=\"http://stackapps.com/questions/1504/new-throttle-does-not-differentiate-between-api-requests-and-requests-made-from-v/1511#1511\">George</a> I made sure to wait 30 sec. between tests</li>\n<li>I've repeated tests here and there with quite different results already, but only started to document them later on, hence might add more over time</li>\n<li>The results are obviously not exactly deterministic, thus pretty irritating</li>\n<li>Likewise there are more failures than expected even (including complete failure on IE), hence something somewhere appears to be unaccounted for somehow still</li>\n</ul>\n\n<h3>Windows 7 / Firefox 3.6.8</h3>\n\n<blockquote>\n  <p>Req./Sec. | Failure point(s)</p>\n  \n  <p>30/5.0 | 34;32;32<br>\n  30/5.5 | 41;34;36<br>\n  30/6.0 | 46;38;40<br>\n  30/6.5 | 47;--;957 (!)<br>\n  30/7.0 | --;--;--  </p>\n</blockquote>\n\n<h3>Windows 7 / Chrome 5.0.375.127</h3>\n\n<blockquote>\n  <p>Req./Sec. | Failure point(s)</p>\n  \n  <p>30/5.0 | 35;32<br>\n  30/5.5 | 36;31<br>\n  30/6.0 | 37;31<br>\n  30/6.5 | --;--<br>\n  30/7.0 | 179;929 (!)  </p>\n</blockquote>\n\n<h3>Windows 7 / IE 8.0.7600.16385</h3>\n\n<blockquote>\n  <p>Req./Sec. | Failure point(s)</p>\n  \n  <p>30/5.0 | 34;32<br>\n  30/5.5 | 41;65<br>\n  30/6.0 | 46;101<br>\n  30/6.5 | 47;256 (!)<br>\n  30/7.0 | 179;415 (!)  </p>\n</blockquote>\n",
          "comments": [
            {
              "comment_id": 3991,
              "creation_date": 1283162192,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "so, the variances per browser are consistently inconsistent? I guess I am going to have to write a log parser that can summarize the actual numbers. Note that the timestamps written to the log are created at the moment that the request is sent, so even if the javascript implementations are variant enough(?) to introduce a temporal shift, the log does not lie. but it can get a bit tricky, as you introduce the waiting times, to calculate the actual interval between any set of requests. Thanks for running the tests. I may build a phone-home feature into that page that will send me the logs"
            },
            {
              "comment_id": 3992,
              "creation_date": 1283162671,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 2,
              "edit_count": 2,
              "body": "Yup, looks like they are consistently inconsistent! A phone-home feature sounds like a good idea for this use case indeed (if feasible effort wise on your part), as manually saving and posting/mailing logs would be both tedious and noisy over time."
            },
            {
              "comment_id": 4077,
              "creation_date": 1283704000,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "results upload is ready when you have time."
            },
            {
              "comment_id": 4106,
              "creation_date": 1283776120,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "@code - cool, just uploaded one iteration as above with pretty similar results; please note that Chrome behavior is particularly puzzling in that <i>all</i> tests fail if started from 30/5.0 and working up, but it works as expected if starting from 30/7.0 and working down - I witnessed this back then already and suspected a driver error on my part, but apparently there is some oddity involved indeed."
            },
            {
              "comment_id": 4107,
              "creation_date": 1283779235,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "that is kinda weird. I will give that a look."
            },
            {
              "comment_id": 4108,
              "creation_date": 1283816644,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "ok, so you are totally right about the order of execution affecting results. i am pretty sure it has to do with caching. where? i am not sure. when a test is started, i completely delete and recreate the throttle which contains the cache so i don&#39;t think it is in javascript. i think that multiple runs on a single page load do not present viable tests. when you load the page, i disable the ui for mandatory 8 seconds to prevent a quick refresh-test start from tripping the wire. if for each test you start with a fresh page load, 5-6 typically fail, 6.5-7 pass more often than not."
            },
            {
              "comment_id": 4109,
              "creation_date": 1283816729,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1516,
              "post_type": "answer",
              "score": 0,
              "body": "another reason that i think caching is happening is that i have made 7 or 8 full runs and my quota is still 8000. so - thanks for pointing that out. yet another anomaly to track down."
            }
          ]
        },
        {
          "answer_id": 1520,
          "accepted": false,
          "answer_comments_url": "/answers/1520/comments",
          "question_id": 1457,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "creation_date": 1283204753,
          "last_activity_date": 1283204753,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "API usage triggering 503 (Too Many Requests)",
          "body": "<p>I just tested the upper limit (30 requests per 7.0 seconds) where test should run to 1000:</p>\n\n<p><strong>Mac OS X Version 10.5.8 - Firefox 3.6.8</strong></p>\n\n<p>30/7.0 | 175;60;161;52;114;60;60;292 (test never passed)</p>\n\n<p><strong>Mac OS X Version 10.5.8 - Chrome 5.0.375.127</strong></p>\n\n<p>30/7.0 | 660;passed;262;261;261;261;261;120</p>\n",
          "comments": [
            {
              "comment_id": 4009,
              "creation_date": 1283206097,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 1,
              "body": "that wide a variance with a passing test on chrome indicates that the js throttle is working in some capacity on MAC. But the failures in Firefox seem abnormal. George reported odd results, e.g. failures @ 7 on linux as well. It looks like I need to fire up some VMs and check the JS. Thanks for running the tests"
            },
            {
              "comment_id": 4010,
              "creation_date": 1283232376,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@code: It would be wonderful if you would create a &#39;phone-home&#39; script that we could run and have it send the results to you :)"
            },
            {
              "comment_id": 4011,
              "creation_date": 1283232548,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Hmm... I tried Safari (using Wine), but I get an error &quot;Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made.&quot; when trying to load the Firebug JS file. Weird."
            },
            {
              "comment_id": 4012,
              "creation_date": 1283287966,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - thanks for trying. I am busy with soapi.notify2 today. I will give this some more attention tomorrow and figure out all of these platform issues as well as a phone home."
            },
            {
              "comment_id": 4013,
              "creation_date": 1283288042,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Great! I&#39;ve kinda got my <a href=\"http://ubuntu.stackexchange.com/questions/3348/how-to-get-lilliput-usb-monitor-running-in-ubuntu\">own problems</a> to deal with right now :)"
            },
            {
              "comment_id": 4057,
              "creation_date": 1283656711,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "hey, i have checked the tests in linux and osx VM using current major browsers and they appear to operate as expected. I will formalize the output and implement an optional results upload tonight to make the efforts of those running the tests contribute to a dataset that can be used to determine the veracity of the tests."
            },
            {
              "comment_id": 4059,
              "creation_date": 1283668340,
              "owner": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@code have you bought a MBP for this purpose :)? Or did you rig up an hackintosh? What about the phone home feature?"
            },
            {
              "comment_id": 4061,
              "creation_date": 1283671769,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "just dusted off an old vmware image I cobbled together last year for another project. other than being 10.5.4 thus limiting the version of safari, it seems to do the job. and all but one of my integration tests run. the one that doesn&#39;t is not a valid test anyway as it tests for a real 404, e.g. bad api url, which is not possible with soapi. unfortunately it is the second test in the suite. lol. so, anyway, I am removing that test and giving the lib a thorough once over on osx and linux this weekend. I expect that there will be no issues. we will see."
            },
            {
              "comment_id": 4071,
              "creation_date": 1283700627,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "oops, i was wrong about being wrong. somehow in the test I upped the request count to 60 per xxx seconds (?!) I must have been distracted. It looks like the throttle works perfectly in Safari, FF and Chrome on OSX , FF and Chrome on Linux - Opera is the redheaded step child of course and needs special case code. But you should be able to run the tests and upload results."
            },
            {
              "comment_id": 4076,
              "creation_date": 1283703966,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "results upload is ready when you have time."
            },
            {
              "comment_id": 4083,
              "creation_date": 1283712592,
              "owner": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 0,
              "body": "@code phoned to your home; if you have stolen all my cookies with your js, go easy with my credit card, remember that i have two sons now :)."
            },
            {
              "comment_id": 4085,
              "creation_date": 1283712858,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1520,
              "post_type": "answer",
              "score": 1,
              "body": "mwuhahahaha - i have one that is the size of two. I will just feed him your cookies. thanks."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1457/timeline",
      "question_comments_url": "/questions/1457/comments",
      "question_answers_url": "/questions/1457/answers",
      "question_id": 1457,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282480903,
      "last_edit_date": 1283705468,
      "last_activity_date": 1283705468,
      "up_vote_count": 3,
      "down_vote_count": 0,
      "view_count": 703,
      "score": 3,
      "community_owned": false,
      "title": "API usage triggering 503 (Too Many Requests)",
      "body": "<h3>Update:</h3>\n\n<p>I generally try to back any claims of bugs and shortcomings with evidence. </p>\n\n<p>I have prepared a test page which you, dear Stack Overflow staff and my fellow developers, can use to ascertain for yourselves whether the api throttle is performing to spec.</p>\n\n<p>You can find these tests here: <a href=\"http://soapi.info/Code/JS2/latest/Tests/ThrottleTests.htm\" rel=\"nofollow\">http://soapi.info/Code/JS2/latest/Tests/ThrottleTests.htm</a></p>\n\n<p>If you choose to run the tests please use the 'Upload Results' button to upload your results into the aggregated dataset which can be viewed/downloaded here: <a href=\"http://soapi.info/Code/JS2/ThrottleTestIndex.aspx\" rel=\"nofollow\">http://soapi.info/Code/JS2/ThrottleTestIndex.aspx</a></p>\n\n<hr>\n\n<p><sub>As of 9/5/2010 I am still not satisfied that the throttle is performing to spec. It seems that we may be edging towards the published <a href=\"http://en.wikipedia.org/wiki/Specification_%28technical_standard%29\" rel=\"nofollow\"><strong>specification</strong></a> of 30 requests per 5 seconds window, but the results are inconsistent, with the most reliable rate @ 30 requests per 6.5.</sub></p>\n\n<p>\nI raise this issue not because I am obsessed with making the most possible requests per second as has been repeatedly implied. I raise this issue because as software developers we deal with specifications. We spend valuable time writing code to specification to ensure the best possible quality of code and user experience. If the upstream data source our apps rely upon does not perform to specification we all suffer - our users are denied the reliable awesomeness of our efforts and are likely to judge those efforts and find them wanting regardless of true merit.\n</p>\n\n<hr>\n\n<p><strong>original post</strong></p>\n\n<p>The throttle is acting up again.</p>\n\n<p>Request rates are well within published guidelines. </p>\n\n<p>see <a href=\"http://stackapps.com/questions/1433#1448\">http://stackapps.com/questions/1433#1448</a></p>\n\n<pre>\nGET /1.0/users/moderators?key=my-key&jsonp=Soapi._jsonp133 HTTP/1.1\nAccept: */*\nReferer: http://localhost:17742/AlphaQuickStart.htm\nAccept-Language: en-US\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)\nAccept-Encoding: gzip, deflate\nHost: api.stackapps.com\nConnection: Keep-Alive\n\n\nHTTP/1.0 503 Service Unavailable\nCache-Control: no-cache\nConnection: close\nContent-Type: text/html\n\n \n  \n    Too Many Requests - Stack Overflow\n   \n  \n     \n          We're sorry...\n          <p>There are an unusual number of requests coming from this IP address.</p>  \n          <p>To protect our users, we can't process any more requests from this IP address right now.</p>\n      <p>We'll restore access as quickly as possible, so try again soon.</p>  \n          <p>If you believe you have reached this page in error, contact us.</p> \n    \n   \n \n</pre>\n\n<p>The nginx proxy seems to have been removed so either there is no api throttle or there is a new throttle that does not work.</p>\n\n<hr>\n\n<p>reports of successful tests are puzzling.</p>\n\n<pre>\n01 throttle: 2010-07-23 23:17:31.458 - request dispatched: interval: 1282630651458ms - http://stackauth.com/1.0/sites?key=xxx\n02 throttle: 2010-07-23 23:17:31.680 - request dispatched: interval: 222ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&key=xxx\n03 throttle: 2010-07-23 23:17:31.696 - request dispatched: interval: 16ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=1&key=xxx\n04 throttle: 2010-07-23 23:17:31.706 - request dispatched: interval: 10ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=2&key=xxx\n05 throttle: 2010-07-23 23:17:31.715 - request dispatched: interval: 9ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=3&key=xxx\n06 throttle: 2010-07-23 23:17:31.724 - request dispatched: interval: 9ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=4&key=xxx\n07 throttle: 2010-07-23 23:17:31.733 - request dispatched: interval: 9ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=5&key=xxx\n08 throttle: 2010-07-23 23:17:31.741 - request dispatched: interval: 8ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=6&key=xxx\n09 throttle: 2010-07-23 23:17:31.749 - request dispatched: interval: 8ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=7&key=xxx\n10 throttle: 2010-07-23 23:17:31.756 - request dispatched: interval: 7ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=8&key=xxx\n11 throttle: 2010-07-23 23:17:31.765 - request dispatched: interval: 9ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=9&key=xxx\n12 throttle: 2010-07-23 23:17:31.775 - request dispatched: interval: 10ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=10&key=xxx\n13 throttle: 2010-07-23 23:17:31.786 - request dispatched: interval: 11ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=11&key=xxx\n14 throttle: 2010-07-23 23:17:31.796 - request dispatched: interval: 10ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=12&key=xxx\n15 throttle: 2010-07-23 23:17:31.807 - request dispatched: interval: 11ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=13&key=xxx\n16 throttle: 2010-07-23 23:17:31.820 - request dispatched: interval: 13ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=14&key=xxx\n17 throttle: 2010-07-23 23:17:31.833 - request dispatched: interval: 13ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=15&key=xxx\n   throttle: 2010-07-23 23:17:31.846 - active queue full\n18 throttle: 2010-07-23 23:17:31.871 - request dispatched: interval: 38ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=16&key=xxx\n19 throttle: 2010-07-23 23:17:31.885 - request dispatched: interval: 14ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=17&key=xxx\n20 throttle: 2010-07-23 23:17:31.897 - request dispatched: interval: 12ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=18&key=xxx\n21 throttle: 2010-07-23 23:17:31.910 - request dispatched: interval: 13ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=19&key=xxx\n   throttle: 2010-07-23 23:17:31.922 - active queue full\n22 throttle: 2010-07-23 23:17:31.999 - request dispatched: interval: 89ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=20&key=xxx\n23 throttle: 2010-07-23 23:17:32.012 - request dispatched: interval: 13ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=21&key=xxx\n24 throttle: 2010-07-23 23:17:32.028 - request dispatched: interval: 16ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=22&key=xxx\n25 throttle: 2010-07-23 23:17:32.042 - request dispatched: interval: 14ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=23&key=xxx\n26 throttle: 2010-07-23 23:17:32.055 - request dispatched: interval: 12ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=24&key=xxx\n27 throttle: 2010-07-23 23:17:32.068 - request dispatched: interval: 14ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=25&key=xxx\n28 throttle: 2010-07-23 23:17:32.078 - request dispatched: interval: 10ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=26&key=xxx\n   throttle: 2010-07-23 23:17:32.095 - active queue full\n29 throttle: 2010-07-23 23:17:32.116 - request dispatched: interval: 38ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=27&key=xxx\n30 throttle: 2010-07-23 23:17:32.128 - request dispatched: interval: 12ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=28&key=xxx\n   throttle: 2010-07-23 23:17:32.136 - waiting 4822ms\n31 throttle: 2010-07-23 23:17:36.964 - request dispatched: interval: 4836ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=29&key=xxx\n   throttle: 2010-07-23 23:17:36.998 - waiting 182ms\n32 throttle: 2010-07-23 23:17:37.181 - request dispatched: interval: 217ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=30&key=xxx\n33 throttle: 2010-07-23 23:17:37.203 - request dispatched: interval: 22ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=31&key=xxx\n34 throttle: 2010-07-23 23:17:37.225 - request dispatched: interval: 22ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=32&key=xxx\n35 throttle: 2010-07-23 23:17:37.247 - request dispatched: interval: 22ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=33&key=xxx   \n36 throttle: 2010-07-23 23:17:37.272 - request dispatched: interval: 25ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=34&key=xxx\n37 throttle: 2010-07-23 23:17:37.299 - request dispatched: interval: 27ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=35&key=xxx\n38 throttle: 2010-07-23 23:17:37.321 - request dispatched: interval: 22ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=36&key=xxx\n39 throttle: 2010-07-23 23:17:37.342 - request dispatched: interval: 21ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=37&key=xxx\n\nerror: /tags failed http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=34&key=xxx --> @ 23:17:37.272\n\nthrottle: 2010-07-23 23:17:37.375 - request dispatched: interval: 33ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=38&key=xxx\nerror: /tags failed http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=35&key=xxx\nerror: /tags failed http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=33&key=xxx\nerror: /tags failed http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=36&key=xxx\nthrottle: 2010-07-23 23:17:37.443 - request dispatched: interval: 68ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=39&key=xxx\nerror: /tags failed http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=37&key=xxx\nthrottle: 2010-07-23 23:17:37.473 - request dispatched: interval: 30ms - http://api.meta.stackoverflow.com/1.0/tags?pagesize=1&page=40&key=xxx\n\n</pre>\n",
      "comments": [
        {
          "comment_id": 3806,
          "creation_date": 1282601284,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "The API throttle is being looked into, the sstatic throttle is [status-bydesign].  That&#39;s been said elsewhere.  Chill, this only affects server [app]s running right up against the wire; its not the end of the world."
        },
        {
          "comment_id": 4046,
          "creation_date": 1283636736,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@code: Whoa! Just for kicks, I ran your test suite again at 6.5 req. / sec. Suddenly I could no longer access StackApps! Are they throttling access to the site now?!?!?"
        },
        {
          "comment_id": 4056,
          "creation_date": 1283656538,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@geo - yes, that has been covered in another question, which was denied, and is a slightly different issue than the throttle simply does not perform as advertised. By the way, I have checked the tests in all major browsers on linux and osx and they appear to operate as expected when the instructions are observed so feel free to carefully run the tests and post your results here."
        },
        {
          "comment_id": 4058,
          "creation_date": 1283660700,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@code: I feel bad for you - here you&#39;ve designed this awesome library and I can&#39;t get it to work quite right. Maybe this will help: would you be able to try my app? Just visit <a href=\"http://stackcenter.quickmediasolutions.com/display2.php\" rel=\"nofollow\">this</a> page and flip through the tabs to see if any of the sites are failing. Then we&#39;ll have a better idea of whether it&#39;s just me or there really is a problem."
        },
        {
          "comment_id": 4063,
          "creation_date": 1283672560,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@geo - your app works just fine, as far as i can tell, on all windows browsers, ff,opera,chrome and safari on osx, opera, ff and chrome on linux. I don&#39;t see any failures."
        },
        {
          "comment_id": 4074,
          "creation_date": 1283703136,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "Well, I guess it&#39;s just me... though I can&#39;t imagine why. Maybe it&#39;s because I&#39;m using Chrome 6 beta. Who knows. Thanks for trying it. And in a few hours you&#39;ll be able to list StackCenter as an example of a Soapi2.JS app."
        },
        {
          "comment_id": 4075,
          "creation_date": 1283703780,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@geo - run the throttle tests and put your name in the upload message box so we can check the version. I am getting good results on both the unit tests and the throttle tests running chrome 6.0.472.53 on ubuntu. p.s. you should know better than to develop using beta browsers."
        },
        {
          "comment_id": 4088,
          "creation_date": 1283722195,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@code: No, I developed it on Firefox :) It&#39;s just that I use Chrome for day-to-day browsing. I&#39;m glad to hear my app&#39;s working, though."
        },
        {
          "comment_id": 4089,
          "creation_date": 1283724934,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "body": "@code: I ran your test in Ubuntu 10.04 64-bit and got quite a bit further than last time. I also ran it in my Fedora 11 VM."
        },
        {
          "comment_id": 4104,
          "creation_date": 1283740876,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1457,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@geo - i see you uploaded with annotation - perfect. The soapi.js2 software throttle is definitely working as expected, not the <code>wait</code> intervals of more than 7 seconds between any n+0=&gt;n+30th request. thank you."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-norepro"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1511,
          "accepted": false,
          "answer_comments_url": "/answers/1511/comments",
          "question_id": 1504,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1283117328,
          "last_activity_date": 1283117328,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "new throttle does not differentiate between api requests and requests made from viewing the site",
          "body": "<p>My results from <a href=\"http://soapi.info/Code/JS2/latest/Tests/ThrottleTests.htm\" rel=\"nofollow\">this</a> page: <em>(being sure to wait 30 sec. between tests)</em></p>\n\n<hr>\n\n<pre>\nRate:                   Failure point:\n_________________________________________\n\n30 req. / 5 sec.        Page 32\n30 req. / 5.5 sec.      Page 32\n30 req. / 6 sec.        Page 31\n30 req. / 6.5 sec.      Page 31\n30 req. / 7 sec.        Page 31\n</pre>\n\n<p>I also was careful on the last one to make sure no other apps where making requests 30 sec. before the test.</p>\n",
          "comments": [
            {
              "comment_id": 3977,
              "creation_date": 1283121230,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1511,
              "post_type": "answer",
              "score": 0,
              "body": "interesting. you should not be failing @ 6.5. I wonder if there is a platform issue going on with Soapi.JS2. Could you copy the log results into an email? And for future reference, this <a href=\"http://stackapps.com/questions/1457/\">stackapps.com/questions/1457</a> is the question we need to place results in. I am really interested in seeing the logs from the runs you made above - as well as from windows, next time you fire it up."
            },
            {
              "comment_id": 3981,
              "creation_date": 1283132295,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1511,
              "post_type": "answer",
              "score": 0,
              "body": "@code: I might not get to it &#39;till tomorrow, but I&#39;ll try to do that. Would you like me to try it in Firefox?"
            },
            {
              "comment_id": 3982,
              "creation_date": 1283132335,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1511,
              "post_type": "answer",
              "score": 0,
              "body": "The results above are from Chrome."
            },
            {
              "comment_id": 3983,
              "creation_date": 1283134878,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1511,
              "post_type": "answer",
              "score": 0,
              "body": "It shouldn&#39;t matter but since you are on linux, yeah, FF is probably the safer bet. I hope I don&#39;t have a problem with linux/chrome. I would really like to see the logs. Thanks for helping."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1504/timeline",
      "question_comments_url": "/questions/1504/comments",
      "question_answers_url": "/questions/1504/answers",
      "question_id": 1504,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1283024803,
      "last_edit_date": 1283703461,
      "last_activity_date": 1283703461,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 95,
      "score": 1,
      "community_owned": false,
      "title": "new throttle does not differentiate between api requests and requests made from viewing the site",
      "body": "<h3>Update:</h3>\n\n<p><strike>I am unable to reproduce the case of interactive browsing affecting app quota. And will concede that the failures that prompted this post were likely far edge cases.</p>\n\n<p>The remaining issue of a badly behaved app failing and thus inducing a browsing DOS is not a bug in the throttle, simply a consequence of running a badly behaved (designed) app.</p>\n\n<p>It was the other way around that concerned me i.e. interactive browsing eating app quota and inducing an all-around DOS.</p>\n\n<p>I am not yet completely convinced that this is not a possibility, but until the throttle rate issues is cleared up, it is near impossible to write a test that can get reproduce what is admittedly and edge case (i hope).\n </strike></p>\n\n<p>The new throttle does not differentiate between programmatic API requests and requests made by a browser while viewing a Stack Exchange site.</p>\n\n<p>This is a <em>very</em> serious issue.</p>\n\n<p>The implication is that every app written against the API must warn the user not to view any Stack Exchange site while using (or x number of seconds before or after starting) the app or complete app and browsing failure could result.</p>\n\n<p>Given the 'if you violate the throttle you, the response is undefined as are the consequences which could include being banned for an indeterminant period of time' (paraphrased, correct me if I am wrong) specification, this is best avoided.</p>\n\n<p>Some have gone to extraordinary lengths to comply with the published throttle guidance, which I am not sure is yet accurate, and to lump the end-user's browsing activity in with the throttle quota is an impossible criteria to manage.</p>\n\n<p>This behaviour was introduced with the new throttle and I can only assume that this is an oversight and hope that it will be resolved.</p>\n\n<p>The obvious solution is to separate <a href=\"http://api.xxxx\" rel=\"nofollow\">http://api.xxxx</a> and <a href=\"http://xxxx\" rel=\"nofollow\">http://xxxx</a> requests from each IP into distinct quota buckets.</p>\n\n<h3>Repro</h3>\n\n<p>This issue can be reproduced by browsing a stack exchange site while running the <a href=\"http://stackapps.com/questions/1457/api-usage-triggering-503-too-many-requests\">throttle tests</a> I have made available. </p>\n\n<p>Granted, you will probably have to browse fairly quickly to ensure a failure in this test, but the point is that if an app is in the middle of a burst, say polling your (or your users) accounts and checking for data on those accounts, which most apps do, meanwhile you (or your users) are browsing a stack exchange site there is a possibility that a total DOS will occur.</p>\n\n<p>Again, let me stress that is is not an issue of squeezing every single possible request per second from the API. It is about having a clearly defined specification that can be relied upon. </p>\n\n<p>Lumping API traffic in with browsing traffic over which the developer has no control presents an unmanageable criteria.</p>\n",
      "comments": [
        {
          "comment_id": 3957,
          "creation_date": 1283043604,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@kevin - trip the wire with api requests and then try to browse a site. i think you will find a repro going that direction. the other direction is a less common story but the difference is academic."
        },
        {
          "comment_id": 3958,
          "creation_date": 1283044196,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 1,
          "body": "@code poet - what you&#39;re describing is not a violation of the published throttle guidelines.  If you &quot;trip the wire&quot; we reserve the right to do <i>anything</i>, which includes a network wide ban given that its a <i>thing</i>."
        },
        {
          "comment_id": 3959,
          "creation_date": 1283044509,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@kevin - but it works the other way around, browsing while using an app, over which app developers have no control leading to an uncontrollable risk of denial to both the app and the browser. There is a clear delineation between api usage and web browsing."
        },
        {
          "comment_id": 3960,
          "creation_date": 1283044776,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@code: If you can point me to a JS page that pushes beyond the throttle, I&#39;ll give it a try and see if I can reproduce it."
        },
        {
          "comment_id": 3961,
          "creation_date": 1283045372,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@kevin and george, I am now having a hard time producing a repro case of browsing affecting api quota myself. Let me get back to you. this may be a non-issue."
        },
        {
          "comment_id": 3962,
          "creation_date": 1283046153,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@geo and kevin - confirm no-repro. George, your results from <a href=\"http://stackapps.com/questions/1457/\">stackapps.com/questions/1457</a> would be appreciated."
        },
        {
          "comment_id": 3964,
          "creation_date": 1283064000,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@code: Okay, for <code>&#39;30 req. &#47; 5 sec.&#39;</code>, I got an error for request #31. For <code>&#39;30 req. &#47; 5.5 sec.&#39;</code>, I got an error for request #32. For <code>&#39;30 req. &#47; 6 sec.&#39;</code>, I got an error for request #31. And for <code>&#39;30 req. &#47; 6.5 sec.&#39;</code>, I got an error for request #31 again. Hope that helps... and I hope I did it right :)"
        },
        {
          "comment_id": 3966,
          "creation_date": 1283074889,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@geo - that you are failing on the same request each time is weird and that you are getting a failure at all with 6.5 is even more weird, as this seems to be the current viable threshold. it sounds like you might not have waited 30 seconds between tests. if you go too early, before the throttle has cooled down, you get a delay but and an alert but no test is actually run - notice the first 2 lines in the log, they will tell you what rate is set for the Soapi throttle. If you could try it again and wait 30 seconds between tests you should get valid results. thanks for running the tests."
        },
        {
          "comment_id": 3967,
          "creation_date": 1283075117,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@geo - and it should be obvious that you should not have any other apps that use the API running when you test. That brings up another sticky issue for developers; what if a user is running more than one distinct app? hmmm.... looks like we have to add a warning line to an apps readme if our app is a quota hog. And could you please post your results as an answer on the other post?"
        },
        {
          "comment_id": 3968,
          "creation_date": 1283075370,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@geo - and really, an app does not have to be a quota hog. 2 apps making 20 requests within 5 seconds of each other will kill them both and the browser. This makes a case for the most obvious solution of the api server introducing latency instead of forcing the developer to implement throttling, but that is another issue. The one at hand is determining if the current API throttle is operating to spec."
        },
        {
          "comment_id": 3974,
          "creation_date": 1283099123,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@code: Okay, I&#39;ll rerun them in a bit. One small sidenote: I was unable to reproduce the browser issue - what steps are needed for that?"
        },
        {
          "comment_id": 3975,
          "creation_date": 1283117358,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1504,
          "post_type": "question",
          "score": 0,
          "body": "@code: Hope my answer below helps... hope I&#39;m not doing something wrong."
        }
      ]
    },
    {
      "tags": [
        "app",
        "website"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 544,
          "accepted": false,
          "answer_comments_url": "/answers/544/comments",
          "question_id": 543,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1275698413,
          "last_activity_date": 1275698413,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "SOREP: Trilogy Site Ranking - For those who need to know",
          "body": "<p>I see that the only reason you didn't include Jeff's StackApps score is because <strong>I</strong> have the top spot!</p>\n\n<p><img src=\"http://files.quickmediasolutions.com/stackapps_me.png\"></p>\n\n<p>Jokes aside, that is awesome and I can't wait to play with it further.</p>\n",
          "comments": [
            {
              "comment_id": 898,
              "creation_date": 1275698571,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 544,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "Actually I just copied the announcement from the meta.stackoverflow question. There was no api or stackapps then. I chose jeff because his userid was all 1s across the board (and homage to those with the kill button is never a bad idea)."
            },
            {
              "comment_id": 901,
              "creation_date": 1275698723,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 544,
              "post_type": "answer",
              "score": 0,
              "body": "Right... but you can only guess how I feel knowing that Jeff is in the top 1% for every site but this one - and I&#39;m beating him."
            }
          ]
        }
      ],
      "favorite_count": 4,
      "question_timeline_url": "/questions/543/timeline",
      "question_comments_url": "/questions/543/comments",
      "question_answers_url": "/questions/543/answers",
      "question_id": 543,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1275697981,
      "last_edit_date": 1280723040,
      "last_activity_date": 1283315808,
      "up_vote_count": 11,
      "down_vote_count": 0,
      "view_count": 294,
      "score": 11,
      "community_owned": false,
      "title": "SOREP: Trilogy Site Ranking - For those who need to know",
      "body": "<p><strong>SOREP</strong> is a service that does a nightly index of all users ordered by reputation and makes that information available via REST.</p>\n\n<p>The primary use of this information is to add a <code>top xx%</code> to your <a href=\"http://stackapps.com/users/flair\" rel=\"nofollow\">flair</a>. See examples below. The <code>top xx%</code> has a mouseover that indicates your acutal ranking, e.g. <code>392 out of 148,200</code>.</p>\n\n<p>This service has been running for some months using screen scraping but upon creation of SOAPI-CS I figured I would dogfood it on my own stuff.</p>\n\n<p>I am pleased to say that not only is using the API (and SOAPI-CS) much faster, it also reduced the complexity of the code by orders of magnitude. I am pleased.</p>\n\n<h2>Original announcement:</h2>\n\n<p>I see a few questions on meta.stackoverflow.com regarding user ranking. There are several existing lists but they are focused primarily on users with higher scores.</p>\n\n<p>So, I wrote a small applet that, via a trickle pull, indexes all users for the trilogy and meta down to the 100 rep mark, in order of appearance.</p>\n\n<p>The 100 rep cutoff seems reasonable. On StackOverflow, the vast majority of users are &lt; 100 and pulling that data seems over the top frivolous.</p>\n\n<p>You may access this data in several ways</p>\n\n<p><strong>INTERACTIVE:</strong></p>\n\n<p><a href=\"http://skysanders.net/tools/sorep/default.aspx\" rel=\"nofollow\">http://skysanders.net/tools/sorep/default.aspx</a> (detailed usage information here)</p>\n\n<p><strong>AUTOGET:</strong> (for you Benjol)</p>\n\n<p><a href=\"http://skysanders.net/tools/sorep/default.aspx?site=stackoverflow.com&amp;userId=1\" rel=\"nofollow\">http://skysanders.net/tools/sorep/default.aspx?site=stackoverflow.com&amp;userId=1</a></p>\n\n<p><strong>JSON:</strong></p>\n\n<p><a href=\"http://skysanders.net/tools/sorep/SEStats.ashx?site=stackoverflow.com&amp;userId=1\" rel=\"nofollow\">http://skysanders.net/tools/sorep/SEStats.ashx?site=stackoverflow.com&amp;userId=1</a></p>\n\n<p><strong>JSONP:</strong></p>\n\n<p><a href=\"http://skysanders.net/tools/sorep/SEStats.ashx?site=stackoverflow.com&amp;userId=1&amp;callback=foo\" rel=\"nofollow\">http://skysanders.net/tools/sorep/SEStats.ashx?site=stackoverflow.com&amp;userId=1&amp;callback=foo</a></p>\n\n<p><strong>Flair</strong></p>\n\n<p>An example of using ranking in Flair is available on the interactive page.</p>\n\n<p><img src=\"http://skysanders.net/images/RankedFlair.PNG\" alt=\"alt text\"></p>\n",
      "comments": [
        {
          "comment_id": 897,
          "creation_date": 1275698545,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "Hmmm... Jeff&#39;s StackApps score is missing... see below!"
        },
        {
          "comment_id": 902,
          "creation_date": 1275698917,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "@George - The page and this post&#39;s content are several months old. I just updated the indexing service to use the API. I will have to find myself with some elusive non-allocated time to bother with details like that."
        },
        {
          "comment_id": 903,
          "creation_date": 1275699053,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "It&#39;s just a joke :)"
        },
        {
          "comment_id": 2310,
          "creation_date": 1278127187,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "@code: The demo on your site has stopped working."
        },
        {
          "comment_id": 2312,
          "creation_date": 1278129598,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "@geo - all systems are green and it is behaving as expected. what problem are you having?"
        },
        {
          "comment_id": 2313,
          "creation_date": 1278129789,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "@code: Oh, nvm. It&#39;s working now. Before, the site drop-down was empty."
        },
        {
          "comment_id": 2314,
          "creation_date": 1278130308,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "body": "@geo - skysanders.net is a hosted site and they cycle down idle appdomains. if it has been idle for a while, it has to come back up and jit some code. sometimes it takes a sec."
        },
        {
          "comment_id": 6270,
          "creation_date": 1310923113,
          "owner": {
            "user_id": 4112,
            "user_type": "registered",
            "display_name": "Jeremy Banks",
            "reputation": 386,
            "email_hash": "bd192f0a40308fe9ecb9aa2a72ee8d81"
          },
          "post_id": 543,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "I was trying this, and the results seemed really old."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-norepro"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1506,
          "accepted": true,
          "answer_comments_url": "/answers/1506/comments",
          "question_id": 1503,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1283031224,
          "last_activity_date": 1283031224,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "issues with 'edit_count' field",
          "body": "<p>You're misreading the docs, <code>edit_count</code> present on comments which are sometimes returned with answers.  It is not present on the \"answer\" itself.</p>\n\n<p>The null-ability of <code>edit_count</code> is already on the list for \"review in a subsequent version,\" but will not be changed in v1 for obvious backwards compatibility reasons.</p>\n",
          "comments": [
            {
              "comment_id": 3954,
              "creation_date": 1283031398,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1506,
              "post_type": "answer",
              "score": 0,
              "body": "you are correct. i was reviewing json and misread the nesting depth."
            }
          ]
        }
      ],
      "accepted_answer_id": 1506,
      "favorite_count": 0,
      "question_timeline_url": "/questions/1503/timeline",
      "question_comments_url": "/questions/1503/comments",
      "question_answers_url": "/questions/1503/answers",
      "question_id": 1503,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1283020425,
      "last_edit_date": 1283031515,
      "last_activity_date": 1283031515,
      "up_vote_count": 0,
      "down_vote_count": 0,
      "view_count": 37,
      "score": 0,
      "community_owned": false,
      "title": "issues with 'edit_count' field",
      "body": "<h3>Update</h3>\n\n<p>other than the nullable issue, which is under review, the rest of this question is based on a mistake I made reading the nesting depth of the json result.</p>\n\n<p>Disregard. Deletion is considered.</p>\n\n<hr>\n\n<p>regarding the 'edit_count' field found on <em>nested</em> answers and comments.</p>\n\n<ol>\n<li><p>is not actually returned in any results (that I have seen). </p>\n\n<p>The rest of the issues assume that it will be returned</p></li>\n<li>it is documented only on <em>some</em> nested answer collections and not on others, and not the primary route for the type</li>\n<li>questions have no edit_count field, nested or otherwise</li>\n<li>it is optional.</li>\n</ol>\n\n<p>Assuming that this field will actually be populated in the future, it would be helpful if it was implemented consistently and if it was <em>not</em> optional. A count field does not typically lend itself to being nullable; either there have been edits or there have not. </p>\n\n<p>Introducing ambiguity to an integer value requires enough client side code as to make the field impractical to use.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "support"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1500,
          "accepted": false,
          "answer_comments_url": "/answers/1500/comments",
          "question_id": 1499,
          "owner": {
            "user_id": 4,
            "user_type": "moderator",
            "display_name": "Jeff Atwood",
            "reputation": 750,
            "email_hash": "51d623f33f8b83095db84ff35e15dbe8"
          },
          "creation_date": 1282892326,
          "last_edit_date": 1282926414,
          "last_activity_date": 1282926414,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "are clientaccesspolicy.xml and crossdomain.xml excluded from throttling",
          "body": "<p>Right now this is more of a theoretical problem than an actual one.</p>\n\n<p>If you have a documented case of this being a problem in a production system, with thousands of real world users, do let us know, and we'll follow up.</p>\n",
          "comments": [
            {
              "comment_id": 3936,
              "creation_date": 1282918295,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1500,
              "post_type": "answer",
              "score": 0,
              "body": "jeff, i didn&#39;t say there was a problem. when i have an issue, i make it clear that there is a problem and support it with evidence. this is simply a question, which you have not answered."
            },
            {
              "comment_id": 3941,
              "creation_date": 1282932930,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1500,
              "post_type": "answer",
              "score": 1,
              "body": "@code, you really don&#39;t have to sound so hostile all of the time.  It&#39;s really intense.  I feel like Jeff implicitly said that those files are indeed throttled too. - &quot;this is more of a theoretical problem than an actual one&quot; (So, there is, in theory, a problem with the files being throttled)"
            },
            {
              "comment_id": 3942,
              "creation_date": 1282933673,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "post_id": 1500,
              "post_type": "answer",
              "score": 2,
              "body": "@jjn - i am not hostile. i asked a specific question which was replied to with an implication, which is not an answer. i am a programmer who is writing code against an ostensibly professional api. when i ask a specific question regarding this api, which we were invited to code against, i appreciate direct and accurate answers and am simply making this clear. the number of times that i have simply played along and keep asking the same question in different ways in order to get an authoritative response have left me weary. that&#39;s what i am, tired."
            },
            {
              "comment_id": 3951,
              "creation_date": 1282938795,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1500,
              "post_type": "answer",
              "score": 0,
              "body": "(@code, to be clear, I don&#39;t actually think you are hostile, I just said that you <i>sound</i> hostile)  But, I can understand your frustration."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1499/timeline",
      "question_comments_url": "/questions/1499/comments",
      "question_answers_url": "/questions/1499/answers",
      "question_id": 1499,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282877510,
      "last_activity_date": 1282926414,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 135,
      "score": 2,
      "community_owned": false,
      "title": "are clientaccesspolicy.xml and crossdomain.xml excluded from throttling",
      "body": "<p>These files are requested by the user agent as needed and the programmer has no knowledge or control over these requests.</p>\n\n<p>The abuse potential connected with these files is nil(?)</p>\n\n<p>It seems that it would be a good idea to exclude them from any throttle count.</p>\n",
      "comments": [
        {
          "comment_id": 3925,
          "creation_date": 1282883929,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1499,
          "post_type": "question",
          "score": 0,
          "body": "Are they actually throttling those files...? Wow."
        },
        {
          "comment_id": 3935,
          "creation_date": 1282917937,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1499,
          "post_type": "question",
          "score": 0,
          "body": "@geo - i don&#39;t know. that is why i am asking."
        },
        {
          "comment_id": 3939,
          "creation_date": 1282923030,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1499,
          "post_type": "question",
          "score": 0,
          "body": "It seems from Jeff&#39;s answer that they are :("
        }
      ]
    },
    {
      "tags": [
        "support"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1495,
          "accepted": true,
          "answer_comments_url": "/answers/1495/comments",
          "question_id": 1491,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282848924,
          "last_activity_date": 1282848924,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "api performance slow",
          "body": "<p>Its slow because the response is so large, and it touches a large amount of data per-question (all answers and comments, by definition).</p>\n\n<p>Its equivalent to visiting every question on the first couple pages of SO, after all.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 1495,
      "favorite_count": 0,
      "question_timeline_url": "/questions/1491/timeline",
      "question_comments_url": "/questions/1491/comments",
      "question_answers_url": "/questions/1491/answers",
      "question_id": 1491,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282841051,
      "last_activity_date": 1282848924,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 93,
      "score": 1,
      "community_owned": false,
      "title": "api performance slow",
      "body": "<p>this query takes ~30 seconds. Seems abnormal to me</p>\n\n<p><a href=\"http://api.stackapps.com/1.0/users/14/questions?pagesize=100&amp;answers=true&amp;body=true&amp;comments=true&amp;page=1\">http://api.stackapps.com/1.0/users/14/questions?pagesize=100&amp;answers=true&amp;body=true&amp;comments=true&amp;page=1</a></p>\n",
      "comments": [
        {
          "comment_id": 3908,
          "creation_date": 1282846125,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1491,
          "post_type": "question",
          "score": 0,
          "body": "The result is really large...maybe it just takes that long..."
        },
        {
          "comment_id": 3910,
          "creation_date": 1282846498,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1491,
          "post_type": "question",
          "score": 0,
          "body": "<a href=\"http://api.stackapps.com/1.0/users/14/questions?pagesize=100&amp;answers=false&amp;body=false&amp;comments=false&amp;page=1\">This query</a> returns almost instantly."
        },
        {
          "comment_id": 3912,
          "creation_date": 1282848236,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1491,
          "post_type": "question",
          "score": 0,
          "body": "@jjn - yeah. but seems to me that fetching with answers comments and body did not previously demonstrate such latency but I have no metrics. thanks for the perspective."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "reputation",
        "reputation-audit",
        "reputation-graph"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1484,
          "accepted": false,
          "answer_comments_url": "/answers/1484/comments",
          "question_id": 1431,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "creation_date": 1282749287,
          "last_activity_date": 1282749287,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "/users/{id}/reputation != xxx.com/reputation",
          "body": "<p>Obviously this would best be answered by the one(s) in charge of the API design, but here is my analysis:</p>\n\n<p>The two reputation datasets are shaped quite differently indeed and this does matter in various ways - as such I expect this to be more or less <code>status-bydesign</code>:</p>\n\n<h3>Dataset shape</h3>\n\n<ul>\n<li><p>The <a href=\"http://stackoverflow.com/reputation\">reputation audit</a> is composed of individual reputation change events <strong>at the time they occur</strong>, i.e. any event triggering a change in a users reputation is logged with a single entry, grouped by day.</p></li>\n<li><p>The <a href=\"http://api.stackoverflow.com/1.0/help/method?method=users/%7Bid%7D/reputation\">reputation route</a> is composed of accumulated reputation changes per post they apply to <strong>if affected within selected time frame</strong>, i.e. a post will only be included in the result if there has been one ore more reputation change events within the selected time frame; the <em>ondate</em> field seems to denote the most recent reputation change date accordingly.</p></li>\n</ul>\n\n<p>Your example includes 480 reputation change events (as per audit) affecting 159 posts (as per API), the latter grouped by most recent reputation change date of the respective post accordingly (if my interpretation is correct) - comparing two dates from these entirely differently shaped datasets will naturally be pretty inconclusive ;)</p>\n\n<h3>Further observations/implications</h3>\n\n<ul>\n<li><p>Reputation changes from <strong>down votes</strong> on other posts are included in the audit but <strong>are excluded from the route</strong> because this would compromise anonymous voting otherwise (see my answer on <a href=\"http://stackapps.com/questions/658/is-there-a-way-to-determine-total-number-of-upvotes-and-downvotes-etc-for-a-use/1483#1483\">a related <code>feature-request</code></a> as well).</p></li>\n<li><p>Reputation changes from <strong>bonuses</strong> are included in the audit but not in the route as you observed already; this makes sense in so far they cannot be assigned to any particular post.</p></li>\n<li><p>Reputation changes from <strong>bounties</strong> on the other hand are included in the route as well; as with all other posts they will be listed with the most recent reputation change date, be it the bounty or any other activity.</p></li>\n<li><p>Reputation changes from <strong>accepting answers</strong> are <strong>definitely missing</strong>; for this I don't see any reason in principle and it might be qualified as a bug therefore, but see <em>Conclusion</em> below for another point of view.</p></li>\n<li><p>Finally there has been an off by one day issue between audit and API while exploring all this which I've not investigated any further, but this may account for minor differences in the result as well.</p></li>\n</ul>\n\n<h3>Conclusion</h3>\n\n<p>The API design will allow to replicate the reputation graph quite well, but not so the reputation audit, the latter being partially enforced by the needs to protect the anonymity of down votes.</p>\n\n<p>While the missing reputation for accepting an answer could be qualified as a bug indeed, fixing it would defeat rebuilding the reputation graph feature, where these points are excluded as well.</p>\n\n<p>All in all the main differences observed <em>seem</em> to stem from the distinct dataset shapes (i.e. I haven't analyzed any difference in the result set at hand in detail and it is still irritating that the API results are <em>noticeably higher</em> despite the missing points from accepting answers).</p>\n\n<p>Whether this dataset shape has been chosen deliberately like so or been more or less naturally deduced from the reputation features available is not mine to speculate about.</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1431/timeline",
      "question_comments_url": "/questions/1431/comments",
      "question_answers_url": "/questions/1431/answers",
      "question_id": 1431,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282228590,
      "last_edit_date": 1282749580,
      "last_activity_date": 1282749580,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 728,
      "score": 4,
      "community_owned": false,
      "title": "/users/{id}/reputation != xxx.com/reputation",
      "body": "<p>I realize that the shape of the data coming from the API may be different than that reported by the xxx/reputation url, but there seem to be some striking disparities.</p>\n\n<p>see 08/12 and 08/11 in both dumps for an example.</p>\n\n<p><strong>My stackapps.com/reputation graph</strong></p>\n\n<pre>\ntotal votes: 520\n-- bonuses   (2100)\n 2       379 (10)\n 2       386 (10)\n 2       386 (10)\n 2       386 (10)\n 2       386 (10)\n 2       386 (10)\n-- 2010-05-31 rep +60   = 2161      \n 2       386 (10)\n 2       425 (10)\n 1       433 (2)\n 1       431 (2)\n 1       430 (2)\n 2       436 (10)\n 2       386 (10)\n 1       437 (2)\n 2       386 (10)\n 2       436 (10)\n 2       386 (10)\n-- 2010-06-01 rep +78   = 2239      \n 2       454 (10)\n 2       454 (10)\n 1       454 (15)\n 1       428 (2)\n 2       466 (10)\n 2       454 (10)\n-- 2010-06-02 rep +57   = 2296      \n 2       386 (10)\n-- 2010-06-03 rep +10   = 2306      \n 1       522 (2)\n 2       532 (10)\n 2       532 (10)\n 2       494 (10)\n 2       534 (10)\n 2       494 (10)\n 2       386 (10)\n 2       534 (10)\n-- 2010-06-04 rep +72   = 2378      \n 2       543 (10)\n 2       543 (10)\n 2       534 (10)\n 2       534 (10)\n 2       534 (10)\n 2       534 (10)\n 3       555 (-1)\n 2       543 (10)\n-- 2010-06-05 rep +69   = 2447      \n 2       560 (10)\n 1       532 (15)\n 1       568 (2)\n 2       543 (10)\n 2       387 (10)\n-- 2010-06-06 rep +47   = 2494      \n 2       386 (10)\n 2       588 (10)\n 2       386 (10)\n 2       543 (10)\n 2       534 (10)\n-- 2010-06-07 rep +50   = 2544      \n 2       603 (10)\n 2       534 (10)\n 2       386 (10)\n 2       601 (10)\n 1       609 (2)\n 2       603 (10)\n-- 2010-06-08 rep +52   = 2596      \n 1       466 (15)\n 2       603 (10)\n 2       603 (10)\n 2       603 (10)\n 2       543 (10)\n 2       534 (10)\n-- 2010-06-09 rep +65   = 2661      \n 2       628 (10)\n 2       628 (10)\n 2       494 (10)\n 2       494 (10)\n 2       631 (10)\n 2       631 (10)\n 1       632 (2)\n 2       628 (10)\n 2       631 (10)\n 2       631 (10)\n 2       494 (10)\n 2       631 (10)\n 2       513 (10)\n 2       494 (10)\n 2       631 (10)\n-- 2010-06-10 rep +142  = 2803      \n 2       630 (10)\n 2       534 (10)\n 2       648 (10)\n 2       648 (10)\n 2       648 (10)\n 3       649 (-1)\n 2       648 (10)\n 2       648 (10)\n 2       648 (10)\n 2       631 (10)\n 2       648 (10)\n 2       603 (10)\n 2       631 (10)\n-- 2010-06-11 rep +119  = 2922      \n 2       630 (10)\n 2       666 (10)\n 2       672 (10)\n 2       672 (10)\n-- 2010-06-12 rep +40   = 2962      \n 2       685 (10)\n 2       685 (10)\n 2       494 (10)\n 2       513 (10)\n 2       662 (10)\n-- 2010-06-13 rep +50   = 3012      \n 8       666 (-300)\n 2       699 (10)\n 2       386 (10)\n 2       709 (10)\n-- 2010-06-14 rep -270  = 2742      \n 2       710 (10)\n 2       710 (10)\n 2       630 (10)\n 1       721 (2)\n 1       719 (2)\n 2       707 (10)\n 2       709 (10)\n 1       724 (2)\n 1       727 (2)\n 2       730 (10)\n 1       733 (2)\n 2       707 (10)\n 2       730 (10)\n-- 2010-06-15 rep +90   = 2832      \n 2       739 (10)\n 2       739 (10)\n 2       494 (10)\n 2       631 (10)\n 2       740 (10)\n 2       740 (10)\n 2       740 (10)\n 2       751 (10)\n 2       752 (10)\n 3       754 (-1)\n-- 2010-06-16 rep +89   = 2921      \n 2       752 (10)\n 2       751 (10)\n 2       740 (10)\n 2       763 (10)\n 2       763 (10)\n 2       763 (10)\n 2       764 (10)\n 2       763 (10)\n 2       762 (10)\n 2       764 (10)\n 2       764 (10)\n-- 2010-06-17 rep +110  = 3031      \n 2       543 (10)\n 2       779 (10)\n 1       783 (2)\n 2       778 (10)\n 1       730 (15)\n 2       513 (10)\n 2       662 (10)\n 2       697 (10)\n 2       670 (10)\n-- 2010-06-18 rep +87   = 3118      \n 2       791 (10)\n 2       791 (10)\n 2       792 (10)\n 2       791 (10)\n 2       764 (10)\n 2       752 (10)\n-- 2010-06-19 rep +60   = 3178      \n 3       804 (-2)\n 3       804 (-2)\n 2       802 (10)\n 3       804 (-2)\n 3       804 (-2)\n 3       807 (-1)\n 3       802 (-2)\n 2       657 (10)\n-- 2010-06-20 rep +9    = 3187      \n 2       762 (10)\n 2       740 (10)\n 2       804 (10)\n 2       804 (10)\n 1       742 (2)\n-- 2010-06-21 rep +42   = 3229      \n 2       820 (10)\n 2       803 (10)\n 2       603 (10)\n-- 2010-06-22 rep +30   = 3259      \n 2       386 (10)\n 2       534 (10)\n 2       851 (10)\n 1       851 (15)\n 2       851 (10)\n 2       855 (10)\n 2       830 (10)\n 2       820 (10)\n-- 2010-06-23 rep +85   = 3344      \n 3       865 (-1)\n 3       877 (-2)\n 3       877 (-2)\n 3       877 (-2)\n 3       871 (-1)\n 3       877 (-2)\n 2       877 (10)\n 2       877 (10)\n 3       877 (-2)\n-- 2010-06-24 rep +8    = 3352      \n 2       877 (10)\n 2       820 (10)\n 1       883 (2)\n 2       877 (10)\n 2       877 (10)\n 2       889 (10)\n 2       889 (10)\n 2       877 (10)\n 2       877 (10)\n 2       891 (10)\n 2       890 (10)\n 2       892 (10)\n-- 2010-06-25 rep +112  = 3464      \n 2       877 (10)\n 2       764 (10)\n-- 2010-06-26 rep +20   = 3484      \n 2       877 (10)\n 2       904 (10)\n 2       877 (10)\n 2       908 (10)\n 1       908 (15)\n 2       908 (10)\n 2       892 (10)\n 2       911 (10)\n 2       909 (10)\n 2       739 (10)\n 2       911 (10)\n-- 2010-06-27 rep +115  = 3599      \n 2       913 (10)\n 2       918 (10)\n 2       918 (10)\n 2       889 (10)\n 2       918 (10)\n 2       877 (10)\n 2       889 (10)\n 2       918 (10)\n-- 2010-06-28 rep +80   = 3679      \n 2       670 (10)\n 2       661 (10)\n 2       660 (10)\n 2       913 (10)\n 2       889 (10)\n 2       908 (10)\n 2       764 (10)\n 2       911 (10)\n-- 2010-06-29 rep +80   = 3759      \n 2       929 (10)\n 2       889 (10)\n 2       929 (10)\n 2       752 (10)\n 2       752 (10)\n 2       752 (10)\n 2       752 (10)\n 2       820 (10)\n 2       752 (10)\n 2       941 (10)\n 2       941 (10)\n-- 2010-06-30 rep +110  = 3869      \n 2       877 (10)\n 2       954 (10)\n 2       954 (10)\n 2       955 (10)\n 2       438 (10)\n 2       820 (10)\n-- 2010-07-01 rep +60   = 3929      \n 3       974 (-2)\n 2       974 (10)\n 2       974 (10)\n 2       974 (10)\n 2       728 (10)\n 2       752 (10)\n 2       889 (10)\n 2       963 (10)\n 3       972 (-1)\n 2       988 (10)\n 2       988 (10)\n 2       974 (10)\n-- 2010-07-02 rep +97   = 4026      \n 2       992 (10)\n 2       977 (10)\n-- 2010-07-03 rep +20   = 4046      \n 2       999 (10)\n 2       628 (10)\n 2       974 (10)\n 2       974 (10)\n-- 2010-07-04 rep +40   = 4086      \n 2       974 (10)\n 3      1006 (-1)\n 2       974 (10)\n 2       958 (10)\n 2       974 (10)\n 1      1001 (15)\n 2       954 (10)\n 2       958 (10)\n-- 2010-07-05 rep +74   = 4160      \n 2      1025 (10)\n 1      1025 (15)\n 2       913 (10)\n 2       494 (10)\n 2       778 (10)\n 2      1026 (10)\n 2      1030 (10)\n 2      1030 (10)\n-- 2010-07-06 rep +85   = 4245      \n 2      1025 (10)\n 2       974 (10)\n 2      1030 (10)\n 2      1025 (10)\n 2       913 (10)\n-- 2010-07-07 rep +50   = 4295      \n 2      1043 (10)\n-- 2010-07-08 rep +10   = 4305      \n 1       440 (2)\n 1       439 (2)\n 1       769 (2)\n 1       787 (2)\n 1       794 (2)\n 1       861 (2)\n 1       950 (2)\n 2      1060 (10)\n 2      1060 (10)\n 2      1060 (10)\n 1      1061 (2)\n 1       676 (2)\n 2      1059 (10)\n-- 2010-07-09 rep +58   = 4363      \n 2       999 (10)\n 2       908 (10)\n 2       999 (10)\n-- 2010-07-10 rep +30   = 4393      \n 2       603 (10)\n 2       999 (10)\n-- 2010-07-11 rep +20   = 4413      \n 2       739 (10)\n-- 2010-07-12 rep +10   = 4423      \n 3       739 (-2)\n 2      1092 (10)\n-- 2010-07-13 rep +8    = 4431      \n 1       688 (2)\n 2       687 (10)\n-- 2010-07-14 rep +12   = 4443      \n 2      1112 (10)\n 2      1112 (10)\n-- 2010-07-15 rep +20   = 4463      \n 2      1120 (10)\n 2      1124 (10)\n 2      1115 (10)\n 2       992 (10)\n 2      1115 (10)\n 2      1120 (10)\n 2      1124 (10)\n 2       992 (10)\n 2      1092 (10)\n 3      1122 (-1)\n-- 2010-07-16 rep +89   = 4552      \n 2       913 (10)\n-- 2010-07-18 rep +10   = 4562      \n 1      1136 (2)\n 1      1138 (2)\n 2      1135 (10)\n 2      1142 (10)\n-- 2010-07-19 rep +24   = 4586      \n 1      1144 (2)\n 2      1116 (10)\n 2      1117 (10)\n 2      1005 (10)\n 2      1118 (10)\n 2      1142 (10)\n 2      1145 (10)\n 2       603 (10)\n 2      1147 (10)\n 1       809 (2)\n-- 2010-07-20 rep +84   = 4670      \n 2      1159 (10)\n 2      1159 (10)\n 2      1164 (10)\n-- 2010-07-21 rep +30   = 4700      \n 2      1176 (10)\n 2      1176 (10)\n 2      1173 (10)\n 2      1176 (10)\n 2      1164 (10)\n 2      1174 (10)\n-- 2010-07-22 rep +60   = 4760      \n 2      1186 (10)\n 1      1178 (2)\n 2      1173 (10)\n 2       603 (10)\n 2      1184 (10)\n 2      1177 (10)\n 2      1174 (10)\n 2      1184 (10)\n 2      1186 (10)\n-- 2010-07-23 rep +82   = 4842      \n 2      1202 (10)\n 1      1204 (2)\n 2      1205 (10)\n-- 2010-07-24 rep +22   = 4864      \n 1      1211 (2)\n 2       820 (10)\n 2      1215 (10)\n 2      1214 (10)\n 2      1215 (10)\n 2       666 (10)\n 2      1021 (10)\n 2      1202 (10)\n 2      1214 (10)\n 1      1214 (15)\n-- 2010-07-25 rep +97   = 4961      \n 2      1218 (10)\n 2       764 (10)\n 2       648 (10)\n 2      1001 (10)\n 2      1146 (10)\n 1      1222 (2)\n-- 2010-07-26 rep +52   = 5013      \n 2       690 (10)\n-- 2010-07-27 rep +10   = 5023      \n 2      1148 (10)\n 2       704 (10)\n-- 2010-07-28 rep +20   = 5043      \n 3       476 (-1)\n 3      1252 (-2)\n 2      1145 (10)\n 2      1252 (10)\n 2      1145 (10)\n 2      1248 (10)\n 2       785 (10)\n 2       466 (10)\n 2       890 (10)\n 2      1159 (10)\n 1      1260 (2)\n 2      1252 (10)\n-- 2010-07-29 rep +89   = 5132      \n 2      1159 (10)\n 2       427 (10)\n 2       908 (10)\n-- 2010-07-30 rep +30   = 5162      \n 2      1276 (10)\n 2      1276 (10)\n-- 2010-07-31 rep +20   = 5182      \n 2      1276 (10)\n 2       820 (10)\n-- 2010-08-01 rep +20   = 5202      \n 1      1174 (15)\n-- 2010-08-03 rep +15   = 5217      \n 2       804 (10)\n-- 2010-08-04 rep +10   = 5227      \n 2       386 (10)\n 2      1308 (10)\n-- 2010-08-05 rep +20   = 5247      \n 2      1308 (10)\n 1      1311 (2)\n 2      1308 (10)\n 2       386 (10)\n-- 2010-08-06 rep +32   = 5279      \n 2      1317 (10)\n 2      1317 (10)\n 2      1305 (10)\n 2      1116 (10)\n 2      1117 (10)\n 2      1155 (10)\n 2      1317 (10)\n 2      1317 (10)\n-- 2010-08-07 rep +80   = 5359      \n 1      1320 (2)\n 1      1321 (2)\n 2      1326 (10)\n 1      1326 (15)\n 2      1326 (10)\n-- 2010-08-08 rep +39   = 5398      \n 2      1323 (10)\n 2      1326 (10)\n 2       694 (10)\n 2       691 (10)\n 2      1338 (10)\n 2       386 (10)\n-- 2010-08-09 rep +60   = 5458      \n 2      1338 (10)\n 2      1339 (10)\n 2      1343 (10)\n 2      1345 (10)\n 2      1344 (10)\n 2      1344 (10)\n 2       386 (10)\n-- 2010-08-10 rep +70   = 5528      \n 2      1352 (10)\n 2      1352 (10)\n 2      1352 (10)\n 2      1352 (10)\n 2       386 (10)\n 2       494 (10)\n 2       494 (10)\n-- 2010-08-11 rep +70   = 5598      \n 2       630 (10)\n 2      1352 (10)\n 2      1365 (10)\n 2      1366 (10)\n 2       792 (10)\n 2       601 (10)\n 2      1367 (10)\n 2      1368 (10)\n 2      1352 (10)\n 2       603 (10)\n 2      1368 (10)\n 2      1368 (10)\n 2      1367 (10)\n 2      1368 (10)\n 2       534 (10)\n 2      1368 (10)\n 2      1365 (10)\n-- 2010-08-12 rep +170  = 5768      \n 2      1323 (10)\n 2      1135 (10)\n 2      1377 (10)\n 2      1377 (10)\n 2      1377 (10)\n 2      1378 (10)\n 2      1381 (10)\n-- 2010-08-13 rep +70   = 5838      \n 2      1381 (10)\n 2      1386 (10)\n-- 2010-08-14 rep +20   = 5858      \n 1      1119 (2)\n-- 2010-08-15 rep +2    = 5860      \n 2       694 (10)\n 2       691 (10)\n 2      1305 (10)\n 2       704 (10)\n 2       690 (10)\n 2      1398 (10)\n 2      1398 (10)\n 1      1398 (15)\n 2       534 (10)\n 2      1406 (10)\n 2      1407 (10)\n 2      1404 (10)\n 2      1405 (10)\n 2      1408 (10)\n 2      1409 (10)\n-- 2010-08-16 rep +155  = 6015      \n 2      1409 (10)\n 2      1412 (10)\n 2      1403 (10)\n 2      1420 (10)\n-- 2010-08-17 rep +40   = 6055      \n 2      1407 (10)\n-- 2010-08-18 rep +10   = 6065      \n\n** total rep 6065 :)\n\ndays represented 77\nrep cap was reached via rep from upvotes *only* on 0 days\nrep cap was exceeded on 0 days\n</pre>\n\n<p><strong>My rep graph according to the api</strong></p>\n\n<pre>\n2010-05-30   +010   -000\n---------------------------------------- 2010-05-30 TOTAL:10\n2010-05-31   +010   -000\n---------------------------------------- 2010-05-31 TOTAL:10\n2010-06-01   +020   -000\n---------------------------------------- 2010-06-01 TOTAL:20\n2010-06-02   +045   -000\n---------------------------------------- 2010-06-02 TOTAL:45\n2010-06-05   +010   -000\n2010-06-05   +035   -000\n---------------------------------------- 2010-06-05 TOTAL:45\n2010-06-06   +010   -000\n2010-06-06   +010   -000\n---------------------------------------- 2010-06-06 TOTAL:20\n2010-06-12   +020   -000\n---------------------------------------- 2010-06-12 TOTAL:20\n2010-06-13   +020   -000\n---------------------------------------- 2010-06-13 TOTAL:20\n2010-06-14   +010   -000\n2010-06-14   +020   -000\n---------------------------------------- 2010-06-14 TOTAL:30\n2010-06-15   +020   -000\n2010-06-15   +020   -000\n---------------------------------------- 2010-06-15 TOTAL:40\n2010-06-16   +090   -000\n2010-06-16   +020   -000\n---------------------------------------- 2010-06-16 TOTAL:110\n2010-06-17   +040   -000\n2010-06-17   +070   -000\n---------------------------------------- 2010-06-17 TOTAL:110\n2010-06-18   +010   -000\n2010-06-18   +035   -000\n2010-06-18   +030   -000\n2010-06-18   +020   -000\n2010-06-18   +010   -000\n---------------------------------------- 2010-06-18 TOTAL:105\n2010-06-19   +030   -000\n---------------------------------------- 2010-06-19 TOTAL:30\n2010-06-20   +010   -002\n2010-06-20   +010   -000\n2010-06-20   +020   -000\n2010-06-20   +050   -000\n---------------------------------------- 2010-06-20 TOTAL:88\n2010-06-22   +010   -000\n---------------------------------------- 2010-06-22 TOTAL:10\n2010-06-23   +035   -000\n2010-06-23   +010   -000\n2010-06-23   +010   -000\n---------------------------------------- 2010-06-23 TOTAL:55\n2010-06-25   +010   -000\n---------------------------------------- 2010-06-25 TOTAL:10\n2010-06-26   +010   -000\n---------------------------------------- 2010-06-26 TOTAL:10\n2010-06-27   +020   -000\n2010-06-27   +010   -000\n---------------------------------------- 2010-06-27 TOTAL:30\n2010-06-28   +040   -000\n2010-06-28   +020   -000\n2010-06-28   +010   -000\n2010-06-28   +010   -000\n---------------------------------------- 2010-06-28 TOTAL:80\n2010-06-29   +030   -000\n2010-06-29   +020   -000\n---------------------------------------- 2010-06-29 TOTAL:50\n2010-06-30   +020   -000\n2010-06-30   +120   -010\n---------------------------------------- 2010-06-30 TOTAL:130\n2010-07-01   +010   -000\n2010-07-01   +010   -000\n---------------------------------------- 2010-07-01 TOTAL:20\n2010-07-02   +010   -000\n2010-07-02   +090   -000\n2010-07-02   +070   -000\n2010-07-02   +010   -000\n2010-07-02   +020   -000\n---------------------------------------- 2010-07-02 TOTAL:200\n2010-07-03   +010   -000\n---------------------------------------- 2010-07-03 TOTAL:10\n2010-07-04   +040   -000\n---------------------------------------- 2010-07-04 TOTAL:40\n2010-07-05   +030   -000\n2010-07-05   +020   -000\n---------------------------------------- 2010-07-05 TOTAL:50\n2010-07-06   +020   -000\n2010-07-06   +020   -000\n2010-07-06   +010   -000\n2010-07-06   +100   -002\n2010-07-06   +030   -000\n---------------------------------------- 2010-07-06 TOTAL:178\n2010-07-07   +045   -000\n---------------------------------------- 2010-07-07 TOTAL:45\n2010-07-08   +010   -000\n---------------------------------------- 2010-07-08 TOTAL:10\n2010-07-09   +030   -000\n2010-07-09   +010   -000\n---------------------------------------- 2010-07-09 TOTAL:40\n2010-07-11   +040   -000\n---------------------------------------- 2010-07-11 TOTAL:40\n2010-07-12   +040   -002\n---------------------------------------- 2010-07-12 TOTAL:38\n2010-07-13   +010   -000\n---------------------------------------- 2010-07-13 TOTAL:10\n2010-07-15   +020   -000\n---------------------------------------- 2010-07-15 TOTAL:20\n2010-07-16   +020   -000\n2010-07-16   +020   -000\n2010-07-16   +020   -000\n2010-07-16   +030   -000\n2010-07-16   +020   -000\n---------------------------------------- 2010-07-16 TOTAL:110\n2010-07-17   +050   -000\n---------------------------------------- 2010-07-17 TOTAL:50\n2010-07-19   +010   -000\n2010-07-19   +010   -000\n2010-07-19   +020   -000\n---------------------------------------- 2010-07-19 TOTAL:40\n2010-07-20   +010   -000\n---------------------------------------- 2010-07-20 TOTAL:10\n2010-07-22   +030   -000\n2010-07-22   +020   -000\n2010-07-22   +020   -000\n---------------------------------------- 2010-07-22 TOTAL:70\n2010-07-23   +010   -000\n2010-07-23   +020   -000\n2010-07-23   +020   -000\n---------------------------------------- 2010-07-23 TOTAL:50\n2010-07-24   +010   -000\n---------------------------------------- 2010-07-24 TOTAL:10\n2010-07-25   +020   -000\n2010-07-25   +020   -300\n2010-07-25   +010   -000\n2010-07-25   +020   -000\n2010-07-25   +035   -000\n2010-07-25   +010   -000\n---------------------------------------- 2010-07-25 TOTAL:-185\n2010-07-26   +070   -000\n2010-07-26   +080   -000\n2010-07-26   +025   -000\n2010-07-26   +010   -000\n2010-07-26   +020   -000\n2010-07-26   +050   -000\n---------------------------------------- 2010-07-26 TOTAL:255\n2010-07-27   +010   -000\n---------------------------------------- 2010-07-27 TOTAL:10\n2010-07-28   +030   -000\n---------------------------------------- 2010-07-28 TOTAL:30\n2010-07-29   +010   -000\n2010-07-29   +010   -000\n2010-07-29   +035   -000\n2010-07-29   +020   -000\n2010-07-29   +020   -002\n2010-07-29   +040   -000\n---------------------------------------- 2010-07-29 TOTAL:133\n2010-07-30   +010   -000\n2010-07-30   +065   -000\n---------------------------------------- 2010-07-30 TOTAL:75\n2010-08-01   +030   -000\n2010-08-01   +070   -000\n---------------------------------------- 2010-08-01 TOTAL:100\n2010-08-03   +035   -000\n---------------------------------------- 2010-08-03 TOTAL:35\n2010-08-04   +030   -008\n---------------------------------------- 2010-08-04 TOTAL:22\n2010-08-05   +030   -000\n---------------------------------------- 2010-08-05 TOTAL:30\n2010-08-07   +020   -000\n2010-08-07   +020   -000\n2010-08-07   +010   -000\n2010-08-07   +040   -000\n---------------------------------------- 2010-08-07 TOTAL:90\n2010-08-09   +045   -000\n2010-08-09   +030   -000\n2010-08-09   +020   -000\n2010-08-09   +010   -000\n---------------------------------------- 2010-08-09 TOTAL:105\n2010-08-10   +010   -000\n2010-08-10   +010   -000\n2010-08-10   +020   -000\n---------------------------------------- 2010-08-10 TOTAL:40\n2010-08-11   +030   -000\n2010-08-11   +210   -000\n2010-08-11   +110   -000\n---------------------------------------- 2010-08-11 TOTAL:350\n2010-08-12   +040   -000\n2010-08-12   +010   -000\n2010-08-12   +020   -000\n2010-08-12   +020   -000\n2010-08-12   +060   -000\n2010-08-12   +110   -000\n2010-08-12   +020   -000\n2010-08-12   +050   -000\n2010-08-12   +020   -000\n2010-08-12   +070   -000\n2010-08-12   +030   -000\n2010-08-12   +020   -000\n2010-08-12   +020   -000\n---------------------------------------- 2010-08-12 TOTAL:490\n2010-08-13   +030   -000\n2010-08-13   +010   -000\n---------------------------------------- 2010-08-13 TOTAL:40\n2010-08-14   +020   -000\n2010-08-14   +010   -000\n---------------------------------------- 2010-08-14 TOTAL:30\n2010-08-15   +020   -000\n2010-08-15   +020   -000\n2010-08-15   +020   -000\n2010-08-15   +020   -000\n2010-08-15   +020   -000\n---------------------------------------- 2010-08-15 TOTAL:100\n2010-08-16   +035   -000\n2010-08-16   +130   -000\n2010-08-16   +010   -000\n2010-08-16   +010   -000\n2010-08-16   +010   -000\n2010-08-16   +010   -000\n2010-08-16   +020   -000\n---------------------------------------- 2010-08-16 TOTAL:225\n2010-08-17   +010   -000\n2010-08-17   +010   -000\n2010-08-17   +010   -000\n---------------------------------------- 2010-08-17 TOTAL:30\n2010-08-18   +020   -000\n---------------------------------------- 2010-08-18 TOTAL:20\n2010-08-19   +010   -000\n2010-08-19 -------------------- TOTAL:10\n\n\ntotal earned less bonus: 4154\n</pre>\n\n<p><strong>Code used to generate api results</strong></p>\n\n<pre><code>function chartRep(userId, apiEndpoint) {\n\n    var route = Soapi.RouteFactory(apiEndpoint, apiKey)\n        .UsersByIdReputation(userId, {\n            fromdate: new Date(\"1/1/1970\"),\n            todate: new Date(\"1/1/2050\"),\n            pagesize: 100,\n            page: 1\n        });\n\n        route.getPagedResponse(function(data) {\n            var events = [];\n            var total = 0;\n            var items = data.items.reverse();\n            var lastDate = buildDate(data.items[0].on_date);\n            var dayTotal = 0;\n\n            for (var i = 0; i &lt; items.length; i++) {\n                var item = items[i];\n                var date = buildDate(item.on_date);\n                var metric = \"&amp;nbsp;&amp;nbsp;&amp;nbsp;+\" + zeroPad(item.positive_rep, 3) + \"&amp;nbsp;&amp;nbsp;&amp;nbsp;-\" + zeroPad(item.negative_rep, 3);\n\n                if (lastDate &amp;&amp; date != lastDate) {\n\n                    events.push(\"---------------------------------------- \" + lastDate + \" TOTAL:\" + dayTotal);\n                    dayTotal = item.positive_rep - item.negative_rep;\n                    lastDate = date;\n                }\n                else {\n\n                    dayTotal += item.positive_rep - item.negative_rep;\n                }\n                events.push(date + metric);\n                total += item.positive_rep - item.negative_rep;\n            }\n            events.push(date + \" -------------------- TOTAL:\" + dayTotal);\n            events.push(\"&lt;br/&gt;&lt;br/&gt; total earned less bonus: \" + total);\n\n            for (var day in events) {\n                var div = document.createElement(\"div\");\n\n                div.innerHTML = events[day];\n                output.appendChild(div);\n            }\n\n        }, function(error) {\n            alert(error.message);\n        });\n}\nfunction buildDate(date) {\n    return date.getFullYear() + \"-\" + zeroPad(date.getMonth() + 1, 2) + \"-\" + zeroPad(date.getDate(), 2);\n}\nfunction zeroPad(number, width) {\n    width -= number.toString().length;\n    if (width &gt; 0) {\n        return new Array(width + (/\\./.test(number) ? 2 : 1)).join('0') + number;\n    }\n    return number;\n};\n</code></pre>\n",
      "comments": []
    },
    {
      "tags": [
        "support",
        "meta"
      ],
      "answer_count": 3,
      "answers": [
        {
          "answer_id": 1458,
          "accepted": false,
          "answer_comments_url": "/answers/1458/comments",
          "question_id": 1456,
          "owner": {
            "user_id": 30,
            "user_type": "registered",
            "display_name": "Matt S.",
            "reputation": 4545,
            "email_hash": "fa2c3cc712e8f9a60f2369f842216e06"
          },
          "creation_date": 1282481904,
          "last_activity_date": 1282481904,
          "up_vote_count": 2,
          "down_vote_count": 2,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "-430 rep - why?",
          "body": "<p>I'll be willing to bet money that it was because of all those non cw dev-tip posts being converted to cw</p>\n",
          "comments": [
            {
              "comment_id": 3754,
              "creation_date": 1282545661,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1458,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "-1 - you just lost your money ;) See <a href=\"http://meta.stackoverflow.com/questions/11740/what-are-community-wiki-posts/11741#11741\">What are “Community Wiki” posts?</a>: In question <i>How do Community Wiki posts work?</i> it is stated that <i>The original author keeps the reputation gained (or lost) before their post entered community mode.</i>!"
            },
            {
              "comment_id": 3804,
              "creation_date": 1282598518,
              "owner": {
                "user_id": 30,
                "user_type": "registered",
                "display_name": "Matt S.",
                "reputation": 4545,
                "email_hash": "fa2c3cc712e8f9a60f2369f842216e06"
              },
              "post_id": 1458,
              "post_type": "answer",
              "score": 0,
              "body": "Oh darn it!!! I lost my moneys!"
            },
            {
              "comment_id": 3853,
              "creation_date": 1282653308,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "reply_to_user": {
                "user_id": 30,
                "user_type": "registered",
                "display_name": "Matt S.",
                "reputation": 4545,
                "email_hash": "fa2c3cc712e8f9a60f2369f842216e06"
              },
              "post_id": 1458,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "you might update your answer regarding my comment and get a refund accordingly, after all, this is not Las Vegas ;)"
            }
          ]
        },
        {
          "answer_id": 1475,
          "accepted": false,
          "answer_comments_url": "/answers/1475/comments",
          "question_id": 1456,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "creation_date": 1282653010,
          "last_edit_date": 1282653902,
          "last_activity_date": 1282653902,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "-430 rep - why?",
          "body": "<p>This is weird indeed:</p>\n\n<ul>\n<li><p>You already stated that you are not aware of any deleted posts of yours, which is the primary reason for such reputation losses.</p></li>\n<li><p>We already covered the conversion of the <a href=\"http://stackapps.com/questions/tagged/dev-tip\"><code>dev-tip</code></a> posts into Community Wiki posts in <a href=\"#1458\" rel=\"nofollow\">Matts answer</a>:</p>\n\n<ul>\n<li><em>The original author keeps the reputation gained (or lost) before their post entered community mode</em> (see <a href=\"http://meta.stackoverflow.com/questions/11740/what-are-community-wiki-posts/11741#11741\">What are “Community Wiki” posts?</a>, question <em>How do Community Wiki posts work?</em>).</li>\n</ul></li>\n<li><p>I just reassured that me working through your nice <em>QuickStart</em> <a href=\"http://stackapps.com/questions/1433/soapi-js2-a-fully-relational-javascript-client-library-for-the-stack-exchange-a#1441\">documentation series</a> of <a href=\"http://stackapps.com/questions/1433/soapi-js2-a-fully-relational-javascript-client-library-for-the-stack-exchange-a\">Soapi.JS2</a> and voting on each of the posts respectively for +8 there (plus maybe another vote on that day) has not been considered vote fraud, which is another major reason for such reputation losses (see <a href=\"http://meta.stackoverflow.com/questions/62066/what-are-the-mechanics-of-vote-fraud-handling-i-e-not-the-detection-heuristics\">What are the mechanics of vote fraud handling?</a>):</p>\n\n<ul>\n<li>I can still see all my votes, hence they have not been considered fraudulent and removed.</li>\n</ul></li>\n</ul>\n\n<p>I still wouldn't be too surprised to find some other earlier votes of mine reverted, as I've been tracking your activities pretty closely and, given your impressive pace, may have exhibited 'suspicious' voting patterns, for example by voting too fast on several posts (I regularly trigger the posting captcha and other UI throttles ;)</p>\n\n<ul>\n<li>However, according to <a href=\"http://meta.stackoverflow.com/questions/62066/what-are-the-mechanics-of-vote-fraud-handling-i-e-not-the-detection-heuristics/62069#62069\">Diagos answer</a> this should have been detected within a 24 hour time frame back then already, hence would only be possible, if the scripts are run differently over here, which is doubtful.</li>\n</ul>\n\n<p>So this might only be resolvable by moderator analysis, though <a href=\"http://meta.stackoverflow.com/questions/62066/what-are-the-mechanics-of-vote-fraud-handling-i-e-not-the-detection-heuristics/62069#62069\">Diagos answer</a> again seems to indicate that this might not even be (easily) possible; at least I've seen such analysis before, maybe there are some inside paths available to someone in charge still.</p>\n\n<p>Looks like one should regularly persist the <a href=\"http://meta.stackoverflow.com/questions/43004/how-do-i-audit-my-reputation\">reputation audit</a> at least to allow for diffing and eventually encircling such cases later on ;)</p>\n",
          "comments": []
        },
        {
          "answer_id": 1478,
          "accepted": false,
          "answer_comments_url": "/answers/1478/comments",
          "question_id": 1456,
          "owner": {
            "user_id": 4,
            "user_type": "moderator",
            "display_name": "Jeff Atwood",
            "reputation": 750,
            "email_hash": "51d623f33f8b83095db84ff35e15dbe8"
          },
          "creation_date": 1282695798,
          "last_activity_date": 1282695798,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "-430 rep - why?",
          "body": "<p><code>ScheduledController.InvalidateVotes()</code></p>\n\n<p>This means the vote anomaly detector saw a statistical anomaly in votes cast to your account (up or down) and invalidated them.</p>\n",
          "comments": [
            {
              "comment_id": 3874,
              "creation_date": 1282696720,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1478,
              "post_type": "answer",
              "score": 0,
              "body": "as I suspected. I provide volumnuous substantive documentation and a few of the users of the library are quite pleased with them and indicate so with upvotes. The votebot I understand, but it seems that the users are not regaining the ability to recast, i.e. vote count and points are revoked but their upvote flag remains set. From what I read this should not be the case once the votes are revoked."
            },
            {
              "comment_id": 3876,
              "creation_date": 1282697397,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1478,
              "post_type": "answer",
              "score": 0,
              "body": "also, this would mean that 43 votes were cast in one day and the votebot cancelled them. this is not the case - i watched 15 votes on newly posted documentation go poof at the same time -430 was logged. something else seems to be going on."
            },
            {
              "comment_id": 3877,
              "creation_date": 1282697597,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1478,
              "post_type": "answer",
              "score": 0,
              "body": "Ew... what is that funny line of code?"
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1456/timeline",
      "question_comments_url": "/questions/1456/comments",
      "question_answers_url": "/questions/1456/answers",
      "question_id": 1456,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282443987,
      "last_edit_date": 1282695810,
      "last_activity_date": 1282695810,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 285,
      "score": 2,
      "community_owned": false,
      "title": "-430 rep - why?",
      "body": "<p>I just lost 430 rep. from 6777 earlier today to 6347.</p>\n\n<p>This seems to be localized to my account only.</p>\n\n<p>Why?</p>\n",
      "comments": [
        {
          "comment_id": 3747,
          "creation_date": 1282445694,
          "owner": {
            "user_id": 525,
            "user_type": "registered",
            "display_name": "coobird",
            "reputation": 133,
            "email_hash": "1de7574c70db36492ea962c22e2252a8"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "@codepoet Has some of your questions and/or answers been deleted in the past? Rep earned from deleted posts are not deducted until there is a rep recalc, to the best of my knowledge. It seems likely that a rep recalc occurred on your account recently."
        },
        {
          "comment_id": 3748,
          "creation_date": 1282446346,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 525,
            "user_type": "registered",
            "display_name": "coobird",
            "reputation": 133,
            "email_hash": "1de7574c70db36492ea962c22e2252a8"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "@coo - the only deletions I have experience, to my knowledge, have been at my own hand. And sure, there was an upvote here and there but nothing that would account for this, even with a recalc."
        },
        {
          "comment_id": 3755,
          "creation_date": 1282545846,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "I&#39;m <i>very</i> curious what turns out to be the reason here too indeed ..."
        },
        {
          "comment_id": 3758,
          "creation_date": 1282549063,
          "owner": {
            "user_id": 2351,
            "user_type": "registered",
            "display_name": "kiamlaluno",
            "reputation": 113,
            "email_hash": "f5ef1b81e1aeb3b921a3034d460ce6af"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 1,
          "body": "Should not this be a question for Meta Stack Overflow?"
        },
        {
          "comment_id": 3759,
          "creation_date": 1282550009,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 2351,
            "user_type": "registered",
            "display_name": "kiamlaluno",
            "reputation": 113,
            "email_hash": "f5ef1b81e1aeb3b921a3034d460ce6af"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "@kia - maybe. but i suspect that the cause and effect are related to ongoing localized &#39;discussions&#39; and as such would have no relevance on meta."
        },
        {
          "comment_id": 3768,
          "creation_date": 1282563478,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "reply_to_user": {
            "user_id": 2351,
            "user_type": "registered",
            "display_name": "kiamlaluno",
            "reputation": 113,
            "email_hash": "f5ef1b81e1aeb3b921a3034d460ce6af"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "@kiamlaluno - I agree in principle, but reasoned just like @code poet for some topics as well more often than not as of today, see my similar exchange with George Edison in the comments to <a href=\"http://stackapps.com/questions/1427\">Why could it possibly be considered ‘reputation farming’ asking for solutions to real world API use cases?</a>. It&#39;s unfortunate that we don&#39;t have a Stack Apps specific Meta site yet, as almost all other Stack Exchange sites do have by now, and this need becomes more obvious almost daily at the moment ..."
        },
        {
          "comment_id": 3854,
          "creation_date": 1282654137,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Have you by chance some former reputation audits of yours persisted (e.g. I remotely recall you posting one occasionally while demonstrating some API stuff)? Diffing these against a current one might allow to encircle the responsible posts eventually."
        },
        {
          "comment_id": 3969,
          "creation_date": 1283090739,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1456,
          "post_type": "question",
          "score": 0,
          "body": "@steffen - sorry, this got buried. nope. don&#39;t have anything like that. it is obvious the votebot ate a bunch of votes, i watched it do it, 16 of them, but that does not add up to -430. I was the only person that day to have lost rep that day (i do have everyones rep every (almost) day archived see <a href=\"http://stackapps.com/questions/543\">stackapps.com/questions/543</a>) so I suspect manual action against my account. but that is neither here nor there. I am dissatisfied with the handling of many things, this included, but it is clear that the wagons are circled and I am not on the inside. oh well. time to move on."
        }
      ]
    },
    {
      "tags": [
        "app",
        "website",
        "soapi.cs"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1455,
          "accepted": false,
          "answer_comments_url": "/answers/1455/comments",
          "question_id": 1454,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282441606,
          "last_edit_date": 1282441908,
          "last_activity_date": 1282441908,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.LastSeen - List users by last access time",
          "body": "<h3>Source Code</h3>\n\n<p>LastSeen is about as simple as an app can get. It leverages the integral caching and paging capabilities of Soapi.CS as well as the rich domain object model in conjunction with ASP.Net declarative databinding.</p>\n\n<p>The core of the app is a simple data source that provides a list of sites and a list of the top 3000 (30 pages) of users for a site.</p>\n\n<p>The context is served by a static request cache which will serve api data from memory and being static it will caches for all asp.net sessions ensuring that fresh data is fetched only when the cache duration has expired.</p>\n\n<p>Combined with a declaritive page caching, the response times and API request usage are fully economized. </p>\n\n<p>Except, that is, for the first person to request the page after the cache has expired. For huge sites like Stack Overflow, a refresh can take up to 15 seconds. For smaller sites like Stack Apps the refresh time is nearly unnoticeable. </p>\n\n<pre><code>public class WhoIsOnRightNowDataSource\n{\n    private static readonly ApiContext Context;\n\n    static WhoIsOnRightNowDataSource()\n    {\n        Context = new ApiContext(\"mykey\")\n            .Initialize(false);\n    }\n\n    public List&lt;Site&gt; AllSites()\n    {\n        return Context.Sites;\n    }\n\n    public List&lt;User&gt; LastSeen(string apiEndpoint)\n    {\n        return Context.Find(apiEndpoint).Users\n            .PageSize(100).PageCount(30)\n            .OrderByDescending(u =&gt; u.LastAccessDate)\n            .ToList();\n    }\n}\n</code></pre>\n\n<p>This datasource is then declaratively bound to a DropDownList and a Gridview</p>\n\n<pre><code>&lt;%@ Page Language=\"C#\" %&gt;\n\n&lt;%@ OutputCache Duration=\"60\" VaryByParam=\"*\" %&gt;\n\n&lt;%@ Import Namespace=\"Soapi\" %&gt;\n\n&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head runat=\"server\"&gt;\n    &lt;title&gt;&lt;/title&gt;\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;form id=\"form1\" runat=\"server\"&gt;\n    &lt;div&gt;\n        &lt;div&gt;\n            &lt;asp:DropDownList ID=\"SitesDropDownList\" runat=\"server\" DataTextField=\"Name\" DataValueField=\"ApiEndpoint\"\n                DataSourceID=\"SitesDataSource\" AutoPostBack=\"True\" /&gt;\n        &lt;/div&gt;\n        &lt;br /&gt;\n        &lt;asp:GridView ID=\"GridView1\" runat=\"server\" AutoGenerateColumns=\"False\" DataSourceID=\"UsersDataSource\"\n            AllowPaging=\"True\" PageSize=\"50\"&gt;\n            &lt;Columns&gt;\n                &lt;asp:TemplateField HeaderText=\"seen\" SortExpression=\"LastAccessDate\"&gt;\n                    &lt;EditItemTemplate&gt;\n                    &lt;/EditItemTemplate&gt;\n                    &lt;ItemTemplate&gt;\n                        &lt;asp:Label ID=\"Label1\" runat=\"server\" Text='&lt;%# ((DateTime) Eval(\"LastAccessDate\")).FormatElapsedTime()  %&gt;' /&gt;\n                    &lt;/ItemTemplate&gt;\n                &lt;/asp:TemplateField&gt;\n                &lt;asp:TemplateField HeaderText=\"name\" SortExpression=\"DisplayName\"&gt;\n                    &lt;EditItemTemplate&gt;\n                    &lt;/EditItemTemplate&gt;\n                    &lt;ItemTemplate&gt;\n                        &lt;asp:Label ID=\"Label2\" runat=\"server\" Text='&lt;%# Eval(\"DisplayName\") %&gt;' ToolTip='User ID: &lt;%# Eval(\"UserId\") %&gt;' /&gt;\n                    &lt;/ItemTemplate&gt;\n                &lt;/asp:TemplateField&gt;\n                &lt;asp:BoundField DataField=\"Reputation\" HeaderText=\"reputation\" SortExpression=\"Reputation\" /&gt;\n            &lt;/Columns&gt;\n        &lt;/asp:GridView&gt;\n        &lt;br /&gt;\n    &lt;/div&gt;\n    &lt;asp:ObjectDataSource ID=\"SitesDataSource\" runat=\"server\" SelectMethod=\"AllSites\"\n        TypeName=\"SoapiDemos35.WhoIsOnRightNowDataSource\" /&gt;\n    &lt;asp:ObjectDataSource ID=\"UsersDataSource\" runat=\"server\" SelectMethod=\"LastSeen\"\n        TypeName=\"WhoIsOnRightNowDataSource\"&gt;\n        &lt;SelectParameters&gt;\n            &lt;asp:ControlParameter ControlID=\"SitesDropDownList\" Name=\"apiEndpoint\" PropertyName=\"SelectedValue\"\n                Type=\"String\" /&gt;\n        &lt;/SelectParameters&gt;\n    &lt;/asp:ObjectDataSource&gt;\n    &lt;/form&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n\n<p>And that is it. No code behind.</p>\n\n<p>Soapi.CS - it's as easy as breathing.... ;-)</p>\n",
          "comments": []
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1454/timeline",
      "question_comments_url": "/questions/1454/comments",
      "question_answers_url": "/questions/1454/answers",
      "question_id": 1454,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282441206,
      "last_activity_date": 1282441908,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 152,
      "score": 2,
      "community_owned": false,
      "title": "Soapi.LastSeen - List users by last access time",
      "body": "<h2><a href=\"http://soapi.info/LastSeen.aspx\" rel=\"nofollow\">Soapi.LastSeen</a></h2>\n\n<p><img src=\"http://i.stack.imgur.com/JxpZw.png\" alt=\"alt text\"></p>\n\n<h2>About</h2>\n\n<p><a href=\"http://soapi.info/LastSeen.aspx\" rel=\"nofollow\">Soapi.LastSeen</a> lists the top 3,000 users of any Stack Exchange site by last access time.</p>\n\n<h3>License</h3>\n\n<p>GPL - source code in <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a> demos and provided below.</p>\n\n<h3>Download</h3>\n\n<p><a href=\"http://soapi.info/LastSeen.aspx\" rel=\"nofollow\">Soapi.LastSeen is a web app.</a></p>\n\n<h2>Contact</h2>\n\n<p>code poet</p>\n\n<h2>Code</h2>\n\n<p><a href=\"http://soapi.info/LastSeen.aspx\" rel=\"nofollow\">Soapi.LastSeen</a> is a simple ASP.Net page written in C# using the <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a> library to demonstrate the parallel paging and integral caching features of <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a>.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "library",
        "javascript",
        "soapi.js"
      ],
      "answer_count": 15,
      "answers": [
        {
          "answer_id": 513,
          "accepted": false,
          "answer_comments_url": "/answers/513/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1275615432,
          "last_edit_date": 1278287292,
          "last_activity_date": 1278287292,
          "up_vote_count": 5,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 5,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Usage Example: Stack Exchange Site Monitor</h3>\n\n<p><a href=\"http://soapi.info/Code/JS/Stable/StackExchangeStatusMonitor.htm\" rel=\"nofollow\">JavaScript Site Monitor</a> in 20 lines of code or less....</p>\n\n<p>Demonstrates the use of Soapi.js to query stackauth.com to get an up-to-date list of Stack Exchange sites and then polling <code>/stats</code> for each one on a revolving timer.</p>\n\n<p><img src=\"http://img267.imageshack.us/img267/1381/sitemonitor.png\" alt=\"alt text\"></p>\n\n<pre><code>$(document).ready(function siteMonitor() {\n\n    var apiKey = '';\n    new Soapi.RouteFactory(\"\", apiKey).Sites().getResponse(function(data) {\n        var sites = [];\n        for (var i = 0; i &lt; data.items.length; i++) {\n            sites.push(data.items[i].api_endpoint.substring(7));\n        }\n\n        var siteIndex = 0;\n        var delay = 10; // get it started\n        var pollingInterval = 20000; // 20 seconds per site, &gt; 1 minute between identical requests\n\n        $.each(sites, function(idx, itm) {\n            $('&lt;div/&gt;').addClass('stats').attr('id', itm.replace(/\\./g, '')).appendTo(document.body);\n        });\n\n        function update() {\n            var client = new Soapi.RouteFactory(sites[siteIndex], apiKey)\n            .Stats()\n            .getResponse(function(data) {\n                var id = sites[siteIndex].replace(/\\./g, '');\n                $('#' + id).hide().fadeIn(100).jqotesub(\"#template\", data.items[0]);\n                siteIndex++;\n                if (siteIndex == sites.length) {\n                    siteIndex = 0;\n                    delay = pollingInterval;\n                }\n                window.setTimeout(update, delay);\n            });\n        }\n        update();\n    });\n});\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 657,
          "accepted": false,
          "answer_comments_url": "/answers/657/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276307276,
          "last_edit_date": 1278286487,
          "last_activity_date": 1278286487,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h2>Soapi.JS Usage Introduction</h2>\n\n<p>To use Soapi.JS, simply include <code>soapi.js</code> in your document.</p>\n\n<p>e.g.</p>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n   \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;/title&gt;\n    &lt;script src=\"scripts/Soapi.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;!-- the rest of your document --&gt;\n</code></pre>\n\n<p>Soapi.JS is designed to be very simple to use. The only 'class' you will instantiate is <code>RouteFactory</code>. </p>\n\n<p><strong>RouteFactory</strong></p>\n\n<p>The <code>RouteFactory</code> requires 2 parameters:</p>\n\n<ul>\n<li><code>targetSite</code> (Required) - the full name of the API you wish to query. e.g. <code>api.stackoverflow.com</code> or <code>http://api.stackoverflow.com</code></li>\n<li><code>apiKey</code> (Optional) - your application's registered apiKey. If you have no api key, API queries will be limited to 300 (or the latest limit) and requests will fail upon usage of that threshold. The JSONP mechanism provides no ability to access response headers and subsequently the x-rate-limit headers that provide usage metrics, so you will simply need to watch for timeouts and respond accordingly.</li>\n</ul>\n\n<p><code>RouteFactory</code>'s raison d'être is to hold a reference to the target site and the api key and build <code>Route</code> objects via factory methods. NOTE: you do not have to, although you may, use the <code>new</code> keyword when instantiating a <code>RouteFactory</code>.</p>\n\n<pre><code>Soapi.RouteFactory('api.stackapps.com', 'api key if you gots one')\n.UsersById(14)\n.getResponse(function(data) {\n    alert(data.items[0].display_name);\n});\n</code></pre>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi/660#660\" rel=\"nofollow\">Routes: what are they and how to use them</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 660,
          "accepted": false,
          "answer_comments_url": "/answers/660/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276311814,
          "last_edit_date": 1278286344,
          "last_activity_date": 1278286344,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<p><strong>Routes: what are they and how to use them</strong></p>\n\n<p>Soapi.js defines <code>Route</code> 'classes' for each and every route, or url, in the StackOverflow API. </p>\n\n<p>A <code>Route</code> is primarily a 'class' off of which to hang the url path and define the parameters for the url. Specifying required 'id' parameters in the factory method call and the application of parameters via explicitly defined parameter objects or json literals will be covered later in this post.</p>\n\n<p>A <code>Route</code>, once constructed via the factory methods on <code>RouteFactory</code>, may be re-used as often as desired.</p>\n\n<p><code>Route</code> exposes two functions</p>\n\n<ul>\n<li><code>getResponse(success, error, timeout)</code>.</li>\n<li><code>getPagedResponse(success, error, pageCallback, timeout)</code>.</li>\n</ul>\n\n<p><strong><code>Route.getResponse</code></strong> parameters:</p>\n\n<ul>\n<li><code>success</code> (required) - <code>function(data)</code> - <code>data</code> will be a JavaScript object (jsob) built from the response json as defined on the route's help-page.</li>\n<li><code>error</code> (optional) - <code>function(err)</code> - <code>err</code> will be a jsob shaped like this: <code>{ code: number , message: \"String\", url: \"String\"}</code></li>\n<li><code>timeout</code> (optional) - <code>number</code> - The default timeout value is 10,000, or 10 seconds. If this is not acceptable, simply provide a timeout value in ms.</li>\n</ul>\n\n<p>example:</p>\n\n<pre><code>var route = factory.Users();\n\nroute.getResponse(\n    function success(data) {\n        alert(\"response contained \" + data.items.length + \" users\");\n    },\n    function error(err) {\n        alert(\"Error: \" + err.code + \" \" + err.message);\n    },\n    2000);\n</code></pre>\n\n<p><strong><code>Route.getPagedResponse</code></strong> parameters:</p>\n\n<ul>\n<li><code>success</code> (required) - <code>function(data)</code> - <code>data</code> will be a JavaScript object (jsob) built from the response json as defined on the route's help-page.</li>\n<li><code>error</code> (optional) - <code>function(err)</code> - <code>err</code> will be a jsob shaped like this: <code>{ code: number , message: \"String\", url: \"String\"}</code></li>\n<li><code>pageCallback</code> (optional) - <code>function(data)</code> - <code>data</code> will be a JavaScript object (jsob) built from the response json as defined on the route's help-page. You may examine this object to determine if you would like to terminate the paged request. Simply return <code>true</code> if you wish to terminate and receive the current aggregated results in your <code>success</code> function.</li>\n<li><code>timeout</code> (optional) - <code>number</code> - The default timeout value is 10,000, or 10 seconds. If this is not acceptable, simply provide a timeout value in ms.</li>\n</ul>\n\n<p>example:</p>\n\n<pre><code>var route = factory.Users();\nroute.page = 1;\nroute.pagesize = 100;\n\nroute.getResponse(\n    function success(data) {\n        alert(\"response contained \" + data.items.length + \" users\");\n        // should be 500, as we fetched 5 pages of 100\n    },\n    function error(err) {\n        alert(\"Error: \" + err.code + \" \" + err.message);\n    },\n    function pageCallback(data) {\n         return data.page == 5;\n    },\n    2000);\n</code></pre>\n\n<p><strong>RouteFactory Method  Parameters</strong></p>\n\n<p>Routes that require an <code>id</code>, typically a semi-colon delimited list of identifiers, the factory method will accept id values as a param array, e.g. <code>(id1,id2,id3,...)</code> and construct the 'vectorized, semi-colon delimited' string for you.</p>\n\n<p>example:</p>\n\n<pre><code>var route = factory.UsersById(1,2,3,14, { pagesize: 5});\n</code></pre>\n\n<p>resulting in a url resembling the following (url-encoded, of course):</p>\n\n<pre><code>http://api.xxx.com/0.8/users/1;2;3;14&amp;pagesize=5&amp;key=myApiKey\n</code></pre>\n\n<p>The other parameters of the route may be supplied as an object literal in the factory method, as shown, explicitly set on the <code>Route</code> object itself or appied via the <code>Route.applyParameters</code> function with an object literal.</p>\n\n<p>'semicolon-delimited' parameters, which can be set in the factory method call, can be set as a string, <code>('1;2;3')</code>, a param array, <code>(1,2,3)</code> or an array, ([1,2,3]),  and are properly encoded by <code>getResponse</code>. </p>\n\n<p>'unix timestamp..' parameters are set as JavaScript <code>Date</code> and are properly converted and encoded by <code>getResponse</code>. </p>\n\n<p>Setting parameters directly on the <code>Route</code> object will, I think, be of more interest to Visual Studio users who may take advantage of the intellisense and code completion provided by <code>soapi.generated-vsdoc.js</code>. This topic will be covered in detail in the <strong>Intellisense Support</strong> post.</p>\n\n<p><strong>example  in the form of a QUnit test:</strong></p>\n\n<pre><code>asyncTest(\"AnswersByIdSanityCheck\", function() {\n    expect(1);\n    var factory = Soapi.RouteFactory('api.stackoverflow.com', apiKey);\n    var route = factory.AnswersById(2917525, 2701766, {\n        //id is set in factory method call\n        // these are default values that do not result in a \n        // parameter being added to the url\n        body: false,\n        comments: false,\n        sort: \"\",\n        order: \"\",\n        min: 0,\n        max: 0,\n        fromdate: 0,\n        todate: 0,\n        page: 0,\n        pagesize: 0\n    });\n\n\n\n    route.getResponse(\n      function (data) {\n          ok(data.items.length==2, 'async call succeeded, count inaccurate');\n          start();\n      }, \n      function(err) {\n          ok(err.message);\n          start();\n      }, 5000);\n</code></pre>\n\n<p><strong>example direct member set (with code completion and inline documentation) in the form of a QUnit test:</strong></p>\n\n<pre><code>asyncTest(\"AnswersByIdSanityCheck3\", function() {\n    expect(1);\n    var factory = Soapi.RouteFactory('api.stackoverflow.com', apiKey);\n    var route = factory.AnswersById(2917525, 2701766);\n\n    route.body = false;\n    route.comments = false;\n    route.sort = \"\";\n    route.order = \"\";\n    route.min = 0;\n    route.max = 0;\n    route.fromdate = 0;\n    route.todate = 0;\n    route.page = 0;\n    route.pa\n\n\n    route.getResponse(\n      function(data) {\n          ok(data.items.length == 2, 'async call succeeded, question count inaccurate');\n          start();\n      },\n      function(err) {\n          ok(err.message);\n          start();\n      }, 5000);\n});\n</code></pre>\n\n<p><img src=\"http://soapi.info/images/soapi.JS.intellisense1.png\" alt=\"alt text\"></p>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js/955#955\" rel=\"nofollow\">Complete Route Listing</a> - suprisingly simple mastery of the API via Soapi.js lies here</p>\n",
          "comments": []
        },
        {
          "answer_id": 661,
          "accepted": false,
          "answer_comments_url": "/answers/661/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276313462,
          "last_edit_date": 1277967574,
          "last_activity_date": 1277967574,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h2>Enumerated Constants, or enums, in Soapi.js</h2>\n\n<p>The advantages of using enums include the elimination of magic strings scattered about your codebase and the ability to update all references to an enum value in one location.</p>\n\n<p>Typically, in a statically typed language, enums are readonly or immutable values. While this concept is alien to the dynamically typed JavaScript language the benefits of enums are not mitigated. You simply need to treat them as immutable and <em>not</em> assign values to them.</p>\n\n<p>Soapi.js defines 'enums' for all of the 'choice' parameters and return types in the API. Using enums may seem like more work in that they are more verbose than using string constant but in reality they make your code more robust and much easier to read and maintain.</p>\n\n<p>For example:</p>\n\n<pre><code>var $sd = Soapi.Domain;\n\n// as a parameter\n\nroute.Sort = $sd.UserSort.reputation;\n\n\n// identifying values in return types\n\nswitch(user.user_type){\n   case $sd.UserType.anonymous:\n      // do something \n      break;\n   case $sd.UserType.unregistered:\n      // do something \n      break;\n   case $sd.UserType.registered:\n      // do something \n      break;\n   case $sd.UserType.moderator:\n      // do something \n      break;\n}\n</code></pre>\n\n<p><strong>Enums used in parameters</strong></p>\n\n<p>SortOrder</p>\n\n<ul>\n<li>desc</li>\n<li>asc</li>\n</ul>\n\n<p>PostSort</p>\n\n<ul>\n<li>activity</li>\n<li>views</li>\n<li>creation</li>\n<li>votes</li>\n</ul>\n\n<p>CommentSort</p>\n\n<ul>\n<li>creation</li>\n<li>votes</li>\n</ul>\n\n<p>QuestionSort</p>\n\n<ul>\n<li>activity</li>\n<li>votes</li>\n<li>creation</li>\n<li>featured</li>\n<li>hot</li>\n<li>week</li>\n<li>month</li>\n</ul>\n\n<p>TagSort</p>\n\n<ul>\n<li>popular</li>\n<li>activity</li>\n<li>name</li>\n</ul>\n\n<p>UserSort</p>\n\n<ul>\n<li>reputation</li>\n<li>creation</li>\n<li>name</li>\n</ul>\n\n<p>FavoritesSort</p>\n\n<ul>\n<li>activity</li>\n<li>views</li>\n<li>creation</li>\n<li>added</li>\n<li>votes</li>\n</ul>\n\n<p>Enums used in return types</p>\n\n<p>SiteState</p>\n\n<ul>\n<li>normal</li>\n<li>closed_beta</li>\n<li>open_beta</li>\n<li>linked_meta</li>\n</ul>\n\n<p>UserType</p>\n\n<ul>\n<li>anonymous</li>\n<li>unregistered</li>\n<li>registered</li>\n<li>moderator</li>\n</ul>\n\n<p>PostType</p>\n\n<ul>\n<li>question</li>\n<li>answer</li>\n</ul>\n\n<p>PostTimelineType</p>\n\n<ul>\n<li>question</li>\n<li>answer</li>\n<li>comment</li>\n<li>revision</li>\n<li>votes</li>\n<li>state</li>\n<li>accepted</li>\n<li>unaccepted</li>\n</ul>\n\n<p>RevisionType</p>\n\n<ul>\n<li>single_user</li>\n<li>vote_based</li>\n</ul>\n\n<p>UserTimelineType</p>\n\n<ul>\n<li>comment</li>\n<li>askoranswered</li>\n<li>badge</li>\n<li>revision</li>\n<li>accepted</li>\n</ul>\n\n<p>Users of Visual Studio will get extra benefit from the use of the defined <code>enum</code> types as they have the luxury of intellisense code completion, which will be covered in detail in the <strong>Intellisense Support</strong> post.</p>\n\n<p><img src=\"http://soapi.info/images/soapi.js.enums1.png\" alt=\"alt text\"></p>\n\n<p>Next:  <a href=\"http://stackapps.com/questions/494/soapi-js/662#662\" rel=\"nofollow\">Studio JavaScript Intellisense and Code Completion Support</a></p>\n",
          "comments": [
            {
              "comment_id": 1232,
              "creation_date": 1276385801,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 661,
              "post_type": "answer",
              "score": 0,
              "body": "Does this work with the Express editions of Visual Studio?"
            },
            {
              "comment_id": 1233,
              "creation_date": 1276386354,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 661,
              "post_type": "answer",
              "score": 0,
              "body": "@George, intellisense you mean? sure, I don&#39;t see why not. Just pay attention to the Intellisense Support instructions and you should have no problems. Let me know in a comment under the Intellisense Support answer."
            }
          ]
        },
        {
          "answer_id": 662,
          "accepted": false,
          "answer_comments_url": "/answers/662/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276319156,
          "last_edit_date": 1278055530,
          "last_activity_date": 1278055530,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h2>Visual Studio JavaScript Intellisense and Code Completion Support</h2>\n\n<p><strong>Overview</strong></p>\n\n<p>Included in the .zip is <code>soapi-vsdoc.js</code>. This file contains JavaScript code documented following the <a href=\"http://stackoverflow.com/questions/282129/intellisense-for-ajax-and-javascript-libraries-in-visual-studio\">Visual Studio JavaScript Intellisense Documentation format</a>.</p>\n\n<p>This file, while of special interest to users of Visual Studio, contains complete documentation of the API, including all enumerated constant values and route parameter specifications.</p>\n\n<p>For Visual Studio users: When using Soapi.JS in Visual Studio, the <code>-vsdoc.js</code> file simply needs to reside in the same directory as the <code>soapi.js</code> and <code>soapi.generated.js</code> files. Visual Studio will   </p>\n\n<p>If you are using Visual Studio 2008, you may need to apply the <a href=\"http://code.msdn.microsoft.com/KB958502/Release/ProjectReleases.aspx?ReleaseId=1736\" rel=\"nofollow\">JavaScript Intellisense patch</a>. The patch specifies X86, but I can assure you that the same patch is applicable to both x86 and x64.</p>\n\n<p><strong>Enums</strong></p>\n\n<p>As described in the Enumerated Constants post, <code>soapi.js</code> define enums that can help you write stronger code against the Soapi.JS library.</p>\n\n<p>In addition to the interesting 'enum' construct provided by <code>soapi</code>, the <code>soapi-vsdoc.js</code> file enhances the value of the enum types by adding Visual Studio Intellisense and Code Completion via the use of XML Documentation Comments.</p>\n\n<p><img src=\"http://soapi.info/images/soapi.js.enums1.png\" alt=\"alt text\"></p>\n\n<p><strong>Factory Methods</strong></p>\n\n<p>The factory's intellisense describe the route to be built:</p>\n\n<p><img src=\"http://soapi.info/images/soapi-factory-intellisense1.png\" alt=\"alt text\"></p>\n\n<p>The factory method's intellisense describe the route's 'id' parameters:</p>\n\n<p>NOTE: The documentation is generated directly from the API, so it is assumed that the programmer will know that the 'semicolon-delimited string' description, in the context of Soapi.JS, describes, in the factory method call, a param array, and when setting parameters directly on the route, an array, which will be properly converted and encoded by <code>getResponse</code>.</p>\n\n<p><img src=\"http://soapi.info/images/soapi-factory-intellisense2.png\" alt=\"alt text\"></p>\n\n<p>The route's fields describe themselves:</p>\n\n<p>NOTE: The documentation is generated directly from the API, so it is assumed that the programmer will know that the 'unix timestamp' description, in the context of Soapi.JS, describes a JavaScript <code>Date</code>, which will be properly converted and encoded by <code>getResponse</code>.</p>\n\n<p><img src=\"http://soapi.info/images/soapi-route-intellisense1.png\" alt=\"alt text\"></p>\n\n<p><strong>Convenience Constructors</strong></p>\n\n<p>When becoming acquainted with a new library, it is sometimes helpful to have code completion assistance and intellisense documentation for the objects returned from API calls.</p>\n\n<p>By leveraging the <code>vsdoc</code> file and a special constructor function, we can build a 'casting' constructor that, if the object passed in is an instance of itself, simply return it, otherwise apply the object passed in to a new instance. This provides intellisense, code completion and method chaining via type inference. </p>\n\n<p>The properties of the response type are enumerated:</p>\n\n<p><img src=\"http://soapi.info/images/soapi-intellisense-cc1.png\" alt=\"alt text\"></p>\n\n<p>The fact that <code>users</code> is an array is demonstrated by the type inference provided by Visual Studio.</p>\n\n<p><img src=\"http://soapi.info/images/soapi-intellisense-cc2.png\" alt=\"alt text\"></p>\n\n<p>Casting an element of the <code>users</code> array to <code>Soapi.Domain.User</code> results in the same effect.</p>\n\n<p><img src=\"http://soapi.info/images/soapi-intellisense-cc3.png\" alt=\"alt text\"></p>\n\n<p>While this added functionality may seem trivial, in a scenario where one is dealing with a new/beta/constantly shifting API, this type of assistance can be a great productivity boost. Especially on objects that have many many members and nested objects.</p>\n\n<p>It is Visual Studio's type inference functionality, driven by the <code>-vsdoc.js</code> file, that enables complete intellisense code-completion throughout the compact, or 'fluent', example that is given at the head of the question to this answer.</p>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js-dates/977#977\" rel=\"nofollow\">Date Handling in Soapi.js</a> - no more greasy unix timestamps.</p>\n",
          "comments": []
        },
        {
          "answer_id": 670,
          "accepted": false,
          "answer_comments_url": "/answers/670/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276339135,
          "last_edit_date": 1277967414,
          "last_activity_date": 1277967414,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h2>soapi.js vs soapi-vsdoc.js</h2>\n\n<p>While the <code>-vsdoc.js</code> is quite large, it is never served. It is, if you are using Visual Studio, used to provide intellisense services, otherwise you may either delete it or keep it around as reference.</p>\n\n<p>The file that actually defines the domain types at runtime, <code>soapi.js</code>, is quite small, 9.5k packed, in that it only contains meta data that is used at 'compile' or more accurately parsing time to dynamically build the domain objects.</p>\n\n<p>There is a slight performance hit to be taken when using <code>new Function()</code> when compared to inline code but I have not seen that to be an issue, especially when you are dealing with network requests. It is my observation that an app using Soapi.js will be network bound as opposed to CPU bound.</p>\n",
          "comments": []
        },
        {
          "answer_id": 697,
          "accepted": false,
          "answer_comments_url": "/answers/697/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1276478949,
          "last_edit_date": 1278287444,
          "last_activity_date": 1278287444,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>A: How do I get a question?</h3>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;/title&gt;\n    &lt;script src=\"scripts/Soapi.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script src=\"scripts/Soapi.Generated.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n    &lt;script type=\"text/javascript\"&gt;\n\n        function run() {\n\n            var apiKey = '';\n\n\n            var route = Soapi.RouteFactory('api.stackapps.com', apiKey).QuestionsById(494);\n            route.answers = true;\n            route.body = true;\n\n            var response = route.getResponse(\n            function success(data) {\n\n                alert(data.items[0].title);\n            },\n            function error(err) {\n                alert(\"Error:\" + err.message);\n            });\n\n\n            // or\n            Soapi.RouteFactory('api.stackapps.com', apiKey)\n            .QuestionsById(494,{\n                answers: true,\n                body: true\n            })\n            .getResponse(\n            function success(data) {\n\n                alert(data.items[0].title);\n            },\n            function error(err) {\n                alert(\"Error:\" + err.message);\n            });\n        }\n    &lt;/script&gt;\n&lt;/head&gt;\n&lt;body onload=\"run()\"&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 955,
          "accepted": false,
          "answer_comments_url": "/answers/955/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1277956236,
          "last_edit_date": 1278287549,
          "last_activity_date": 1278287549,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Complete Route Listing</h3>\n\n<p>The <code>RouteFactory</code>'s factory methods are consistently and intuitively named by convention to make banging out code without intellisense code completion as painless as possible.</p>\n\n<p>Here is a complete list of the <code>RouteFactory</code> methods and the API equivalent. Starting to see a pattern? ;-)</p>\n\n<hr>\n\n<p><strong>Api Routes</strong></p>\n\n<ul>\n<li><code>AnswersById</code> =  <code>/answers/{id}</code></li>\n<li><code>AnswersByIdComments</code> =  <code>/answers/{id}/comments</code></li>\n<li><code>Badges</code> =  <code>/badges</code></li>\n<li><code>BadgesById</code> =  <code>/badges/{id}</code></li>\n<li><code>BadgesName</code> =  <code>/badges/name</code></li>\n<li><code>BadgesTags</code> =  <code>/badges/tags</code></li>\n<li><code>CommentsById</code> =  <code>/comments/{id}</code></li>\n<li><code>ErrorsById</code> =  <code>/errors/{id}</code></li>\n<li><code>PostsByIdComments</code> =  <code>/posts/{id}/comments</code></li>\n<li><code>Questions</code> =  <code>/questions</code></li>\n<li><code>QuestionsById</code> =  <code>/questions/{id}</code></li>\n<li><code>QuestionsByIdAnswers</code> =  <code>/questions/{id}/answers</code></li>\n<li><code>QuestionsByIdComments</code> =  <code>/questions/{id}/comments</code></li>\n<li><code>QuestionsByIdTimeline</code> =  <code>/questions/{id}/timeline</code></li>\n<li><code>QuestionsUnanswered</code> =  <code>/questions/unanswered</code></li>\n<li><code>RevisionsById</code> =  <code>/revisions/{id}</code></li>\n<li><code>RevisionsByIdByRevisionguid</code> =  <code>/revisions/{id}/{revisionguid}</code></li>\n<li><code>Search</code> =  <code>/search</code></li>\n<li><code>Stats</code> =  <code>/stats</code></li>\n<li><code>Tags</code> =  <code>/tags</code></li>\n<li><code>Users</code> =  <code>/users</code></li>\n<li><code>UsersById</code> =  <code>/users/{id}</code></li>\n<li><code>UsersByIdAnswers</code> =  <code>/users/{id}/answers</code></li>\n<li><code>UsersByIdBadges</code> =  <code>/users/{id}/badges</code></li>\n<li><code>UsersByIdComments</code> =  <code>/users/{id}/comments</code></li>\n<li><code>UsersByIdCommentsByToid</code> =  <code>/users/{id}/comments/{toid}</code></li>\n<li><code>UsersByIdFavorites</code> =  <code>/users/{id}/favorites</code></li>\n<li><code>UsersByIdMentioned</code> =  <code>/users/{id}/mentioned</code></li>\n<li><code>UsersByIdQuestions</code> =  <code>/users/{id}/questions</code></li>\n<li><code>UsersByIdReputation</code> =  <code>/users/{id}/reputation</code></li>\n<li><code>UsersByIdTags</code> =  <code>/users/{id}/tags</code></li>\n<li><code>UsersByIdTimeline</code> =  <code>/users/{id}/timeline</code></li>\n<li><code>UsersModerators</code> =  <code>/users/moderators</code></li>\n</ul>\n\n<p><strong>StackAuth Routes</strong></p>\n\n<ul>\n<li><code>Sites</code> =  <code>/sites</code> </li>\n<li><code>UsersByIdAssociated</code> =  <code>/users/{id}/associated</code></li>\n</ul>\n\n<p><strong>NOTE</strong>: the stackauth methods/routes are available on every <code>RouteFactory</code> instance and are not tied to a particular target site. In fact, you may simply instantiate a <code>RouteFactory</code> with an empty string for target. This is useful in that you need to fetch /sites (Sites) in order to get an authoritive list of <code>api_endpoint</code> to use as target.</p>\n\n<hr>\n\n<p>So, to recap, the basic hello world for Soapi.js looks like this:</p>\n\n<pre><code>var factory = Soapi.RouteFactory(\"api.stackapps.com\",\"mykey\");\n\nvar route = factory.UsersById(14);\n\nroute.getResponse(function success(data){\n   alert(data.items[0].display_name); //code poet!\n}, function failure(error){\n   alert(error.message);\n});\n</code></pre>\n\n<p><strong>Remember</strong>: the <code>data</code> returned is the JavaScript object returned from the API method call. If you are in doubt as to what is being returned, simply look at the API help page for that route.</p>\n\n<p>The one exception that I have made is to abstract the array property of all 'returns' types to <code>items</code>. This enables more powerful application patterns.</p>\n\n<p>With an understanding of this simple code snippet, you can now easily and freely explore the Stack Overflow API with Soapi.js.</p>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js/661#661\" rel=\"nofollow\">Enumerated Constants, or enums, in Soapi.js</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 977,
          "accepted": false,
          "answer_comments_url": "/answers/977/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1278049091,
          "last_edit_date": 1279614076,
          "last_activity_date": 1279614076,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Date Handling</h3>\n\n<p>As of RC2, Soapi.js is Dates in, Dates out. No more dealing with unix timestamps.</p>\n\n<p>This includes input parameters, <code>todate</code>, <code>fromdate</code>, <code>min</code> and <code>max</code> (when applicable) and all response object date properties e.g. <code>creation_date</code> is converted to a JavaScript date object before it is passed to your <code>success</code> function.</p>\n\n<p><code>todate</code>, <code>fromdate</code> may also be specified using string, e.g. <code>\"1 jun 2010 00:00:00\"</code>.</p>\n\n<p><code>min</code> and <code>max</code> are special 'variant' parameters and when dates are appropriate you must explicitly set a <code>Date</code> object.</p>\n\n<p><strong>Example</strong></p>\n\n<pre><code>&lt;script src=\"scripts/Soapi.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n\n&lt;script type=\"text/javascript\"&gt;\n    // demonstrate dates in / dates out\n    // no need to deal with unix timestamps in Soapi.js\n\n    // here are some date objects\n    var fromDate = new Date(\"Tue, 1 Jun 2010 00:00:00\");\n    var toDate = new Date(\"Tue, 1 Jun 2010 01:00:00\");\n\n    // get some questions\n    // use min/max parameters with date objects\n    // dates are converted to unix timestamps to build the url\n\n    Soapi.RouteFactory(\"api.stackoverflow.com\", \"\").Questions({\n        min: fromDate,\n        max: toDate,\n        sort: Soapi.Domain.PostSort.creation,\n        pagesize: 1\n    })\n    .getResponse(function(data) {\n        // unix timestamps are converted to Date in response before you get them\n        alert(\"min/max\\r\\nThis date should be between Tue, 1 Jun 2010 00:00:00 and Tue, 1 Jun 2010 01:00:00 \\r\\n\\r\\n\"\n            + data.items[0].creation_date + \"\\r\\n\\r\\n Dates In - Dates Out.\\r\\nNeat, huh?\");\n    }, function(error) { alert(error.message); });\n\n    // use fromdate/todate parameters with date objects\n    // dates are converted to unix timestamps to build the url\n\n    Soapi.RouteFactory(\"api.stackoverflow.com\", \"\").Questions({\n        fromdate: fromDate,\n        todate: toDate,\n        sort: Soapi.Domain.PostSort.creation,\n        pagesize: 1\n    })\n    .getResponse(function(data) {\n        // unix timestamps are converted to Date in response before you get them\n        alert(\"fromdate/todate\\r\\nThis date should be between Tue, 1 Jun 2010 00:00:00 and Tue, 1 Jun 2010 01:00:00 \\r\\n\\r\\n\"\n            + data.items[0].creation_date + \"\\r\\n\\r\\n Dates In - Dates Out.\\r\\nNeat, huh?\");\n    }, function(error) { alert(error.message); });        \n\n&lt;/script&gt;\n</code></pre>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js-packaging/1005#1005\" rel=\"nofollow\">Building Soapi.js</a></p>\n",
          "comments": [
            {
              "comment_id": 2321,
              "creation_date": 1278168717,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 977,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "+1 for this extremely useful improvement! Dealing with Unix timestamps in an application layer is always annoying and a perfect job for a library/wrapper as such, much appreciated!"
            },
            {
              "comment_id": 2322,
              "creation_date": 1278179179,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 977,
              "post_type": "answer",
              "score": 1,
              "body": "@steffen - if you would like to submit any other &quot;i wish soapi did xxxx&quot; as individual comments on the main question you just might see them in the next release."
            }
          ]
        },
        {
          "answer_id": 1005,
          "accepted": false,
          "answer_comments_url": "/answers/1005/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1278289433,
          "last_edit_date": 1279227113,
          "last_activity_date": 1279227113,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Packaging Soapi.js</h3>\n\n<p>The process of packaging Soapi.js for distribution may be of interest to users of Soapi.js as well as others interested in using Visual Studio to automate the build and packaging of  JavaScript resources, including documentation.</p>\n\n<p><strong>Requirements:</strong></p>\n\n<ul>\n<li>Visual Studio 2008</li>\n<li><a href=\"http://aspnet.codeplex.com/releases/view/35893\" rel=\"nofollow\">Ajax Minifier 1.1</a></li>\n<li><a href=\"http://www.oracle.com/technology/software/index.html#java\" rel=\"nofollow\">Java runtime</a> (TODO: see if <a href=\"http://www.ikvm.net/\" rel=\"nofollow\">ikvm</a> can run jsdoc. I doubt it)</li>\n<li><a href=\"http://code.google.com/p/jsdoc-toolkit/\" rel=\"nofollow\">JsDoc ToolKit 2</a></li>\n</ul>\n\n<p><strong>Generating the documentation</strong></p>\n\n<p>The documentation of Soapi.js is built from Soapi-vsdoc.js comprised of two parts:</p>\n\n<ol>\n<li>Visual Studio Xml Documentation\nComments to support intellisense and\ncode completion </li>\n<li>JavaDoc style\ncomments for use in generating HTML\ndocumentation with JsDoc Toolkit</li>\n</ol>\n\n<p><strong>example</strong>:</p>\n\n<pre><code>/**\n* Global success handler. Replace (override) this method. This event is raised before the instance success function.\n* @function\n* @static\n* @param {Object} data The response data\n* @param {Object} [context] An arbitrary user defined value/object\n*/\nSoapi.onSuccess = function(data, context)\n{\n    /// &lt;summary&gt;Global success handler. Replace (override) this method. This event is raised before the instance success function.&lt;/summary&gt;\n    /// &lt;param name=\"data\" type=\"Object\"&gt;The response object&lt;/param&gt;\n    /// &lt;param name=\"context\" type=\"Object\"&gt;An arbitrary user defined value/object&lt;/param&gt;\n};\n</code></pre>\n\n<p>There are a few reasons for the duplicated effort.</p>\n\n<ol>\n<li>There is currently no public means\nof generating vs doc xml from POJO\ncode.  I have an abandoned and\npartially implemented project but\nhave not taken the time to revive \nit for reasons that will become\nclear.</li>\n<li>The JsDoc format is far more\nexpressive than is the Xml Doc\nformat and better than mix those\nconcerns, I find it a much cleaner,\nalbeit labor intensive, approach to\nuse JsDoc Toolkit for generating\nhard copy docs.</li>\n</ol>\n\n<p>There are a few features that JsDoc Toolkit does not support, so there are some post processing that needs to be done.</p>\n\n<ol>\n<li>update the build number in both the\ndoc file and the script</li>\n<li>run JsDoc Toolkit to generate the\ndoc site from the vsdoc (jsdoc) file\ninto /build/docs</li>\n<li>post process the output to clarify\nenums and create linked func\nparameters</li>\n<li>run a search and delete of JsDoc\ncomments to output a smaller vsdoc\nfile.</li>\n<li>write a vsdoc for Soapi.js and\nSoapi.min.js to the /build/scripts\ndirectory</li>\n</ol>\n\n<p><strong>Packaging The Distribution</strong></p>\n\n<ol>\n<li>copy all of the content and third\nparty demo support scripts to build\ndirectory</li>\n<li>copy the scripts and tests to the\n/build/scripts directory</li>\n<li>use ajax minifier to compress the\nscript and copy to the\n/build/scripts directory</li>\n<li>gzip the minified script and copy to\nthe /build/scripts directory</li>\n<li>build 3 versioned dowload files in\nthe /download\n<ol>\n<li>zipped docs only</li>\n<li>zipped scripts only    </li>\n<li>all content including docs, scripts, tests, demos and examples</li>\n</ol></li>\n<li>manually review tests and deploy to public sites</li>\n</ol>\n\n<p>All of this <em>could</em> be built into a custom MSBuild task, but for now it is being performed by the included console application, <code>Soapi.JS.Deploy</code>, that is run on successful builds.</p>\n\n<p><strong>Next:</strong> <a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1116#1116\" rel=\"nofollow\">Request Caching</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1116,
          "accepted": false,
          "answer_comments_url": "/answers/1116/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1279225102,
          "last_edit_date": 1279227068,
          "last_activity_date": 1279227068,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Request Caching</h3>\n\n<p>In the interest of application performance and to prevent inadvertent api 'abuse', Soapi.js includes an <a href=\"http://soapi.info/code/js/stable/docs/symbols/Soapi.RequestCache.html\" rel=\"nofollow\">integrated request cache</a> that stores the results of each unique request url for a default (and minimum) period of 60 seconds.</p>\n\n<p>The caching duration may be increased for individual routes as per your application's needs.</p>\n\n<p>e.g. perhaps your application requires that the stackauth site list be current to only 10 minutes you may set an increased cache duration as follows:</p>\n\n<pre><code>Soapi.RequestCache\n.setDuration(Soapi.Routes.SitesRouteMap.routeFormat, 60000 * 10);\n</code></pre>\n\n<p>After a successful response, subsequent requests to <code>/sites</code> within the cache duration will be returned from the in-memory cache. Upon expiration of the cache duration, the data for the particular route is purged from memory and the next request will be forwarded to the API.</p>\n\n<p><strong>Next:</strong> <a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1117#1117\" rel=\"nofollow\">Throttled Request Queue</a></p>\n",
          "comments": [
            {
              "comment_id": 2931,
              "creation_date": 1279608271,
              "owner": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1116,
              "post_type": "answer",
              "score": 0,
              "body": "that&#39;s a deep and detailed work, good job. I promised to myself that i will study this bunch of great stuff soon :)."
            },
            {
              "comment_id": 2932,
              "creation_date": 1279612146,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "post_id": 1116,
              "post_type": "answer",
              "score": 0,
              "body": "@system - thanks dude, it is a labor of love/hate and I am pleased to be nearing a point when I can concentrate on bringing soapi.cs to the same level and then maybe actually finish my apps."
            }
          ]
        },
        {
          "answer_id": 1117,
          "accepted": false,
          "answer_comments_url": "/answers/1117/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1279227028,
          "last_edit_date": 1279602355,
          "last_activity_date": 1279602355,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Throttled Request Queue</h3>\n\n<p>To provide transparent compliance with the throttle limite, Soapi.js  includes an <a href=\"http://soapi.info/code/js/stable/docs/symbols/Soapi.RequestQueue.html\" rel=\"nofollow\">integrated throttled request queue</a>.</p>\n\n<p>The queue is integrated into the library and is transparent, requiring no additional coding or consideration.</p>\n\n<p>The current default queue interval is 170ms.</p>\n\n<p>This means that, with the request queue and <a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1116#1116\" rel=\"nofollow\">request cache</a>, you may make requests with impunity and without concern for 503 errors or API abuse and all requests.</p>\n\n<p>Requests that are cached are not subject to queue delays.</p>\n\n<p>The request queue throttle interval can be adjusted from the current default of 170ms via the static <code>Soapi.RequestQueue</code> object e.g.</p>\n\n<pre><code>Soapi.RequestQueue.setInterval(intervalInMS);\n</code></pre>\n\n<p>Care must be taken to self-control bursts so as to comply with throttling rates, otherwise unexpected behavior can, well.. be expected.</p>\n\n<p>As a convenient side effect of implementing a request queue, throttled or otherwise, is the ability to provide feedback when your application is busy requesting data. This capability is implemented via global 'event' handlers and can easily facilitate UI blocking or manipulation e.g. ajax loading mask or other visual cues.</p>\n\n<p>You can find a simple example of this in <a href=\"http://stackapps.com/questions/954/stack-users-lite-search-for-users-on-all-stack-exchange-sites-and-view-their-ass\" rel=\"nofollow\">StackUsers Lite</a></p>\n\n<pre><code>/******************************************************\n* A cheap auto loading mask by overriding the queue events\n* Whenever the queue goes active or complete, wait 100ms\n* to make sure the event is not transient and then check\n* the queue length and show/hide mask as indicated.\n* could use jQuery/BlockUI\n*/\n\nSoapi.Events.onQueueActive = Soapi.Events.onQueueComplete = checkMask;\n\nfunction checkMask()\n{\n    // want a little buffer to eliminate mask flicker\n    window.setTimeout(function()\n    {\n        if (Soapi.RequestQueue.getLength() == 0)\n        {\n            unmask();\n        }\n        else\n        {\n            mask();\n        };\n    }, 100);\n};\n</code></pre>\n\n<p>another sample:</p>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head&gt;\n    &lt;title&gt;NGINX Throttle Violations&lt;/title&gt;\n\n    &lt;script src=\"http://soapi.info/code/js/stable/scripts/Soapi.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n\n    &lt;script type=\"text/javascript\"&gt;\n\n        var apiKey = 'qgAq_KfDu0KYzlNG-qaTuw';\n\n\n\n        // default will be set to 170 in next release\n        Soapi.RequestQueue.setInterval(170); // 30 per 5 sec = 6 per sec = interval 166.6 ms\n\n        // see http://stackapps.com/questions/1143/request-throttling-limits\n\n\n        // get a bunch of associations from stackauth\n        window.setTimeout(function()\n        {\n            Soapi.RouteFactory(\"api.stackoverflow.com\", apiKey)\n            .Users({ pagesize: 100, page: 1 })\n            .getResponse(function(data)\n            {\n                for (var i = 0; i &lt; data.items.length; i++)\n                {\n                    var id = data.items[i].association_id;\n\n                    if (id)\n                    {\n                        Soapi.RouteFactory(\"\", apiKey)\n                        .UsersByIdAssociated(id)\n                        .getResponse();\n                    }\n                };\n            });\n        }, 100);\n\n        window.setTimeout(function()\n        {\n            // get a bunch of tags from meta at the same time - all should be queued and executed with no error\n\n            Soapi.RouteFactory(\"api.meta.stackoverflow.com\", apiKey)\n            .Tags({ pagesize: 1 })\n            .getPagedResponse();\n\n        }, 10);\n    &lt;/script&gt;\n\n&lt;/head&gt;\n&lt;body&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1118#1118\" rel=\"nofollow\">Paged Requests</a></p>\n",
          "comments": []
        },
        {
          "answer_id": 1118,
          "accepted": false,
          "answer_comments_url": "/answers/1118/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1279229515,
          "last_edit_date": 1279649833,
          "last_activity_date": 1279649833,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>Paging Operations</h3>\n\n<p>The majority of operation against the API involve paging operations.</p>\n\n<p>Most of the work and complexity of dealing with paged results have been encapsulated by the <code>Route.GetPagedResponse()</code> method.</p>\n\n<pre><code>Soapi.RouteFactory(\"api.stackoverflow.com\", apiKey)\n.Tags({ pagesize: 1 }) // contrived page size\n.getPagedResponse(function success(aggregatedPages)\n{\n    // when the paging operation completes, whether due to completion of\n    // paging or arbitrary termination in pageCallback, the aggregated data is\n    // returned to this, the success handler.\n\n    // should be the aggregated total of 10 pages of 1 item or simply 10\n    alert(aggregatedPages.items.length);\n\n}, function failure(error)\n{\n    // handle the error\n\n}, function pageCallback(currentPage)\n{\n    // you can handle the data page by page in this handler or \n    // aggregated in total in the success handler\n\n    // simply omit this function parameter if you want all \n    // pages returned to the success handler\n\n    // return true from this function to terminate paging operation \n    // and return currently aggregated data to success handler.\n\n    // we will report progress on the paging operation and constrain\n    // the paging operation to 10 pages\n\n    reportProgress(currentPage.page);\n\n    // return true to terminate operation\n    return currentPage.page == 10;\n});\n</code></pre>\n\n<p><strong>Next</strong>: <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api/1155#1155\" rel=\"nofollow\">VectorizedIdList</a> - reliably maximize request payload</p>\n",
          "comments": []
        },
        {
          "answer_id": 1155,
          "accepted": false,
          "answer_comments_url": "/answers/1155/comments",
          "question_id": 494,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1279649725,
          "last_activity_date": 1279649725,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<h3>VectorizedIdList</h3>\n\n<p>Many routes accept a 'vectorized list of identifiers'. This allows you to retrieve data for multiple items and helps maximize efficiency and performance.</p>\n\n<p>The problem is that the 'vectorized list' is part of the url path, which much remain below a certain length (around 240) to avoid <a href=\"http://stackapps.com/questions/889\" rel=\"nofollow\">400 (Bad Request) errors</a>.</p>\n\n<p>the VectorizedIdList allows you to add an arbitrary number of values and will emit batches that will result in a url that is withing length tolerances.</p>\n\n<p>You can then simply iterate the batches and retrieve your results as shown below</p>\n\n<pre><code>var apiKey = 'qgAq_KfDu0KYzlNG-qaTuw';\nvar factory = Soapi.RouteFactory(\"api.meta.stackoverflow.com\", apiKey);\nfactory.Users({ pagesize: 100 }).getResponse(function(data)\n{\n    // 240 is a safe value for max path length otherwise you risk 400 (Bad Request) errors\n    // See http://stackapps.com/questions/889/dev-tip-how-to-batch-up-multiple-id-requests-to-maximize-economy-and-still-avoid/1021#1021\n\n    var idList = new Soapi.Utilities\n        .VectorizedIdList(240 - Soapi.Routes.UsersByIdReputationRouteMap.routeFormat.length);\n    for (var i = 0; i &lt; data.items.length; i++)\n    {\n        idList.add(data.items[i].user_id);\n    }\n\n    // so now we have a VectorizedIdList loaded with 100 user id values\n    var batches = idList.getBatches();\n\n    // batches:            \n    //    [0]: [1, 811, 22656, 22164, 23354, 658, 9314, 18393, 98786, 130154, 3043, 2915, 115866, 1288, 12950, 132636, 59303, 1782, 13295, 22459, 136558, 17174, 52443, 16587, 18511, 14048, 130127, 59808, 27414, 132480, 23921, 2598, 13531, 4660, 52738, 1069, 2509]\n    //    [1]: [131779, 95589, 893, 33708, 55747, 138112, 146126, 130914, 745, 131932, 139541, 130090, 101371, 140478, 2961, 141911, 132632, 75852, 135200, 1337, 54262, 8435, 76337, 137798, 69307, 3, 56338, 138822, 89334, 4, 91, 133733, 3724, 572, 102937, 47529, 137184, 5190]\n    //    [2]: [130109, 74022, 84237, 419, 131713, 42471, 132223, 9345, 44765, 132073, 6309, 14148, 56555, 6258, 16417, 20654, 44330, 16487, 68727, 2, 146719, 133301, 140171, 63550, 130494]\n    //    length: 3\n\n    for (var i = 0; i &lt; batches.length; i++)\n    {\n        // each batch will be a list of user id that will contain the\n        // maximum number of items and still remain under the 240 length limit\n\n        factory\n        .UsersById(batches[i], { pagesize: batches[i].length })\n        .getResponse(function(data)\n        {\n            // do something interesting with your batch of users here\n            alert(data.items.length);\n        }, function(error)\n        {\n            alert(error.message);\n        });\n    }\n\n\n});\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1364,
          "accepted": false,
          "answer_comments_url": "/answers/1364/comments",
          "question_id": 494,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1281555425,
          "last_activity_date": 1281555425,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
          "body": "<p>I was a little too lazy to read through everything on this page...</p>\n\n<p>Does Soapi.JS slow down requests to prevent 503 errors when necessary?</p>\n\n<p>If not, would you add that code if I wrote it?</p>\n",
          "comments": [
            {
              "comment_id": 3540,
              "creation_date": 1281558099,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "seriously!? you only have to read as far as the question. \n<a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api/1117#1117\" title=\"soapi js v1 0 fluent javascript wrapper for the stackoverflow api\">stackapps.com/questions/494/&hellip;</a>"
            },
            {
              "comment_id": 3542,
              "creation_date": 1281560139,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Well, you have to admit that this page is quite large... and I figured it would take you all of 2 seconds to tell me."
            },
            {
              "comment_id": 3543,
              "creation_date": 1281560801,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "I am way ahead of you.. In any post that I make that contains help answers you will find an index of topics. You see, I was not too lazy to index so that you, my dear user, would not have to read every answer. or the bold header to every answer post. lmao."
            },
            {
              "comment_id": 3631,
              "creation_date": 1281799017,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Sorry, one more question - does Soapi.js take timezones into consideration?"
            },
            {
              "comment_id": 3632,
              "creation_date": 1281800035,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "yes. to/from utc is handled by the lib. dates are relative to your local time."
            },
            {
              "comment_id": 3635,
              "creation_date": 1281807248,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Thanks - also, is there a way to get the original timestamp? (Not the JavaScript Date() object one.)"
            },
            {
              "comment_id": 3683,
              "creation_date": 1281982066,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - <code>Date.getTime()</code> is UTC, so just take the local date that soapi gives you, call <code>.getTime()</code> and divide by 1000. e.g. <code>originalTimestamp = question.creation_date.getTime()&#47;1000;</code>"
            },
            {
              "comment_id": 3684,
              "creation_date": 1281984351,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1364,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Thanks! I updated StackCenter so that it now informs you of new comments that have been posted since your last visit."
            }
          ]
        }
      ],
      "favorite_count": 7,
      "question_timeline_url": "/questions/494/timeline",
      "question_comments_url": "/questions/494/comments",
      "question_answers_url": "/questions/494/answers",
      "question_id": 494,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1275565334,
      "last_edit_date": 1282433764,
      "last_activity_date": 1282433764,
      "up_vote_count": 20,
      "down_vote_count": 0,
      "view_count": 1877,
      "score": 20,
      "community_owned": false,
      "title": "Soapi.JS : fluent JavaScript client library for the Stack Exchange API",
      "body": "<h2>Soapi.js</h2>\n\n<hr>\n\n<p>If you are looking for a full featured, compact JavaScript client library that provides complete end to end coverage of the API, Soapi.JS is a good choice. </p>\n\n<p>You may also want to check out it's big brother, <a href=\"http://stackapps.com/questions/1433\">Soapi.JS2</a>, which offers a rich relational query based metaphore.</p>\n\n<p>Soapi.JS is not deprecated nor is it obsoleted by <a href=\"http://stackapps.com/questions/1433\">Soapi.JS2</a>, each library has it's strengths and intended audience.</p>\n\n<hr>\n\n<p><em><strong>As easy as...</em></strong></p>\n\n<pre><code>Soapi.RouteFactory('api.stackapps.com', 'key')\n.UsersById(14)\n.getResponse(function(data) {\n    alert(data.items[0].display_name);\n});\n</code></pre>\n\n<p><em><strong>As expressive as...</em></strong></p>\n\n<pre><code>Soapi.RouteFactory(\"api.stackoverflow.com\", \"key\")\n.Questions({\n    // no unix timestamps here!\n    fromdate: \"1 Jun 2010 00:00:00\", // use a string\n    todate: new Date(\"1 Jun 2010 12:00:00\"), // or use a Date. up to you.\n    sort: \"creation\",\n    pagesize: 10\n})\n.getResponse(function(data)\n{\n    alert(data.total);\n});\n</code></pre>\n\n<h2>About</h2>\n\n<p>Soapi.js is a compact single file, self-containted, self-documenting, intuitive and easy to use fluent JavaScript wrapper with full coverage of the Stack Overflow API. </p>\n\n<p>Soapi.js is unobtrusive and has no external dependencies so it plays quite well with other libraries/frameworks.</p>\n\n<p>Soapi.js is packaged with Visual Studio intellisense <code>-vsdoc</code> files and <a href=\"http://soapi.info/help/js/index.html\">full documentation</a> in html format.</p>\n\n<p>Soapi.js includes advanced features including a <a href=\"http://soapi.info/help/js/symbols/Soapi.RequestCache.html\">configurable request caching buffer</a> and <a href=\"http://soapi.info/help/js/symbols/Soapi.RequestQueue.html\">throttled request queue</a>.</p>\n\n<h3>Demos</h3>\n\n<p>A few online demonstrations of Soapi.js usage can be found <a href=\"http://soapi.info/code/js/stable/default.htm\"><strong>here</strong></a>. </p>\n\n<p>The demos are also contained in the zip download.</p>\n\n<h3>License</h3>\n\n<p>You may use Soapi.js under the terms of either the MIT License or the GNU General Public License (GPL) Version 2.</p>\n\n<p>See <a href=\"http://soapi.info/code/js/license.aspx\">http://soapi.info/code/js/license.aspx</a> for more information.</p>\n\n<h3>Download</h3>\n\n<p>Current Version: Soapi.js 1.0 release 1.0 2010.07.09.00</p>\n\n<p>The downloads and source are hosted on codeplex:</p>\n\n<p><a href=\"http://soapijs.codeplex.com/\">http://soapijs.codeplex.com/</a></p>\n\n<p>You may view the documentation online <a href=\"http://soapi.info/help/js/index.html\"><strong>here</strong></a></p>\n\n<p>While soapi.info is not a CDN, the latest version of the script will always be available at the following locations. </p>\n\n<ul>\n<li><a href=\"http://soapi.info/code/js/stable/scripts/Soapi.js\">http://soapi.info/code/js/stable/scripts/Soapi.js</a></li>\n<li><a href=\"http://soapi.info/code/js/stable/scripts/Soapi.min.js\">http://soapi.info/code/js/stable/scripts/Soapi.min.js</a></li>\n<li><a href=\"http://soapi.info/code/js/stable/scripts/Soapi-vsdoc.js\">http://soapi.info/code/js/stable/scripts/Soapi-vsdoc.js</a></li>\n<li><a href=\"http://soapi.info/code/js/stable/scripts/Soapi.min-vsdoc.js\">http://soapi.info/code/js/stable/scripts/Soapi.min-vsdoc.js</a></li>\n<li><a href=\"http://soapi.info/code/js/stable/scripts/Soapi.min.js.gz\">http://soapi.info/code/js/stable/scripts/Soapi.min.js.gz</a> is also available but I have not configured soapi.info to properly serve gzipped content, so please leverage this option by self hosting on a server that is properly configured to serve gzipped scripts.</li>\n</ul>\n\n<p><sub>While discountasp.net is typically trustworthy, I make any guarantee up uptime other than what they provide me.</sub></p>\n\n<h3>Platform</h3>\n\n<p>Soapi.js has been tested on all modern major browsers. Reports of platform related issues are welcome.</p>\n\n<h2>Contact</h2>\n\n<p>You can contact the author, me, Sky Sanders (<a href=\"http://stackapps.com/users/14/code-poet\">code poet</a>) through my gmail account: sky.sanders</p>\n\n<h2>Code</h2>\n\n<p>Soapi.js was developed leveraging the great JavaScript tooling and debugging capabilities of Visual Studio 2008.</p>\n\n<h3>Usage and Example Index</h3>\n\n<p>In the answers to this Question are reference information, usage examples and demo applications developed with Soapi.js.</p>\n\n<p><strong>Introduction To Soapi.js</strong></p>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/494/foo/657#657\">Usage Introduction</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi/660#660\">Routes: what are they and how to use them</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js/955#955\">Complete Route Listing</a> - suprisingly simple mastery of the API via Soapi.js lies here.</li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js/661#661\">Enumerated Constants, or enums, in Soapi.js</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js/662#662\">Visual Studio JavaScript Intellisense and Code Completion Support</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-date-handling/977#977\">Date handling in Soapi.js</a> - no more unix timestamps. All dates, all the time.</li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-packaging/1005#1005\">The process of building Soapi.js distribution</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1116#1116\">Integrated request caching</a>.</li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1117#1117\">Integrated throttling request queue</a>.</li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-fluent-javascript-wrapper-for-the-stackoverflow-api-rc4/1118#1118\">Paged Requests</a></li>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api/1155#1155\">VectorizedIdList</a> - reliably maximize request payload </li>\n</ul>\n\n<p><strong>How Do I....?</strong></p>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/494/soapi-js/697#697\">How do I get a question?</a></li>\n</ul>\n\n<p><strong>Apps created with Soapi.js</strong></p>\n\n<p>Any known app, great or small, written using Soapi.js will eventually be listed here.</p>\n\n<ul>\n<li><a href=\"http://stackapps.com/questions/741\">StackAd</a> and <a href=\"http://stackapps.com/questions/796\">StackAd Scroller</a> - display random OSS ads on your site</li>\n<li><a href=\"http://stackapps.com/questions/1141/stacked-odds-finding-the-questions-that-you-can-answer\">Stacked-Odds</a> - Finding the questions that you can answer</li>\n<li><a href=\"http://stackapps.com/questions/1114/stackcenter-your-one-stop-for-everything-stackexchange\">StackCenter</a> - Your One Stop for Everything StackExchange</li>\n<li><a href=\"http://stackapps.com/questions/494/soapi/513#513\">Stack Exchange Site Monitor</a></li>\n<li><a href=\"http://soapi.info/code/js/stable/UserBrowser.htm\">User Browser</a> (for badger lovers only)</li>\n<li><a href=\"http://stackapps.com/questions/954/stack-users-lite\">Stack Users Lite</a> - A better user search function</li>\n<li><a href=\"http://stackapps.com/questions/1120/exterminators-bugs-and-features-present-and-past-and-those-who-brought-them-to\">Exterminators</a> - Bugs and Features, Present and Past and those who brought them to light.</li>\n<li><a href=\"http://stackapps.com/questions/tagged/soapi.js\">MORE</a></li>\n</ul>\n\n<p><strong>Online Unit/Integration Tests</strong></p>\n\n<p>If you would like to help test the xbrowser compatability of Soapi.js, you may run a suite of tests in your browser or on your device. Thumbs up/Thumbs down reports in comments along with the platform and browser would be greatly appreciated.</p>\n\n<p>The test suite will always be <a href=\"http://soapi.info/Code/JS/Stable/Tests.html\"><strong>here</strong></a>.</p>\n",
      "comments": [
        {
          "comment_id": 1130,
          "creation_date": 1276154946,
          "owner": {
            "user_id": 32,
            "user_type": "registered",
            "display_name": "Maxim Zaslavsky",
            "reputation": 2361,
            "email_hash": "319bd6ef9c9c8d876f731150cb4951c7"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "&quot;soapy&quot;! &lt;!-- comment --&gt;"
        },
        {
          "comment_id": 1131,
          "creation_date": 1276160175,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 32,
            "user_type": "registered",
            "display_name": "Maxim Zaslavsky",
            "reputation": 2361,
            "email_hash": "319bd6ef9c9c8d876f731150cb4951c7"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@maxim - yup. I know and I like it. ;-)"
        },
        {
          "comment_id": 1289,
          "creation_date": 1276477404,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code, maybe I&#39;m going blind, but how do you retrieve <b>just a question</b>? I see <code>AnswersById</code>, but this is only valid for answers, not questions, and I&#39;m not using VS so I can&#39;t see the intellisense hints, and I&#39;ve scoured the <code>soapi.generated.js</code> file to try and find the parameter and maybe I&#39;m just tired... sigh"
        },
        {
          "comment_id": 1290,
          "creation_date": 1276478994,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@farseeker - see the answer  <code>A: How do I get a question?</code> <a href=\"http://stackapps.com/questions/494/soapi-js-easy-to-use-fluent-javascript-wrapper-for-the-stackoverflow-api/697#697\" title=\"soapi js easy to use fluent javascript wrapper for the stackoverflow api\">stackapps.com/questions/494/&hellip;</a>"
        },
        {
          "comment_id": 1291,
          "creation_date": 1276479235,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@farseeker - I am finishing up the beta3 of soapi.cs and soapi.sl and getting that documentation generated. Then I will have to break out my old proof of concept javascript documentation generator, get it up to date and generate .chm and html docs for Soapi.JS as well. FWIW the method names are generated directly from the route path with a few formating conventions. With a little examination the pattern will become clear."
        },
        {
          "comment_id": 1292,
          "creation_date": 1276480365,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code - thanks, that&#39;s very helpful :)"
        },
        {
          "comment_id": 1293,
          "creation_date": 1276480958,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "edit_count": 2,
          "body": "Turns out I was just being dense. I was using singlar instead of plurar (<code>getQuestionById</code> instead of <code>getQuestionsById</code>)"
        },
        {
          "comment_id": 1294,
          "creation_date": 1276482600,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@farseeker - the method names are not the prettiest, but as I intend all of the Soapi libraries to serve as solid core foundations upon which higher level libraries can be built I felt it would be best to generate all of the identifiers directly from the api specs. Once I have the core libraries up I will post examples of extending Soapi with lazy loaded object graphs. say, start with a Users, dot Questions will load questions if empty (Users.Questions.load/refresh are explicit directives) and so on throughout the object graph enabling fluent dot navigation across the entire api."
        },
        {
          "comment_id": 1295,
          "creation_date": 1276485530,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: Wouldn&#39;t Doxygen be more what you&#39;re looking for? IIRC, it can generate CHM, HTML, LaTeX, etc. from Javascript code."
        },
        {
          "comment_id": 1296,
          "creation_date": 1276486060,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@george - last time I checked it did not support javascript xml comments. I will take another look. I certainly do not look forward to managing this myself. I have other things I would like to do. Thanks for the heads up."
        },
        {
          "comment_id": 1297,
          "creation_date": 1276487354,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: I&#39;d offer to make something, except my plate is quite full :) <i>[what with your contest and all!]</i>"
        },
        {
          "comment_id": 1298,
          "creation_date": 1276487703,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: You should drop by #stackapps on Freenode :)"
        },
        {
          "comment_id": 1466,
          "creation_date": 1276673697,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: is it correct to see Undefined on top of the widgets of this page? <a href=\"http://soapi.info/Code/JS/Stable/StackExchangeStatusMonitor.htm\" rel=\"nofollow\">soapi.info/Code/JS/Stable/StackExchangeStatusMonitor.htm</a>"
        },
        {
          "comment_id": 1471,
          "creation_date": 1276684874,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@system - the displayname property was removed from the /stats return. so, yeah, I guess it is correct. ;-)"
        },
        {
          "comment_id": 2003,
          "creation_date": 1277573885,
          "owner": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "edit_count": 2,
          "body": "The Javascript code download using the link given on your site doesn&#39;t work. The link is given as: <a href=\"http://soapi.info/downloads/Soapi.JS.beta3-refresh.zip\" rel=\"nofollow\">soapi.info/downloads/Soapi.JS.beta3-refresh.zip</a>"
        },
        {
          "comment_id": 2007,
          "creation_date": 1277577335,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@Yacoby - sorry about that. updated to beta 4. have yet to incorporate the stackauth methods in js. am working on refining the code generation and will inform when update is available."
        },
        {
          "comment_id": 2013,
          "creation_date": 1277590786,
          "owner": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code Np. Are you also working on a wrapper around the <code>&#47;sites</code> method? (I may have just missed it in the current version)"
        },
        {
          "comment_id": 2015,
          "creation_date": 1277593364,
          "owner": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code One last question... How do I get answers by user id?"
        },
        {
          "comment_id": 2016,
          "creation_date": 1277596305,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@yacoby - yes, the stackauth methods will be folded in the next version.  for reference, the routes are named similarly to the url so /users/{id}/answers would be usersByIdAnswers. You can use beta 4 to get acquainted with the library but since the API is frozen, I have suspended code generation and am manually refactoring the library. I am not taking anything out, just consolidating. I will release it as beta 9. should be in"
        },
        {
          "comment_id": 2228,
          "creation_date": 1277981899,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 1,
          "body": "I just realized that Soapi.JS is licensed under the GPL v2 only. That&#39;s generally fine, appreciated and your choice anyway, however: I&#39;m currently in the prototyping phase regarding some larger projects and have to decide which components to build these upon. While I intend to open source most derived components too (hard to avoid with JS anyway ;) the assembled apps might not be for various reasons (think e.g. GAE/GWT here). Are you considering dual licensing Soapi.JS in the future, e.g. (ideally ;) with the MIT License like jQuery or (understandably) a commercial license option? Thanks much!"
        },
        {
          "comment_id": 2229,
          "creation_date": 1277983673,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 1,
          "edit_count": 1,
          "body": "To add some context: <a href=\"http://stackoverflow.com/search?q=JavaScript+GPL\">GPL licensing with JavaScript</a> is obviously a complex matter, highlighted pretty well e.g. in <a href=\"http://stackoverflow.com/questions/2992391\">Is this scenario in compliance with GPLv3?</a>. A more concise summary might be <a href=\"http://planet.mysql.com/entry/?id=11940\" rel=\"nofollow\">GPL and Javascript</a>. See Richard Stallmanns position regarding the <a href=\"http://www.gnu.org/philosophy/javascript-trap.html\" rel=\"nofollow\">The JavaScript Trap</a> too, eventually, as he refers to input from John Resig of jQuery fame specifically."
        },
        {
          "comment_id": 2232,
          "creation_date": 1277992673,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 1,
          "body": "@steffen - thanks for bringing this up and adding some well researched context to your question. Yes, initially i released soapi dual licensed ala jquery. I don&#39;t know when/why this changed in my mind but it just seemed to propagate throughout without questioning it. I will make it clear that it is (again) dual licensed and that until the next release where this will be codified, feel free to amend any license notice accordingly with my blessing."
        },
        {
          "comment_id": 2233,
          "creation_date": 1277994939,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 1,
          "body": "@steffen - licensing has been updated here and in the package. thanks."
        },
        {
          "comment_id": 2245,
          "creation_date": 1278012861,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 1,
          "body": "@code poet - Awesome, thanks so much! It would have been a real pity not being able to built upon your excellent work, which isn&#39;t just extremely productive, but really opened new design options regarding my project architecture, very inspiring! So thanks again, I really hope there&#39;s something in it for all of us in the long run, aside from all the fun, anyway :)"
        },
        {
          "comment_id": 2440,
          "creation_date": 1278423878,
          "owner": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@code poet Sometimes undefined is passed to <code>isArray</code> which causes an error. I changed line 621 to <code>return (obj !== undefined &amp;&amp; obj.constructor.toString().indexOf(&quot;Array&quot;) !== -1);</code> and deleted lines 622 to 629.\n\nI don&#39;t yet know why undefined was passed to the function. I suspect it is an error in my code."
        },
        {
          "comment_id": 2441,
          "creation_date": 1278424559,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@Yacoby, while the internal code should not be calling isArray on an undefined value, I probably should guard it a little more. Keep in mind that <code>undefined</code> can be assigned to anything, so <code>obj!==undefined</code> is considered weak compared to <code>typeof(obj)==&#39;undefined&#39;</code>.  You should open a ticket here: <a href=\"http://soapijs.codeplex.com/workitem/list/basic\" rel=\"nofollow\">soapijs.codeplex.com/workitem/list/basic</a> so that we can document this"
        },
        {
          "comment_id": 2442,
          "creation_date": 1278425123,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "edit_count": 4,
          "body": "@yacoby - also it would help me understand the problem and perhaps identify potential issues if you would state the OS/Browser that you are using when this error occurs. Please do so in a ticket and we will get this resolved."
        },
        {
          "comment_id": 2443,
          "creation_date": 1278425587,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@yacoby - in the meantime, try <code>function isArray(obj) { return (typeof (obj) != &#39;undefined&#39;) &amp;&amp; obj.constructor &amp;&amp; obj.constructor.toString().indexOf(&quot;Array&quot;) != -1; }</code>"
        },
        {
          "comment_id": 2779,
          "creation_date": 1279224169,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@yacoby. could you verify that the latest release resolves this issue?"
        },
        {
          "comment_id": 2813,
          "creation_date": 1279271395,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: Can you add <a href=\"http://stackapps.com/questions/1114/stackcenter-your-one-stop-for-everything-stackexchange\">StackCenter</a> to your list of apps that use Soapi.JS?"
        },
        {
          "comment_id": 2846,
          "creation_date": 1279455730,
          "owner": {
            "user_id": 1049,
            "user_type": "registered",
            "display_name": "Yacoby",
            "reputation": 331,
            "email_hash": "71d101426b076a62da18b800cccf62a2"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code I don&#39;t seem to be having any problems with the latest version :)"
        },
        {
          "comment_id": 2853,
          "creation_date": 1279493247,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "Please bold the <b>&quot;unix timestamps are converted to/from JavaScript Date transparently&quot;</b> part. I spent a lot of time trying to figure out why something wasn&#39;t working... and this was why."
        },
        {
          "comment_id": 2856,
          "creation_date": 1279500413,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@geo - Date handling in Soapi.js - no more unix timestamps. All dates, all the time. -&gt; <a href=\"http://stackapps.com/questions/494/soapi-js-date-handling/977#977\" title=\"soapi js date handling\">stackapps.com/questions/494/soapi-js-date-handling/977#977</a>"
        },
        {
          "comment_id": 2858,
          "creation_date": 1279504877,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code: Heh-heh... missed that. Can you please add <a href=\"http://stackapps.com/questions/1114/stackcenter-your-one-stop-for-everything-stackexchange\">StackCenter</a> to your list of apps that use Soapi.JS?"
        },
        {
          "comment_id": 2861,
          "creation_date": 1279516186,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@geo - sure, when I next update the question I will also update the list with all apps that are listed under the &#39;more&#39; item."
        },
        {
          "comment_id": 2924,
          "creation_date": 1279605621,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@steffen - heads up. throttle issue resolved - soapi.js released. now just need to flatten some closures to tighten up the memory footprint.  Thanks for you feedback and support."
        },
        {
          "comment_id": 2939,
          "creation_date": 1279628555,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 494,
          "post_type": "question",
          "score": 0,
          "body": "@code poet - that&#39;s great news, congrats for release 1.0 :) Thanks much for the heads up and persistently tackling this crucial issue in the first place, and thanks even more for the great library again!"
        }
      ]
    },
    {
      "tags": [
        "discussion"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1452,
          "accepted": false,
          "answer_comments_url": "/answers/1452/comments",
          "question_id": 1451,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282431244,
          "last_activity_date": 1282431244,
          "up_vote_count": 1,
          "down_vote_count": 2,
          "view_count": 0,
          "score": -1,
          "community_owned": false,
          "title": "Helping people is 'noise or pointless'?",
          "body": "<p>It wasn't pointless when it was first posted, and now it is because the problem no longer exists.</p>\n\n<p>Alternatively, it could be deleted but that would remove all rep gained from the question which is incorrect, because rep gained <em>at the time</em> is perfectly legitimate.</p>\n\n<p>About the [dev-tip] questions: all poll style questions (ie.  \"How would you...?\") are getting CW'd in the future as a matter of policy, the [dev-tip] questions were CW'd accordingly.  Likewise for code samples that aren't in response to a legitimate question, those should go on a library's posts (which will remain non-wiki, naturally).</p>\n",
          "comments": [
            {
              "comment_id": 3746,
              "creation_date": 1282435950,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 1452,
              "post_type": "answer",
              "score": 2,
              "body": "Seems perfectly reasonable to me."
            },
            {
              "comment_id": 3756,
              "creation_date": 1282546600,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1452,
              "post_type": "answer",
              "score": 0,
              "body": "-1 - I disagree, you are essentially saying that any <code>bug</code> or <code>feature-request</code> which enters <code>status-completed</code> should be closed as pointless because <i>the problem no longer exists</i>. This is really ridiculous, it is a well known fact for any professional software developer, that documenting former issues helps to both avoid them in the future as well as identifying possibly related new ones. If anything, this is another indication that the <a href=\"http://meta.stackoverflow.com/questions/55163\">role of Stack Apps</a> should be taken care of, which would imply a related Meta site for these kind of posts."
            },
            {
              "comment_id": 3757,
              "creation_date": 1282546880,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1452,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "And to answer one potential argument upfront: while it is true that just closing rather than deleting does retain the information as well, it is well proven that closing is just the first step to increase the likelihood of later deletion due to pass by deletionists enormously, in addition the explanation of the close sends an entire wrong message to readers regarding my main argument above, that having former issues documented is extremely useful and not <i>actively harmful</i> at all!"
            },
            {
              "comment_id": 3760,
              "creation_date": 1282551035,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "post_id": 1452,
              "post_type": "answer",
              "score": 2,
              "edit_count": 2,
              "body": "@Steffen - the post in question was neither <code>bug</code> nor a <code>feature-request</code>, and it never was <code>status-completed</code> accordingly.  Your argument is fallacious.  Leaving it &quot;live&quot; just encourages people to continuing apply its (now incorrect) advice."
            },
            {
              "comment_id": 3762,
              "creation_date": 1282552906,
              "owner": {
                "user_id": 377,
                "user_type": "registered",
                "display_name": "Steffen Opel",
                "reputation": 1240,
                "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
              },
              "reply_to_user": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "post_id": 1452,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "you know very well that the borders between <code>discussion</code>, <code>support</code>, <code>bug</code> and <code>feature-request</code> are blurred here on Stack Apps due to its unclear focus - the post is addressing a problem with the API and could have been submitted as <code>bug</code>, <code>feature-request</code> or workaround answer to one of these as well. I&#39;m trying to stress the fact, that your argument <i>the problem no longer exists</i> is mood in judging whether to close such questions or not. That aside @code already pointed out that he updated his post after the advice lost its main purpose to encourage people doing it the right way."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1451/timeline",
      "question_comments_url": "/questions/1451/comments",
      "question_answers_url": "/questions/1451/answers",
      "question_id": 1451,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282429455,
      "last_activity_date": 1282431244,
      "up_vote_count": 2,
      "down_vote_count": 1,
      "view_count": 101,
      "score": 1,
      "community_owned": false,
      "title": "Helping people is 'noise or pointless'?",
      "body": "<p><a href=\"http://stackapps.com/questions/889\">How to batch up multiple id requests to maximize economy and still avoid (400) Bad Request</a> [closed]</p>\n\n<pre>\nclosed as noise or pointless by Kevin Montrose♦ Aug 16 at 23:15\nThis question does not add anything useful; having it present on the site is actively\n harmful because it distracts from other more useful questions.\n</pre>\n\n<p>At the time, the API was killing requests with longer than an undefined path length.</p>\n\n<p>see: <a href=\"http://stackapps.com/questions/619/url-length-limit-for-for-requests-taking-vectorised-ids-answers-id-question\">http://stackapps.com/questions/619/url-length-limit-for-for-requests-taking-vectorised-ids-answers-id-question</a></p>\n\n<p>In the spirit helping people maximize economy of requests while working around this limitation, which has subsequently been relaxed, I took the time to clearly define the problem and provide  detailed guidance and code.</p>\n\n<p>When the limitation was relaxed, I updated the post, prominently stating that the problem had been fixed and provided a link to the announcement.</p>\n\n<p>During a recent and, in my opinion, unwarranted, CW spree on my guidance posts, kevin closed the post listed above as 'noise or pointless'.</p>\n\n<p>I think this is completely inaccurate and completely inappropriate and I take offense.</p>\n\n<p>Thoughts?</p>\n",
      "comments": []
    },
    {
      "tags": [
        "bug",
        "status-completed"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1450,
          "accepted": true,
          "answer_comments_url": "/answers/1450/comments",
          "question_id": 1449,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282420602,
          "last_activity_date": 1282420602,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "API selectively ignores jsonp parameter - havok ensues",
          "body": "<p>This should be fixed now.  Changes in our caching scheme were causing the <code>jsonp</code> parameter to be ignored.</p>\n",
          "comments": [
            {
              "comment_id": 3745,
              "creation_date": 1282422698,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1450,
              "post_type": "answer",
              "score": 0,
              "body": "yes, it does. i know it can be tricky getting the most out of your caching when supporting jsonp."
            }
          ]
        }
      ],
      "accepted_answer_id": 1450,
      "favorite_count": 0,
      "question_timeline_url": "/questions/1449/timeline",
      "question_comments_url": "/questions/1449/comments",
      "question_answers_url": "/questions/1449/answers",
      "question_id": 1449,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282405181,
      "last_edit_date": 1282420609,
      "last_activity_date": 1282420609,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 90,
      "score": 2,
      "community_owned": false,
      "title": "API selectively ignores jsonp parameter - havok ensues",
      "body": "<p><strong>UPDATE: this is happening on all routes now and seems to be getting worse. Whatever it is just started this morning.</strong></p>\n\n<p>compare url to json response</p>\n\n<pre>\nGET /1.0/users/14/badges?key=qgAq_KfDu0KYzlNG-qaTuw&jsonp=Soapi._jsonp123 HTTP/1.1\n\nHTTP/1.1 200 OK\nServer: nginx\nDate: Sat, 21 Aug 2010 15:48:23 GMT\nContent-Type: application/json; charset=utf-8\nConnection: keep-alive\nCache-Control: private\nX-AspNetMvc-Version: 2.0\nX-RateLimit-Max: 10000\nX-RateLimit-Current: 8018\nX-AspNet-Version: 4.0.30319\nContent-Length: 8302\n\nSoapi._jsonp124({\n  \"badges\": [\n    {\n      \"badge_id\": 1,\n      \"rank\": \"bronze\",\n      \"name\": \"Teacher\",\n      \"description\": \"Answered first question with score of 1 or more\",\n      \"award_count\": 1,\n      \"tag_based\": false,\n      \"user\": {\n        \"user_id\": 14,\n        \"user_type\": \"registered\",\n        \"display_name\": \"code poet\",\n        \"reputation\": 6667,\n        \"email_hash\": \"df4a7fbd8a054fd6193ca0ee62952f1f\"\n      },\n      \"badges_recipients_url\": \"/badges/1\"\n    },\n  ]\n}\n)\n\n\n------------------------------------------------------------------\n\n\n</pre>\n\n<hr>\n\n<p>Very odd. </p>\n\n<p>This is currently only happening to me on the /badges route when the requests are within a few hundred milliseconds of each other but it is  consistently reproducible.</p>\n\n<p>I can't imagine that there is anything special about that would make /badges behave any different than other routes so I would say that I have just been (un)lucky enough to not have encountered this issue before and that it exists across the board.</p>\n\n<p>Again, this is 100% reproducible.</p>\n\n<p>The havok ensues when the script returned for ...jsop105 tries to run itself</p>\n\n<ol>\n<li>the data is not for jsonp105, it is the same data that came in jsonp102</li>\n<li>jsonp102 is already disposed - boom.</li>\n</ol>\n\n<pre>\n------------------------------------------------------------------\nGET /1.0/badges?key=qgAq_KfDu0KYzlNG-qaTuw&jsonp=Soapi._jsonp105 HTTP/1.1\nHost: api.stackapps.com\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)\nAccept: */*\nAccept-Language: en-us,en;q=0.5\nAccept-Encoding: gzip,deflate\nAccept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\nKeep-Alive: 115\nConnection: keep-alive\nReferer: http://localhost:17742/AlphaQuickStart.htm\nCookie: __utma=126673999.29861147.1277202313.1281423717.1282250555.10; __utmz=126673999.1280046495.7.2.utmcsr=localhost:23616|utmccn=(referral)|utmcmd=referral|utmcct=/src/SiteOrdering.htm; __qca=P0-1382565058-1277202312540; usr=t=biUFDpTmDESl&s=IUoqpvIcoUmC\n\n\nHTTP/1.1 200 OK\nServer: nginx\nDate: Sat, 21 Aug 2010 15:30:05 GMT\nContent-Type: application/json; charset=utf-8\nConnection: keep-alive\nCache-Control: private\nX-AspNetMvc-Version: 2.0\nX-RateLimit-Max: 10000\nX-RateLimit-Current: 8327\nX-AspNet-Version: 4.0.30319\nContent-Length: 13301\n\nSoapi._jsonp102({\n  \"badges\": [\n    {\n      \"badge_id\": 66,\n      \"rank\": \"bronze\",\n      \"name\": \"Altruist\",\n      \"description\": \"First bounty you manually awarded on another person's question\",\n      \"award_count\": 0,\n      \"tag_based\": false,\n      \"badges_recipients_url\": \"/badges/66\"\n  ]\n  ......\n}\n)\n\n------------------------------------------------------------------\n\n</pre>\n\n<p><strong>Current Workaround</strong></p>\n\n<p>The only way I can seem to ensure valid JSONP results is to ensure that there is at least 150ms between requests.</p>\n\n<p>This contradicts the published throttle guidelines but does ensure valid results.</p>\n\n<p>As background: please see the <a href=\"http://stackapps.com/questions/1433/soapi-js2-a-whole-nother-thang-alpha-preview#1448\">Throttling and Caching</a> exlaination for <a href=\"http://stackapps.com/questions/1433\">Soapi.JS2</a> for the log of the same batch of requests that completed, consistently, without error earlier today.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "bug",
        "status-completed"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1447,
          "accepted": false,
          "answer_comments_url": "/answers/1447/comments",
          "question_id": 1445,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282359161,
          "last_edit_date": 1282360009,
          "last_activity_date": 1282360009,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "API is completely down? content encoding is broken?",
          "body": "<p>The Content-Encoding is [status-norepro], but the <del>empty (or nearly empty)</del> invalid body has been resolved.</p>\n",
          "comments": [
            {
              "comment_id": 3740,
              "creation_date": 1282359586,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1447,
              "post_type": "answer",
              "score": 0,
              "body": "the body seemed to be full, as in up to 4k of binary data that the browser and fiddler could not decode even when forced. The single character that you see in the fiddler log is a typical result of viewing binary data as text, e.g. rendering agent thinks it is unicode and truncates when it hits a null. The log shown above actually has 1k of binary data."
            },
            {
              "comment_id": 3741,
              "creation_date": 1282360063,
              "owner": {
                "user_id": 2,
                "user_type": "moderator",
                "display_name": "Kevin Montrose",
                "reputation": 15776,
                "email_hash": "0c0f8a17fe71547f718e013591008017"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1447,
              "post_type": "answer",
              "score": 0,
              "body": "@code poet - ah yes, missed the Content-Length header on first read through.  Was a prod-only bug, for even more fun."
            }
          ]
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1445/timeline",
      "question_comments_url": "/questions/1445/comments",
      "question_answers_url": "/questions/1445/answers",
      "question_id": 1445,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282357946,
      "last_edit_date": 1282359171,
      "last_activity_date": 1282360009,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 59,
      "score": 2,
      "community_owned": false,
      "title": "API is completely down? content encoding is broken?",
      "body": "<p><strong>all</strong> requests have no content-encoding <em>or</em> have 'gzip,gzip', both of which fail to decompress browser side.</p>\n\n<p>note: the content-encoding header, when it is present, does not seem to be included in the fiddler copy op. but as stated, it is either absent or malformed on all requests.</p>\n\n<pre><code>GET /1.0/users/14/tags?key=qgAq_KfDu0KYzlNG-qaTuw&amp;jsonp=Soapi._jsonp32 HTTP/1.1\nAccept: */*\nReferer: http://localhost:17742/AlphaQuickStart.htm\nAccept-Language: en-US\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)\nAccept-Encoding: gzip, deflate\nHost: api.stackapps.com\nConnection: Keep-Alive\n\n\nHTTP/1.1 200 OK\nServer: nginx\nDate: Sat, 21 Aug 2010 02:29:01 GMT\nContent-Type: application/json; charset=utf-8\nConnection: keep-alive\nCache-Control: private\nX-AspNetMvc-Version: 2.0\nX-RateLimit-Max: 10000\nX-RateLimit-Current: 9931\nX-AspNet-Version: 4.0.30319\nContent-Length: 1062\n\n�\n</code></pre>\n",
      "comments": [
        {
          "comment_id": 3738,
          "creation_date": 1282358616,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1445,
          "post_type": "question",
          "score": 0,
          "body": "seems to be resolved as of now but am leaving question open until word comes from on high."
        },
        {
          "comment_id": 3739,
          "creation_date": 1282358672,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1445,
          "post_type": "question",
          "score": 0,
          "body": "also- i saved the fiddler sessions if needed for reference."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed",
        "rate-limit"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1446,
          "accepted": true,
          "answer_comments_url": "/answers/1446/comments",
          "question_id": 1444,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1282357986,
          "last_activity_date": 1282357986,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "key not being recognized by api.meta.stackoverflow.com?",
          "body": "<p>The omission of the <code>X-...</code> headers was a bug, and has been resolved.</p>\n\n<p>Be aware, if you provide a key that actually isn't recognized you'll get a 4000 error back not a 4004.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 1446,
      "favorite_count": 0,
      "question_timeline_url": "/questions/1444/timeline",
      "question_comments_url": "/questions/1444/comments",
      "question_answers_url": "/questions/1444/answers",
      "question_id": 1444,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1282324840,
      "last_edit_date": 1282357761,
      "last_activity_date": 1282357986,
      "up_vote_count": 3,
      "down_vote_count": 0,
      "view_count": 52,
      "score": 3,
      "community_owned": false,
      "title": "key not being recognized by api.meta.stackoverflow.com?",
      "body": "<p>I have been testing a throttle implementation against meta today and suddenly got shut down with a key violation.</p>\n\n<p>It is <em>possible</em> that I have used enough requests to prompt this but I doubt it.</p>\n\n<p>In any case, is this a proper response for an 'out of requests' error?  </p>\n\n<p>Should it not include the 'x-rate-limit' headers?</p>\n\n<p>Or is this a sign of another problem?</p>\n\n<pre><code>GET /1.0/tags?page=288&amp;pagesize=100&amp;jsonp=Soapi._jsonp151&amp;key=insert-key-here  HTTP/1.1\nAccept: */*\nReferer: http://localhost:17742/tests-throttle.htm\nAccept-Language: en-US\nUser-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)\nAccept-Encoding: gzip, deflate\nHost: api.meta.stackoverflow.com\nConnection: Keep-Alive\n\n\nHTTP/1.1 200 OK\nServer: nginx\nDate: Fri, 20 Aug 2010 17:10:48 GMT\nContent-Type: application/json; charset=utf-8\nConnection: keep-alive\nCache-Control: private\nX-AspNetMvc-Version: 2.0\nX-AspNet-Version: 4.0.30319\nContent-Length: 127\n\nSoapi._jsonp151({\n  \"error\": {\n    \"code\": 4004,\n    \"message\": \"This IP has exceeded the request-per-day limit.\"\n  }\n}\n)\n</code></pre>\n",
      "comments": []
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1412,
          "accepted": false,
          "answer_comments_url": "/answers/1412/comments",
          "question_id": 1411,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281998046,
          "last_edit_date": 1281999206,
          "last_activity_date": 1281999206,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to generate a list of users ranked by bug report submissions.",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<hr>\n\n<pre><code>Site site = Context.Official.StackApps;\n\nvar bugs = new List&lt;Question&gt;();\n\n// put all questions from all users which\n// have tag 'bug'\nsite.Users.PageSize(100).PageCount(0)   // all users\n    .Where(user =&gt; user.QuestionCount &gt; 0) // that have q\n    .Select(user =&gt; user.UserId) // get user_id\n    .InBatches(100).ToList() // in batches of 100\n    .ForEach(batch =&gt;  \n        bugs.AddRange( // q with 'bug' from this batch of 100 users\n            site.Users.ById(batch).Questions\n            .PageCount(0).PageSize(100)\n            .Where(q =&gt; q.Tags.Contains(\"bug\"))));\n\n\nConsole.WriteLine(\"User\\t\\tTotal\\tResolved\\rDeferred\\tRTFM!\\tWRYS\");\nConsole.WriteLine(\"-----------------------------------------------------------\");\n\n// group, sort and dump\nbugs.GroupBy(q =&gt; q.OwnerId).Select(g =&gt; new\n    {\n        g.First().Owner.DisplayName,\n        BugCount = g.Count(),\n        Resolved = g.Count(q =&gt; q.Tags.Contains(\"status-completed\")),\n        Deferred = g.Count(q =&gt; q.Tags.Contains(\"status-deferred\")),\n        ByDesign = g.Count(q =&gt; q.Tags.Contains(\"status-bydesign\")),\n        Declined = g.Count(q =&gt; q.Tags.Contains(\"status-declined\"))\n    }).OrderByDescending(item =&gt; item.BugCount)\n    .ThenByDescending(item =&gt; item.Resolved)\n    .ThenByDescending(item =&gt; item.Deferred)\n    .ThenByDescending(item =&gt; item.ByDesign)\n    .ThenByDescending(item =&gt; item.Declined)\n    .ToList().ForEach(item =&gt;\n        Console.WriteLine(\"{0}\\t{1}\\t{2}\\t{3}\\t{4}\\t{5}\",\n        item.DisplayName, item.BugCount, item.Resolved, item.Deferred,\n        item.ByDesign, item.Declined));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\nUser        Total    Resolved Deferred    RTFM!    WRYS\n-----------------------------------------------------------\ncode poet    26    23    0    1    0\nGeorge Edison    12    8    0    3    0\nsystempuntoout    8    5    0    3    0\nS.Mark    7    5    0    1    0\nDennis Williamson    6    5    0    1    0\nBill the Lizard    6    4    1    1    0\nColinD    5    5    0    0    0\nFelix    4    4    0    0    0\nFranci Penov    4    2    1    0    0\ncarson    3    3    0    0    0\nSteffen Opel    3    2    0    0    0\nPeter Mourfield    2    2    0    0    0\nJonathan    2    2    0    0    0\njjnguy    1    1    0    0    0\nGreg Bray    1    1    0    0    0\nmikej    1    1    0    0    0\ncoobird    1    1    0    0    0\nPeter Mortensen    1    1    0    0    0\nBialecki    1    1    0    0    0\nMartin Plante    1    1    0    0    0\nSztupY    1    1    0    0    0\nAdam Wright    1    1    0    0    0\nmagcius    1    1    0    0    0\nWei Hu    1    1    0    0    0\nADB    1    1    0    0    0\nFarseeker    1    0    0    1    0\nMatt S.    1    0    0    1    0\nradius    1    0    0    1    0\nJedi Master Spooky    1    0    0    1    0\nDave DeLong    1    0    0    1    0\nlfoust    1    0    0    1    0\nDave Swersky    1    0    0    1    0\nRichOrr    1    0    0    1    0\nCan Berk Güder    1    0    0    1    0\nArtefacto    1    0    0    1    0\nJim McKeeth    1    0    0    1    0\ntonklon    1    0    0    0    0\nPortman    1    0    0    0    0\nShay Erlichmen    1    0    0    0    0\nNick Presta    1    0    0    0    0\n\n</pre>\n\n<p><strong>Requests generated</strong></p>\n\n<pre>\n\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/users?pagesize=100&key=foo-bar-fu  34,613  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n2   200 HTTP    api.stackapps.com   /1.0/users?page=2&pagesize=100&key=foo-bar-fu   29,504  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n3   200 HTTP    api.stackapps.com   /1.0/users?page=3&pagesize=100&key=foo-bar-fu   25,438  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n4   200 HTTP    api.stackapps.com   /1.0/users?page=4&pagesize=100&key=foo-bar-fu   30,203  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n5   200 HTTP    api.stackapps.com   /1.0/users?page=5&pagesize=100&key=foo-bar-fu   25,295  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n6   200 HTTP    api.stackapps.com   /1.0/users?page=6&pagesize=100&key=foo-bar-fu   27,335  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n7   200 HTTP    api.stackapps.com   /1.0/users?page=7&pagesize=100&key=foo-bar-fu   26,925  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n8   200 HTTP    api.stackapps.com   /1.0/users?page=8&pagesize=100&key=foo-bar-fu   26,285  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n9   200 HTTP    api.stackapps.com   /1.0/users?page=9&pagesize=100&key=foo-bar-fu   24,423  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n10  200 HTTP    api.stackapps.com   /1.0/users?page=10&pagesize=100&key=foo-bar-fu  27,587  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n11  200 HTTP    api.stackapps.com   /1.0/users?page=11&pagesize=100&key=foo-bar-fu  25,370  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n12  200 HTTP    api.stackapps.com   /1.0/users?page=12&pagesize=100&key=foo-bar-fu  27,376  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n13  200 HTTP    api.stackapps.com   /1.0/users?page=13&pagesize=100&key=foo-bar-fu  26,470  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n14  200 HTTP    api.stackapps.com   /1.0/users?page=14&pagesize=100&key=foo-bar-fu  27,049  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n15  200 HTTP    api.stackapps.com   /1.0/users?page=15&pagesize=100&key=foo-bar-fu  25,317  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n16  200 HTTP    api.stackapps.com   /1.0/users?page=16&pagesize=100&key=foo-bar-fu  24,794  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n17  200 HTTP    api.stackapps.com   /1.0/users?page=17&pagesize=100&key=foo-bar-fu  23,604  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n18  200 HTTP    api.stackapps.com   /1.0/users?page=19&pagesize=100&key=foo-bar-fu  25,732  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n19  200 HTTP    api.stackapps.com   /1.0/users?page=18&pagesize=100&key=foo-bar-fu  25,322  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n20  200 HTTP    api.stackapps.com   /1.0/users?page=21&pagesize=100&key=foo-bar-fu  20,903  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n21  200 HTTP    api.stackapps.com   /1.0/users?page=20&pagesize=100&key=foo-bar-fu  24,952  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n22  200 HTTP    api.stackapps.com   /1.0/users?page=22&pagesize=100&key=foo-bar-fu  19,586  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n23  200 HTTP    api.stackapps.com   /1.0/users?page=24&pagesize=100&key=foo-bar-fu  19,628  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n24  200 HTTP    api.stackapps.com   /1.0/users?page=25&pagesize=100&key=foo-bar-fu  21,179  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n25  200 HTTP    api.stackapps.com   /1.0/users?page=23&pagesize=100&key=foo-bar-fu  19,149  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n26  200 HTTP    api.stackapps.com   /1.0/users?page=26&pagesize=100&key=foo-bar-fu  19,142  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n27  200 HTTP    api.stackapps.com   /1.0/users?page=27&pagesize=100&key=foo-bar-fu  22,512  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n28  200 HTTP    api.stackapps.com   /1.0/users?page=28&pagesize=100&key=foo-bar-fu  20,692  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n29  200 HTTP    api.stackapps.com   /1.0/users?page=30&pagesize=100&key=foo-bar-fu  7,239   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n30  200 HTTP    api.stackapps.com   /1.0/users?page=29&pagesize=100&key=foo-bar-fu  17,528  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n31  200 HTTP    api.stackapps.com   /1.0/users/18;2;14;11;51;23;33;8;448;17;30;43;199;56;40;13;39;29;5;9;19;32;127;28;1026;2894;20;26;52;37;816;825;956;377;1241;570;1290;171;1048;192;700;1265;614;839;431;113;295;222;4;1049;1031;42;1395;186;664;1394;638;1263;939;680;757;358;451;424;1303;449;756;2287;693;938;150;151;234;2192;2296;140;339;91;138;553;375;1174;1221;1978;2442;2883;44;239;109;169;505;2734;1270;525;1578;2083;1942;2203;2300;2118/questions?pagesize=100&key=foo-bar-fu  14,688  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n32  200 HTTP    api.stackapps.com   /1.0/users/18;2;14;11;51;23;33;8;448;17;30;43;199;56;40;13;39;29;5;9;19;32;127;28;1026;2894;20;26;52;37;816;825;956;377;1241;570;1290;171;1048;192;700;1265;614;839;431;113;295;222;4;1049;1031;42;1395;186;664;1394;638;1263;939;680;757;358;451;424;1303;449;756;2287;693;938;150;151;234;2192;2296;140;339;91;138;553;375;1174;1221;1978;2442;2883;44;239;109;169;505;2734;1270;525;1578;2083;1942;2203;2300;2118/questions?page=2&pagesize=100&key=foo-bar-fu   14,521  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n33  200 HTTP    api.stackapps.com   /1.0/users/18;2;14;11;51;23;33;8;448;17;30;43;199;56;40;13;39;29;5;9;19;32;127;28;1026;2894;20;26;52;37;816;825;956;377;1241;570;1290;171;1048;192;700;1265;614;839;431;113;295;222;4;1049;1031;42;1395;186;664;1394;638;1263;939;680;757;358;451;424;1303;449;756;2287;693;938;150;151;234;2192;2296;140;339;91;138;553;375;1174;1221;1978;2442;2883;44;239;109;169;505;2734;1270;525;1578;2083;1942;2203;2300;2118/questions?page=3&pagesize=100&key=foo-bar-fu   14,226  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n34  200 HTTP    api.stackapps.com   /1.0/users/18;2;14;11;51;23;33;8;448;17;30;43;199;56;40;13;39;29;5;9;19;32;127;28;1026;2894;20;26;52;37;816;825;956;377;1241;570;1290;171;1048;192;700;1265;614;839;431;113;295;222;4;1049;1031;42;1395;186;664;1394;638;1263;939;680;757;358;451;424;1303;449;756;2287;693;938;150;151;234;2192;2296;140;339;91;138;553;375;1174;1221;1978;2442;2883;44;239;109;169;505;2734;1270;525;1578;2083;1942;2203;2300;2118/questions?page=4&pagesize=100&key=foo-bar-fu   14,146  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n35  200 HTTP    api.stackapps.com   /1.0/users/18;2;14;11;51;23;33;8;448;17;30;43;199;56;40;13;39;29;5;9;19;32;127;28;1026;2894;20;26;52;37;816;825;956;377;1241;570;1290;171;1048;192;700;1265;614;839;431;113;295;222;4;1049;1031;42;1395;186;664;1394;638;1263;939;680;757;358;451;424;1303;449;756;2287;693;938;150;151;234;2192;2296;140;339;91;138;553;375;1174;1221;1978;2442;2883;44;239;109;169;505;2734;1270;525;1578;2083;1942;2203;2300;2118/questions?page=5&pagesize=100&key=foo-bar-fu   9,958   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n36  200 HTTP    api.stackapps.com   /1.0/users/298;1177;1179;1911;2134;2618;636;1856;1986;2679;267;1771;705;1230;1339;1416;2139;2951;587;168;216;1097;892;2532;2616;2222;866;1304;2829;2517;2662;1384;1711;1918;2603;564;1044;2125;1924;1849;1232;667;2418;2467;70;2292;1009;1689;1749;1676;2735/questions?pagesize=100&key=foo-bar-fu  8,925   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:3848            \n\n</pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1411/timeline",
      "question_comments_url": "/questions/1411/comments",
      "question_answers_url": "/questions/1411/answers",
      "question_id": 1411,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281998017,
      "last_edit_date": 1282163758,
      "last_activity_date": 1282163758,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 87,
      "score": 1,
      "community_owned": true,
      "title": "How to generate a list of users ranked by bug report submissions.",
      "body": "<p>The use case is to generate a list of bug report submissions, grouped <em>by User</em>, of the following counts in descending order:</p>\n\n<ul>\n<li><code>bug</code></li>\n<li><code>bug</code> + <code>status-completed</code> </li>\n<li><code>bug</code> + <code>status-deferred</code> </li>\n<li><code>bug</code> + <code>status-bydesign</code> </li>\n<li><code>bug</code> + <code>status-declined</code></li>\n</ul>\n\n<p>e.g.</p>\n\n<pre>\nuser   bugs   completed   deferred  bydesign   declined\n------+------+-----------+---------+----------+----------\njoe    10     4            3         1          1\n.....\n</pre>\n\n<p>Post your solution to this use case in the language/library syntax of your choice.</p>\n",
      "comments": [
        {
          "comment_id": 3689,
          "creation_date": 1281999607,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1411,
          "post_type": "question",
          "score": 0,
          "body": "Would you be able to post Soapi.JS examples? I would myself but have limited time on my hands."
        },
        {
          "comment_id": 3694,
          "creation_date": 1282007051,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1411,
          "post_type": "question",
          "score": 0,
          "body": "@geo - i went ahead and posted for the other questions but this one i will wait until tonight."
        },
        {
          "comment_id": 3695,
          "creation_date": 1282011409,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1411,
          "post_type": "question",
          "score": 0,
          "body": "Great! Thanks so much. Completely unrelated, but I would love to collaborate with you on that ActionScript wrapper :) - please let me know when you have the time... I know you&#39;re quite busy."
        },
        {
          "comment_id": 3701,
          "creation_date": 1282066696,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1411,
          "post_type": "question",
          "score": 0,
          "body": "@geo - r.e. the AS port: that sounds good. when i get the new js lib done we can start exploring options."
        }
      ]
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 3,
      "answers": [
        {
          "answer_id": 1409,
          "accepted": false,
          "answer_comments_url": "/answers/1409/comments",
          "question_id": 1408,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281990880,
          "last_activity_date": 1281990880,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to generate a list of users ranked by activity (question or answer count).",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<hr>\n\n<p><strong>Questions</strong></p>\n\n<pre><code>(from user in Context.Official.StackApps\n     .Users.PageSize(100).PageCount(0)\n where user.QuestionCount &gt; 0\n orderby user.QuestionCount descending\n select user)\n .ToList().ForEach(user =&gt;\n     Console.WriteLine(\"{0} - {1} [{2}]\",\n     user.QuestionCount, user.DisplayName, user.UserId));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n95 - code poet [14]\n56 - George Edison [18]\n21 - S.Mark [40]\n19 - systempuntoout [51]\n14 - Felix [956]\n13 - Kevin Montrose [2]\n11 - Franci Penov [13]\n11 - Jedi Master Spooky [192]\n10 - Dave Swersky [29]\n10 - Steffen Opel [377]\n9 - carson [33]\n9 - Bill the Lizard [9]\n9 - ColinD [222]\n7 - Dennis Williamson [171]\n6 - Dave DeLong [448]\n6 - jjnguy [39]\n5 - TheHurt [17]\n5 - SztupY [1265]\n5 - radius [295]\n5 - johnwards [638]\n4 - Matt S. [30]\n4 - Jason [19]\n4 - Farseeker [816]\n4 - Soviut [825]\n4 - Yacoby [1049]\n4 - Jonathan [938]\n3 - Joel Potter [8]\n3 - Adam Wright [5]\n3 - Edan Maor [1241]\n3 - codeka [1290]\n3 - Mark Rushakoff [1048]\n3 - Shay Erlichmen [614]\n3 - swanson [839]\n3 - Igor Zevaka [113]\n3 - Adam [1395]\n3 - Nick Presta [186]\n3 - eWolf [664]\n3 - Koning Baard [451]\n3 - Peter Mourfield [424]\n3 - phsr [693]\n3 - Greg Bray [150]\n3 - mlaw [2467]\n2 - lfoust [11]\n2 - Maxim Zaslavsky [32]\n2 - Martin Plante [28]\n2 - nabeelmukhtar [1026]\n2 - Catchwa [700]\n2 - Thomas McDonald [1031]\n2 - Kyle Cronin [42]\n2 - Ryan Brunner [1263]\n2 - Robert Munteanu [358]\n2 - Josh Kelley [2287]\n2 - Peter Mortensen [151]\n2 - mikej [339]\n2 - svick [505]\n2 - Shane [1270]\n2 - Peter Ajtai [2618]\n2 - Jim McKeeth [267]\n2 - chanchal1987 [2951]\n2 - TheKaptain [1232]\n1 - Chacha102 [23]\n1 - balpha [43]\n1 - Ricky [199]\n1 - Martijn Laarman [56]\n1 - adrianbanks [127]\n1 - AidenMontgomery [2894]\n1 - voyager [20]\n1 - Evan [26]\n1 - Tim Post [52]\n1 - scunliffe [37]\n1 - Lucas Jones [570]\n1 - Robert Cartaino [431]\n1 - Jeff Atwood [4]\n1 - InfinitiesLoop [1394]\n1 - Heavy Bytes [939]\n1 - Nathan Reed [680]\n1 - RichH [757]\n1 - Jan Fabry [1303]\n1 - conmulligan [449]\n1 - Bialecki [756]\n1 - Michael B. [234]\n1 - Riduidel [2192]\n1 - Kevin [2296]\n1 - James A. Rosen [140]\n1 - Soldier.moth [91]\n1 - Matthew Pelser [138]\n1 - denny [553]\n1 - iconiK [375]\n1 - Chris S [1174]\n1 - Nippysaurus [1221]\n1 - jmoy [1978]\n1 - Nathan Voxland [2442]\n1 - Alexandre Rafalovitch [2883]\n1 - Mark Hurd [44]\n1 - Lucas McCoy [239]\n1 - Cristian Castiblanco [109]\n1 - Casebash [169]\n1 - tonklon [2734]\n1 - coobird [525]\n1 - Robert Love [1578]\n1 - Charles Stewart [2083]\n1 - C.W.Holeman II [1942]\n1 - Frank Krueger [2203]\n1 - Roy Tang [2300]\n1 - David [2118]\n1 - ripper234 [298]\n1 - Simon Brown [1177]\n1 - Artefacto [1179]\n1 - JL01 [1911]\n1 - Shimmy [2134]\n1 - Can Berk Güder [636]\n1 - Fernando [1856]\n1 - crucible [1986]\n1 - Nicolas Raoul [2679]\n1 - Vitaly Polonetsky [1771]\n1 - ADB [705]\n1 - Wei Hu [1230]\n1 - stacker [1339]\n1 - zengr [1416]\n1 - Vicky [2139]\n1 - Portman [168]\n1 - Ngu Soon Hui [216]\n1 - Dan Atkinson [587]\n1 - chalup [892]\n1 - Matt Huggins [1097]\n1 - peter.newhook [1924]\n1 - blork [1849]\n1 - fukas78 [667]\n1 - Joe [2418]\n1 - John Bristowe [70]\n1 - chenyuejie [2292]\n1 - daltojr [1009]\n1 - hvgotcodes [2532]\n1 - arinte [2616]\n1 - bpedro [2222]\n1 - Fatal510 [866]\n1 - magcius [1304]\n1 - Matt Culbreth [2829]\n1 - James Johnson [2517]\n1 - tsudot [2662]\n1 - pierocampanelli [1384]\n1 - user1711 [1711]\n1 - Michal [1918]\n1 - DC01 [2603]\n1 - Mattias Konradsson [564]\n1 - Alienfluid [1044]\n1 - theplic [2125]\n1 - Dinis Cruz [1676]\n1 - pufferfish [1689]\n1 - RichOrr [1749]\n1 - Bidhan Baruah [2735]\n</pre>\n\n<p><strong>Requests generated</strong></p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/users?pagesize=100&key=foo-bar-fu  34,619  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n2   200 HTTP    api.stackapps.com   /1.0/users?page=2&pagesize=100&key=foo-bar-fu   29,504  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n3   200 HTTP    api.stackapps.com   /1.0/users?page=3&pagesize=100&key=foo-bar-fu   25,439  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n4   200 HTTP    api.stackapps.com   /1.0/users?page=4&pagesize=100&key=foo-bar-fu   30,203  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n5   200 HTTP    api.stackapps.com   /1.0/users?page=5&pagesize=100&key=foo-bar-fu   25,291  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n6   200 HTTP    api.stackapps.com   /1.0/users?page=6&pagesize=100&key=foo-bar-fu   27,337  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n7   200 HTTP    api.stackapps.com   /1.0/users?page=7&pagesize=100&key=foo-bar-fu   26,923  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n8   200 HTTP    api.stackapps.com   /1.0/users?page=8&pagesize=100&key=foo-bar-fu   26,279  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n9   200 HTTP    api.stackapps.com   /1.0/users?page=9&pagesize=100&key=foo-bar-fu   24,423  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n10  200 HTTP    api.stackapps.com   /1.0/users?page=10&pagesize=100&key=foo-bar-fu  27,592  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n11  200 HTTP    api.stackapps.com   /1.0/users?page=11&pagesize=100&key=foo-bar-fu  25,372  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n12  200 HTTP    api.stackapps.com   /1.0/users?page=12&pagesize=100&key=foo-bar-fu  27,376  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n13  200 HTTP    api.stackapps.com   /1.0/users?page=13&pagesize=100&key=foo-bar-fu  26,468  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n14  200 HTTP    api.stackapps.com   /1.0/users?page=14&pagesize=100&key=foo-bar-fu  27,049  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n15  200 HTTP    api.stackapps.com   /1.0/users?page=15&pagesize=100&key=foo-bar-fu  25,316  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n16  200 HTTP    api.stackapps.com   /1.0/users?page=16&pagesize=100&key=foo-bar-fu  24,796  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n17  200 HTTP    api.stackapps.com   /1.0/users?page=17&pagesize=100&key=foo-bar-fu  23,601  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n18  200 HTTP    api.stackapps.com   /1.0/users?page=20&pagesize=100&key=foo-bar-fu  24,853  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n19  200 HTTP    api.stackapps.com   /1.0/users?page=18&pagesize=100&key=foo-bar-fu  25,322  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n20  200 HTTP    api.stackapps.com   /1.0/users?page=19&pagesize=100&key=foo-bar-fu  25,732  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n21  200 HTTP    api.stackapps.com   /1.0/users?page=21&pagesize=100&key=foo-bar-fu  20,858  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n22  200 HTTP    api.stackapps.com   /1.0/users?page=23&pagesize=100&key=foo-bar-fu  19,298  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n23  200 HTTP    api.stackapps.com   /1.0/users?page=22&pagesize=100&key=foo-bar-fu  19,569  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n24  200 HTTP    api.stackapps.com   /1.0/users?page=24&pagesize=100&key=foo-bar-fu  19,497  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n25  200 HTTP    api.stackapps.com   /1.0/users?page=25&pagesize=100&key=foo-bar-fu  21,228  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n26  200 HTTP    api.stackapps.com   /1.0/users?page=26&pagesize=100&key=foo-bar-fu  19,083  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n27  200 HTTP    api.stackapps.com   /1.0/users?page=29&pagesize=100&key=foo-bar-fu  17,666  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n28  200 HTTP    api.stackapps.com   /1.0/users?page=27&pagesize=100&key=foo-bar-fu  22,492  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n29  200 HTTP    api.stackapps.com   /1.0/users?page=28&pagesize=100&key=foo-bar-fu  20,669  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n30  200 HTTP    api.stackapps.com   /1.0/users?page=30&pagesize=100&key=foo-bar-fu  6,871   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6452            \n\n</pre>\n\n<hr>\n\n<p><strong>Answers</strong></p>\n\n<pre><code>(from user in Context.Official.StackApps\n     .Users.PageSize(100).PageCount(0)\n where user.AnswerCount &gt; 0\n orderby user.AnswerCount descending\n select user)\n .ToList().ForEach(user =&gt;\n     Console.WriteLine(\"{0} - {1} [{2}]\",\n     user.AnswerCount, user.DisplayName, user.UserId));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n204 - Kevin Montrose [2]\n96 - code poet [14]\n69 - George Edison [18]\n34 - S.Mark [40]\n19 - jjnguy [39]\n18 - Chacha102 [23]\n12 - lfoust [11]\n12 - systempuntoout [51]\n12 - Matt S. [30]\n10 - Maxim Zaslavsky [32]\n9 - Joel Potter [8]\n8 - carson [33]\n8 - Franci Penov [13]\n8 - Bill the Lizard [9]\n8 - Farseeker [816]\n7 - Edan Maor [1241]\n7 - Dennis Williamson [171]\n6 - Dave Swersky [29]\n6 - Soviut [825]\n6 - Steffen Opel [377]\n6 - codeka [1290]\n6 - Igor Zevaka [113]\n6 - ColinD [222]\n5 - Catchwa [700]\n5 - Jeff Atwood [4]\n4 - Dave DeLong [448]\n4 - TheHurt [17]\n4 - Adam Wright [5]\n4 - Lucas Jones [570]\n4 - Jonathan [938]\n4 - Greg Bray [150]\n3 - Jason [19]\n3 - Joel Spolsky [308]\n3 - Geoff Dalgas [1]\n3 - SztupY [1265]\n3 - Robert Cartaino [431]\n3 - Yacoby [1049]\n3 - conmulligan [449]\n3 - Riduidel [2192]\n3 - Chris S [1174]\n3 - badp [1165]\n2 - nabeelmukhtar [1026]\n2 - Tim Post [52]\n2 - Felix [956]\n2 - Jedi Master Spooky [192]\n2 - Shay Erlichmen [614]\n2 - swanson [839]\n2 - Thomas McDonald [1031]\n2 - Adam [1395]\n2 - InfinitiesLoop [1394]\n2 - Nathan Reed [680]\n2 - Chris Lawlor [1029]\n2 - Arjan [546]\n2 - rockinthesixstring [1189]\n2 - Simon Brown [1177]\n2 - Sathya [74]\n2 - Darren Newton [93]\n2 - Prashant [1066]\n2 - moberley [2789]\n2 - daltojr [1009]\n2 - Yuval Cohen [1532]\n1 - balpha [43]\n1 - adrianbanks [127]\n1 - John Sheehan [21]\n1 - RedFilter [10]\n1 - Mef [53]\n1 - Evan [26]\n1 - Greg Roberts [61]\n1 - Nick Craver [25]\n1 - radius [295]\n1 - Kyle Cronin [42]\n1 - Nick Presta [186]\n1 - eWolf [664]\n1 - Ryan Brunner [1263]\n1 - Heavy Bytes [939]\n1 - ChrisF [440]\n1 - Robert Munteanu [358]\n1 - Koning Baard [451]\n1 - Portman [168]\n1 - Ngu Soon Hui [216]\n1 - George Stocker [707]\n1 - Daniel Ribeiro [815]\n1 - Randolpho [470]\n1 - Michael B. [234]\n1 - CMS [209]\n1 - John Siracusa [2277]\n1 - rchern [2286]\n1 - Alexandre Rafalovitch [2883]\n1 - Lucas McCoy [239]\n1 - Cristian Castiblanco [109]\n1 - Yuval A [596]\n1 - Greg Hurlman [1019]\n1 - joshperry [1611]\n1 - lexu [307]\n1 - Oscar Reyes [75]\n1 - C.W.Holeman II [1942]\n1 - Brock Woolf [1695]\n1 - Peter Ajtai [2618]\n1 - Jared Harley [208]\n1 - cyberzed [314]\n1 - TWith2Sugars [597]\n1 - Nick Bedford [823]\n1 - dag729 [1034]\n1 - ooo [1151]\n1 - msorens [2067]\n1 - Rox [2472]\n1 - R. Bemrose [2896]\n1 - slf [1172]\n1 - Roger Pate [289]\n1 - brheal [421]\n1 - JonB [542]\n1 - Tripp Lilley [1059]\n1 - Lanny Heidbreder [2282]\n1 - Toby Allen [1593]\n1 - openfrog [1652]\n1 - JR Lawhorne [2398]\n1 - torbengb [2839]\n1 - naugtur [2853]\n1 - blork [1849]\n1 - TheKaptain [1232]\n1 - Joe [2418]\n1 - mlaw [2467]\n1 - jjesse [2648]\n1 - tutuca [2765]\n1 - Steven A. Lowe [2560]\n1 - user2070 [2070]\n1 - maco [2903]\n</pre>\n\n<p><strong>Requests generated</strong></p>\n\n<pre>\n\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/users?pagesize=100&key=foo-bar-fu  34,618  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n2   200 HTTP    api.stackapps.com   /1.0/users?page=2&pagesize=100&key=foo-bar-fu   29,504  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n3   200 HTTP    api.stackapps.com   /1.0/users?page=3&pagesize=100&key=foo-bar-fu   25,439  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n4   200 HTTP    api.stackapps.com   /1.0/users?page=4&pagesize=100&key=foo-bar-fu   30,203  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n5   200 HTTP    api.stackapps.com   /1.0/users?page=5&pagesize=100&key=foo-bar-fu   25,291  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n6   200 HTTP    api.stackapps.com   /1.0/users?page=6&pagesize=100&key=foo-bar-fu   27,337  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n7   200 HTTP    api.stackapps.com   /1.0/users?page=7&pagesize=100&key=foo-bar-fu   26,923  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n8   200 HTTP    api.stackapps.com   /1.0/users?page=8&pagesize=100&key=foo-bar-fu   26,279  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n9   200 HTTP    api.stackapps.com   /1.0/users?page=9&pagesize=100&key=foo-bar-fu   24,423  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n10  200 HTTP    api.stackapps.com   /1.0/users?page=10&pagesize=100&key=foo-bar-fu  27,592  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n11  200 HTTP    api.stackapps.com   /1.0/users?page=11&pagesize=100&key=foo-bar-fu  25,372  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n12  200 HTTP    api.stackapps.com   /1.0/users?page=12&pagesize=100&key=foo-bar-fu  27,376  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n13  200 HTTP    api.stackapps.com   /1.0/users?page=13&pagesize=100&key=foo-bar-fu  26,468  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n14  200 HTTP    api.stackapps.com   /1.0/users?page=14&pagesize=100&key=foo-bar-fu  27,049  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n15  200 HTTP    api.stackapps.com   /1.0/users?page=15&pagesize=100&key=foo-bar-fu  25,316  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n16  200 HTTP    api.stackapps.com   /1.0/users?page=16&pagesize=100&key=foo-bar-fu  24,796  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n17  200 HTTP    api.stackapps.com   /1.0/users?page=17&pagesize=100&key=foo-bar-fu  23,601  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n18  200 HTTP    api.stackapps.com   /1.0/users?page=19&pagesize=100&key=foo-bar-fu  25,732  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n19  200 HTTP    api.stackapps.com   /1.0/users?page=20&pagesize=100&key=foo-bar-fu  24,853  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n20  200 HTTP    api.stackapps.com   /1.0/users?page=21&pagesize=100&key=foo-bar-fu  20,858  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n21  200 HTTP    api.stackapps.com   /1.0/users?page=24&pagesize=100&key=foo-bar-fu  19,497  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n22  200 HTTP    api.stackapps.com   /1.0/users?page=18&pagesize=100&key=foo-bar-fu  25,322  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n23  200 HTTP    api.stackapps.com   /1.0/users?page=22&pagesize=100&key=foo-bar-fu  19,569  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n24  200 HTTP    api.stackapps.com   /1.0/users?page=25&pagesize=100&key=foo-bar-fu  21,228  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n25  200 HTTP    api.stackapps.com   /1.0/users?page=23&pagesize=100&key=foo-bar-fu  19,298  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n26  200 HTTP    api.stackapps.com   /1.0/users?page=26&pagesize=100&key=foo-bar-fu  19,083  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n27  200 HTTP    api.stackapps.com   /1.0/users?page=28&pagesize=100&key=foo-bar-fu  20,669  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n28  200 HTTP    api.stackapps.com   /1.0/users?page=27&pagesize=100&key=foo-bar-fu  22,492  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n29  200 HTTP    api.stackapps.com   /1.0/users?page=30&pagesize=100&key=foo-bar-fu  6,871   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n30  200 HTTP    api.stackapps.com   /1.0/users?page=29&pagesize=100&key=foo-bar-fu  17,666  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7460            \n\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1410,
          "accepted": false,
          "answer_comments_url": "/answers/1410/comments",
          "question_id": 1408,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "creation_date": 1281994607,
          "last_activity_date": 1281994607,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "How to generate a list of users ranked by activity (question or answer count).",
          "body": "<p>Code that does the same in StackWrap4J:</p>\n\n<pre><code>List&lt;User&gt; allUsers = new UsersList(new StackWrapper(\"stackapps.com\"), new UserQuery());\nCollections.sort(allUsers, new Comparator&lt;User&gt;() {\n    @Override\n    public int compare(User o1, User o2) {\n        return o2.getAnswerCount() - o1.getAnswerCount();\n    }\n});\nfor (User u : allUsers) {\n    if (u.getAnswerCount != 0)\n        System.out.println(String.format(\"%4d %15s [%4d]\", u\n                .getAnswerCount(), u.getDisplayName(), u.getId()));\n}\n</code></pre>\n\n<p>To do the same with Questions, simple replace the call to <code>getAnswerCount</code> with a call to <code>getQuestionCount</code>.</p>\n",
          "comments": [
            {
              "comment_id": 3687,
              "creation_date": 1281995591,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1410,
              "post_type": "answer",
              "score": 2,
              "body": "thanks for that. java doesn&#39;t look so scary when you write it. ;-)"
            },
            {
              "comment_id": 3688,
              "creation_date": 1281996023,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1410,
              "post_type": "answer",
              "score": 0,
              "body": "@code, ha thanks.  (I think)"
            },
            {
              "comment_id": 3696,
              "creation_date": 1282014942,
              "owner": {
                "user_id": 2883,
                "user_type": "registered",
                "display_name": "Alexandre Rafalovitch",
                "reputation": 161,
                "email_hash": "eef617ace0ce62813b7443956e02ac39"
              },
              "post_id": 1410,
              "post_type": "answer",
              "score": 0,
              "body": "I think that&#39;s going to drop some of the users when they have duplicate scores. The compare has to fall-back on something more unique than just total numbers, like their Ids."
            },
            {
              "comment_id": 3697,
              "creation_date": 1282015621,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 2883,
                "user_type": "registered",
                "display_name": "Alexandre Rafalovitch",
                "reputation": 161,
                "email_hash": "eef617ace0ce62813b7443956e02ac39"
              },
              "post_id": 1410,
              "post_type": "answer",
              "score": 0,
              "body": "@Alex, the purpose of ht compare it to order the users.  If two users have the same number of answers, they will be considered equal, and the sort will put them in arbitrary order, not drop them."
            }
          ]
        },
        {
          "answer_id": 1417,
          "accepted": false,
          "answer_comments_url": "/answers/1417/comments",
          "question_id": 1408,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282006666,
          "last_activity_date": 1282006666,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": true,
          "title": "How to generate a list of users ranked by activity (question or answer count).",
          "body": "<h2>JavaSript / Soapi.JS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a></p>\n\n<hr>\n\n<p><strong>Questions</strong></p>\n\n<pre><code>Soapi.RouteFactory(\"api.stackapps.com\", apiKey) // get all users\n.Users({ pagesize: 100 }).getPagedResponse(function(data) {\n\n    var output = \"\";\n    data.items.sort(function(a, b) { return b.question_count - a.question_count });\n    for (var i = 0; i &lt; data.items.length; i++) {\n        output += data.items[i].question_count + \" \" + data.items[i].display_name + \"\\r\\n\";\n    }\n\n    document.getElementById(\"output\").innerHTML = output;\n});\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n97 code poet\n56 George Edison\n21 S.Mark\n19 systempuntoout\n14 Felix\n13 Kevin Montrose\n11 Franci Penov\n11 Jedi Master Spooky\n10 Dave Swersky\n10 Steffen Opel\n9 carson\n9 Bill the Lizard\n9 ColinD\n7 Dennis Williamson\n6 Dave DeLong\n6 jjnguy\n5 TheHurt\n5 SztupY\n5 radius\n5 johnwards\n4 Matt S.\n4 Jason\n4 Farseeker\n4 Soviut\n4 Yacoby\n4 Jonathan\n3 Joel Potter\n3 Adam Wright\n3 Edan Maor\n3 codeka\n3 Mark Rushakoff\n3 Shay Erlichmen\n3 swanson\n3 Igor Zevaka\n3 Adam\n3 Nick Presta\n3 eWolf\n3 Koning Baard\n3 Peter Mourfield\n3 phsr\n3 Greg Bray\n3 mlaw\n2 lfoust\n2 Maxim Zaslavsky\n2 Martin Plante\n2 nabeelmukhtar\n2 Catchwa\n2 Thomas McDonald\n2 Kyle Cronin\n2 Ryan Brunner\n2 Robert Munteanu\n2 Josh Kelley\n2 Peter Mortensen\n2 mikej\n2 svick\n2 Shane\n2 Peter Ajtai\n2 Jim McKeeth\n2 chanchal1987\n2 TheKaptain\n1 Chacha102\n1 balpha\n1 Ricky\n1 Martijn Laarman\n1 adrianbanks\n1 AidenMontgomery\n1 voyager\n1 Evan\n1 Tim Post\n1 scunliffe\n1 Lucas Jones\n1 Robert Cartaino\n1 Jeff Atwood\n1 InfinitiesLoop\n1 Heavy Bytes\n1 Nathan Reed\n1 RichH\n1 Jan Fabry\n1 conmulligan\n1 Bialecki\n1 Michael B.\n1 Riduidel\n1 Kevin\n1 James A. Rosen\n1 Soldier.moth\n1 Matthew Pelser\n1 denny\n1 iconiK\n1 Chris S\n1 Nippysaurus\n1 jmoy\n1 Nathan Voxland\n1 Alexandre Rafalovitch\n1 Mark Hurd\n1 Lucas McCoy\n1 Cristian Castiblanco\n1 Casebash\n1 tonklon\n1 coobird\n1 Robert Love\n1 Charles Stewart\n1 C.W.Holeman II\n1 Frank Krueger\n1 Roy Tang\n1 David\n1 ripper234\n1 Simon Brown\n1 Artefacto\n1 JL01\n1 Shimmy\n1 Can Berk Güder\n1 Fernando\n1 crucible\n1 Nicolas Raoul\n1 Vitaly Polonetsky\n1 ADB\n1 Wei Hu\n1 stacker\n1 zengr\n1 Vicky\n1 Portman\n1 Ngu Soon Hui\n1 Dan Atkinson\n1 chalup\n1 Matt Huggins\n1 hvgotcodes\n1 arinte\n1 peter.newhook\n1 blork\n1 fukas78\n1 Joe\n1 John Bristowe\n1 chenyuejie\n1 daltojr\n1 bpedro\n1 Fatal510\n1 magcius\n1 Matt Culbreth\n1 James Johnson\n1 tsudot\n1 pierocampanelli\n1 user1711\n1 Michal\n1 DC01\n1 Mattias Konradsson\n1 Alienfluid\n1 theplic\n1 Dinis Cruz\n1 pufferfish\n1 RichOrr\n1 Bidhan Baruah\n</pre>\n\n<hr>\n\n<p><strong>Answers</strong></p>\n\n<pre><code>Soapi.RouteFactory(\"api.stackapps.com\", apiKey) // get all users\n.Users({ pagesize: 100 }).getPagedResponse(function(data) {\n\n    var output = \"\";\n    data.items.sort(function(a, b) { return b.answer_count - a.answer_count });\n    for (var i = 0; i &lt; data.items.length; i++) {\n        output += data.items[i].answer_count + \" \" + data.items[i].display_name + \"\\r\\n\";\n    }\n\n    document.getElementById(\"output\").innerHTML = output;\n});\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n204 Kevin Montrose\n102 code poet\n69 George Edison\n34 S.Mark\n20 jjnguy\n18 Chacha102\n12 lfoust\n12 systempuntoout\n12 Matt S.\n10 Maxim Zaslavsky\n9 Joel Potter\n8 carson\n8 Franci Penov\n8 Bill the Lizard\n8 Farseeker\n7 Edan Maor\n7 Dennis Williamson\n6 Dave Swersky\n6 Soviut\n6 Steffen Opel\n6 codeka\n6 Igor Zevaka\n6 ColinD\n5 Catchwa\n5 Jeff Atwood\n4 Dave DeLong\n4 TheHurt\n4 Adam Wright\n4 Lucas Jones\n4 Jonathan\n4 Greg Bray\n3 Jason\n3 Joel Spolsky\n3 Geoff Dalgas\n3 SztupY\n3 Robert Cartaino\n3 Yacoby\n3 conmulligan\n3 Riduidel\n3 Chris S\n3 badp\n2 nabeelmukhtar\n2 Tim Post\n2 Felix\n2 Jedi Master Spooky\n2 Shay Erlichmen\n2 swanson\n2 Thomas McDonald\n2 Adam\n2 InfinitiesLoop\n2 Nathan Reed\n2 Chris Lawlor\n2 rockinthesixstring\n2 Simon Brown\n2 Sathya\n2 Darren Newton\n2 Arjan\n2 Prashant\n2 daltojr\n2 Yuval Cohen\n2 moberley\n1 balpha\n1 adrianbanks\n1 John Sheehan\n1 RedFilter\n1 Mef\n1 Evan\n1 Greg Roberts\n1 Nick Craver\n1 radius\n1 Kyle Cronin\n1 Nick Presta\n1 eWolf\n1 Ryan Brunner\n1 Heavy Bytes\n1 ChrisF\n1 Robert Munteanu\n1 Koning Baard\n1 Michael B.\n1 CMS\n1 John Siracusa\n1 rchern\n1 Alexandre Rafalovitch\n1 Lucas McCoy\n1 Cristian Castiblanco\n1 Yuval A\n1 Greg Hurlman\n1 joshperry\n1 lexu\n1 Oscar Reyes\n1 C.W.Holeman II\n1 Brock Woolf\n1 Peter Ajtai\n1 Jared Harley\n1 cyberzed\n1 TWith2Sugars\n1 Nick Bedford\n1 dag729\n1 ooo\n1 msorens\n1 Rox\n1 R. Bemrose\n1 Portman\n1 Ngu Soon Hui\n1 Roger Pate\n1 Randolpho\n1 George Stocker\n1 Daniel Ribeiro\n1 slf\n1 Toby Allen\n1 openfrog\n1 JR Lawhorne\n1 Steven A. Lowe\n1 torbengb\n1 naugtur\n1 blork\n1 TheKaptain\n1 Joe\n1 mlaw\n1 brheal\n1 JonB\n1 Tripp Lilley\n1 Lanny Heidbreder\n1 user2070\n1 jjesse\n1 tutuca\n1 maco\n</pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1408/timeline",
      "question_comments_url": "/questions/1408/comments",
      "question_answers_url": "/questions/1408/answers",
      "question_id": 1408,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281990635,
      "last_edit_date": 1282163670,
      "last_activity_date": 1282163670,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 120,
      "score": 2,
      "community_owned": true,
      "title": "How to generate a list of users ranked by activity (question or answer count).",
      "body": "<p>The use case is to generate a list of users ordered by activity, i.e. <code>question_count</code> or <code>answer_count</code>.</p>\n\n<p>e.g.</p>\n\n<pre>\ntotal_(questions|answers) display_name [user_id]\n------------------------------------------\n1000 John Doe [12]\n900 Joe Snow [431]\n. . . etc etc\n\n</pre>\n\n<p>Post your solution to this use case in the language/library syntax of your choice.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 3,
      "answers": [
        {
          "answer_id": 1407,
          "accepted": false,
          "answer_comments_url": "/answers/1407/comments",
          "question_id": 1406,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281986548,
          "last_edit_date": 1282140023,
          "last_activity_date": 1282140023,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to calculate a list of users ranked by question favorite count totals.",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<pre><code>//\n\nContext\n    .Official\n    .StackApps\n    .Questions\n    .PageCount(0)\n    .PageSize(100)\n    .GroupBy(question =&gt; question.OwnerId)\n    .Select(group =&gt; new\n    {\n        User = group.First().Owner.DisplayName \n          + \"[\" + group.First().Owner.UserId + \"]\",\n        FavedCount = group.Sum(question =&gt; question.FavoriteCount)\n    })\n    .OrderByDescending(item =&gt; item.FavedCount).ToList()\n    .ForEach(item =&gt; \n        Console.WriteLine(\"{0} - {1}\", item.FavedCount, item.User));\n\n//\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n100 - Kevin Montrose[2]\n87 - George Edison[18]\n81 - code poet[14]\n28 - Soviut[825]\n27 - lfoust[11]\n22 - Adam Wright[5]\n22 - systempuntoout[51]\n21 - S.Mark[40]\n20 - Felix[956]\n17 - Farseeker[816]\n16 - Dave DeLong[448]\n11 - Dave Swersky[29]\n10 - Bill the Lizard[9]\n9 - Matt S.[30]\n9 - Franci Penov[13]\n8 - Jeff Atwood[4]\n8 - Edan Maor[1241]\n7 - Jedi Master Spooky[192]\n7 - codeka[1290]\n7 - carson[33]\n7 - nabeelmukhtar[1026]\n7 - Shay Erlichmen[614]\n7 - swanson[839]\n6 - Steffen Opel[377]\n6 - Lucas Jones[570]\n6 - Kyle Cronin[42]\n6 - Joel Potter[8]\n6 - Jason[19]\n6 - Thomas McDonald[1031]\n5 - conmulligan[449]\n5 - Catchwa[700]\n5 - Jonathan[938]\n5 - TheHurt[17]\n5 - Ricky[199]\n5 - SztupY[1265]\n5 - ColinD[222]\n5 - Mark Rushakoff[1048]\n4 - Adam[1395]\n4 - jjnguy[39]\n4 - chenyuejie[2292]\n4 - Koning Baard[451]\n3 - Yacoby[1049]\n3 - phsr[693]\n3 - Nick Presta[186]\n3 - Igor Zevaka[113]\n3 - johnwards[638]\n3 - blork[1849]\n3 - Robert Munteanu[358]\n3 - Riduidel[2192]\n3 - InfinitiesLoop[1394]\n3 - Martin Plante[28]\n2 - tonklon[2734]\n2 - Ryan Brunner[1263]\n2 - Dennis Williamson[171]\n2 - Soldier.moth[91]\n2 - eWolf[664]\n2 - Josh Kelley[2287]\n2 - radius[295]\n2 - James A. Rosen[140]\n2 - Kevin[2296]\n2 - Peter Mortensen[151]\n2 - adrianbanks[127]\n2 - RichH[757]\n2 - Nippysaurus[1221]\n2 - John Bristowe[70]\n2 - Mark Hurd[44]\n1 - Alexandre Rafalovitch[2883]\n1 - balpha[43]\n1 - Matt Culbreth[2829]\n1 - mlaw[2467]\n1 - Nathan Reed[680]\n1 - Nicolas Raoul[2679]\n1 - tsudot[2662]\n1 - Ngu Soon Hui[216]\n1 - Nathan Voxland[2442]\n1 - Joe[2418]\n1 - Michael B.[234]\n1 - Chacha102[23]\n1 - Matthew Pelser[138]\n1 - Shane[1270]\n1 - Frank Krueger[2203]\n1 - Robert Cartaino[431]\n1 - Charles Stewart[2083]\n1 - svick[505]\n1 - jmoy[1978]\n1 - Fernando[1856]\n1 - Peter Mourfield[424]\n1 - pufferfish[1689]\n1 - Artefacto[1179]\n1 - Robert Love[1578]\n1 - iconiK[375]\n1 - voyager[20]\n1 - coobird[525]\n1 - Lucas McCoy[239]\n</pre>\n\n<p>Not related to the question/answer: these are the requests issued to generate the above results:</p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/questions?pagesize=100&key=foo-bar-fu  14,697  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n2   200 HTTP    api.stackapps.com   /1.0/questions?page=2&pagesize=100&key=foo-bar-fu   14,598  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n3   200 HTTP    api.stackapps.com   /1.0/questions?page=3&pagesize=100&key=foo-bar-fu   15,231  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n4   200 HTTP    api.stackapps.com   /1.0/questions?page=4&pagesize=100&key=foo-bar-fu   14,022  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n5   200 HTTP    api.stackapps.com   /1.0/questions?page=5&pagesize=100&key=foo-bar-fu   14,352  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n6   200 HTTP    api.stackapps.com   /1.0/questions?page=6&pagesize=100&key=foo-bar-fu   3,904   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7276            \n\n</pre>\n",
          "comments": [
            {
              "comment_id": 3707,
              "creation_date": 1282132710,
              "owner": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1407,
              "post_type": "answer",
              "score": 0,
              "body": "that&#39;s elegant code."
            },
            {
              "comment_id": 3708,
              "creation_date": 1282139916,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 51,
                "user_type": "registered",
                "display_name": "systempuntoout",
                "reputation": 6905,
                "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
              },
              "post_id": 1407,
              "post_type": "answer",
              "score": 0,
              "body": "@system - thank you. thank you very much.... (tried to find elvis clip but no luck)"
            }
          ]
        },
        {
          "answer_id": 1416,
          "accepted": false,
          "answer_comments_url": "/answers/1416/comments",
          "question_id": 1406,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282005985,
          "last_activity_date": 1282005985,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": true,
          "title": "How to calculate a list of users ranked by question favorite count totals.",
          "body": "<h2>JavaSript / Soapi.JS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a></p>\n\n<hr>\n\n<pre><code>Soapi.RouteFactory(\"api.stackapps.com\", apiKey) // get all users\n.Questions({ pagesize: 100 }).getPagedResponse(function(data) {\n\n    var values = {}, keys = [];\n    // add up the favorite for each user\n    for (var i = 0; i &lt; data.items.length; i++) {\n        var q = data.items[i];\n        var u = q.owner;\n        if (u) {\n            if (!values[u.user_id]) {\n                keys.push(u.user_id);\n                values[u.user_id] = {\n                    display_name: u.display_name,\n                    favorite_count: 0\n                };\n            }\n            values[u.user_id].favorite_count += q.favorite_count;\n        }\n    }\n\n    // sort and dump\n    var output = \"\";\n    for (var i = 0; i &lt; keys.sort(function(a, b) {\n        return values[b].favorite_count - values[a].favorite_count;\n    }).length; i++) {\n        output += values[keys[i]].favorite_count + \" \" + values[keys[i]].display_name + \"\\r\\n\";\n    }\n\n    document.getElementById(\"output\").innerHTML = output;\n\n});\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n100 Kevin Montrose\n88 George Edison\n81 code poet\n28 Soviut\n27 lfoust\n22 Adam Wright\n22 systempuntoout\n21 S.Mark\n20 Felix\n17 Farseeker\n16 Dave DeLong\n11 Dave Swersky\n10 Bill the Lizard\n9 Matt S.\n9 Franci Penov\n8 Jeff Atwood\n8 Edan Maor\n7 Jedi Master Spooky\n7 codeka\n7 carson\n7 nabeelmukhtar\n7 Shay Erlichmen\n7 swanson\n6 Steffen Opel\n6 Lucas Jones\n6 Jason\n6 Thomas McDonald\n6 Kyle Cronin\n6 Joel Potter\n5 conmulligan\n5 Catchwa\n5 Jonathan\n5 TheHurt\n5 Ricky\n5 SztupY\n5 ColinD\n5 Mark Rushakoff\n4 Adam\n4 jjnguy\n4 chenyuejie\n4 Koning Baard\n3 Yacoby\n3 phsr\n3 Nick Presta\n3 Igor Zevaka\n3 johnwards\n3 blork\n3 Robert Munteanu\n3 Riduidel\n3 InfinitiesLoop\n3 Martin Plante\n2 tonklon\n2 Ryan Brunner\n2 Dennis Williamson\n2 Soldier.moth\n2 eWolf\n2 Josh Kelley\n2 radius\n2 James A. Rosen\n2 Kevin\n2 RichH\n2 Nippysaurus\n2 Peter Mortensen\n2 John Bristowe\n2 Mark Hurd\n2 adrianbanks\n1 Alexandre Rafalovitch\n1 balpha\n1 Matt Culbreth\n1 mlaw\n1 Nathan Reed\n1 Nicolas Raoul\n1 tsudot\n1 Ngu Soon Hui\n1 Nathan Voxland\n1 Joe\n1 Michael B.\n1 Shane\n1 Frank Krueger\n1 Robert Cartaino\n1 Charles Stewart\n1 svick\n1 jmoy\n1 Fernando\n1 Peter Mourfield\n1 pufferfish\n1 Artefacto\n1 Robert Love\n1 iconiK\n1 voyager\n1 coobird\n1 Lucas McCoy\n1 Chacha102\n1 Matthew Pelser\n</pre>\n\n<p><strong>Requests generated</strong></p>\n\n<pre>\n\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=1&jsonp=Soapi._internal._callback0  14,525  private     application/json; charset=utf-8 iexplore:5676           \n2   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=2&jsonp=Soapi._internal._callback1  14,704  private     application/json; charset=utf-8 iexplore:5676           \n3   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=3&jsonp=Soapi._internal._callback2  15,407  private     application/json; charset=utf-8 iexplore:5676           \n4   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=4&jsonp=Soapi._internal._callback3  14,012  private     application/json; charset=utf-8 iexplore:5676           \n5   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=5&jsonp=Soapi._internal._callback4  14,457  private     application/json; charset=utf-8 iexplore:5676           \n6   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=6&jsonp=Soapi._internal._callback5  4,234   private     application/json; charset=utf-8 iexplore:5676           \n7   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=7&jsonp=Soapi._internal._callback6  204 private     application/json; charset=utf-8 iexplore:5676           \n\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1421,
          "accepted": false,
          "answer_comments_url": "/answers/1421/comments",
          "question_id": 1406,
          "owner": {
            "user_id": 448,
            "user_type": "registered",
            "display_name": "Dave DeLong",
            "reputation": 5074,
            "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
          },
          "creation_date": 1282078611,
          "last_edit_date": 1282141120,
          "last_activity_date": 1282141120,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": true,
          "title": "How to calculate a list of users ranked by question favorite count totals.",
          "body": "<h1>StackKit (Objective-C)</h1>\n\n<p>Objective-C can be a pretty verbose language, especially with how I've chosen to implement the API.  That being said, here's how StackKit does this:</p>\n\n<pre><code>SKSite * site = [SKSite stackAppsSite];\n\n//begin building our request for all questions  \nSKFetchRequest * request = [[SKFetchRequest alloc] init];\n[request setEntity:[SKQuestion class]];\n\n//this will hold how the favorited counts for a user\nNSCountedSet * counts = [NSCountedSet set];\n\nNSUInteger count = NSUIntegerMax;\n//retrieve all the questions\nfor (NSUInteger offset = 0; offset &lt; count; offset += 100) {\n    //starting from the appropriate offset (page)\n    [request setFetchOffset:offset];\n\n    NSError * error = nil;\n    NSArray * matches = [site executeSynchronousFetchRequest:request error:&amp;error];\n\n    //loop through all the questions and record how many times they've been favorited\n    for (SKQuestion * question in matches) {\n        NSUInteger count = [[question favoriteCount] unsignedIntegerValue];\n        for (int i = 0; i &lt; count; ++i) { [counts addObject:[question ownerID]]; }\n    }\n\n    if (count == NSUIntegerMax) {\n        count = [[request fetchTotal] unsignedIntegerValue];\n    }\n}\n[request release];\n\n//turn the counted set into a dictionary (so we can sort it)\nNSMutableArray * favoriteCounts = [NSMutableArray array];\nfor (id user in counts) {\n    [favoriteCounts addObject:[NSDictionary dictionaryWithObjectsAndKeys:\n                               user, @\"user\",\n                               [NSNumber numberWithUnsignedInteger:[counts countForObject:user]], @\"count\",\n                               nil]];\n}\n//sort the dictionary by the count, descending\n[favoriteCounts sortUsingDescriptors:[NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@\"count\" ascending:NO] autorelease]]];\n\n//create a request to fetch all the user objects\nrequest = [[SKFetchRequest alloc] init];\n[request setEntity:[SKUser class]];\n[request setPredicate:[NSPredicate predicateWithFormat:@\"%K = %@\", SKUserID, [favoriteCounts valueForKey:@\"user\"]]];\n\nNSArray * users = [site executeSynchronousFetchRequest:request error:nil];\n[request release];\n\n//build a userID =&gt; user map\nNSDictionary * userMapping = [NSDictionary dictionaryWithObjects:users forKeys:[users valueForKey:SKUserID]];\n\n//print out the favorited count and username\nfor (NSDictionary * top in favoriteCounts) {\n    SKUser * user = [userMapping objectForKey:[top objectForKey:@\"user\"]];\n    NSLog(@\"%2d - %@ [%@]\", [[top objectForKey:@\"count\"] unsignedIntegerValue], [user displayName], [user userID]);\n}\n</code></pre>\n\n<p>Outputs:</p>\n\n<pre><code>101 - Kevin Montrose [2]\n88 - George Edison [18]\n86 - code poet [14]\n29 - Soviut [825]\n28 - lfoust [11]\n22 - Adam Wright [5]\n22 - systempuntoout [51]\n21 - S.Mark [40]\n20 - Felix [956]\n17 - Farseeker [816]\n16 - Dave DeLong [448]\n11 - Dave Swersky [29]\n10 - Bill the Lizard [9]\n 9 - Franci Penov [13]\n 9 - Matt S. [30]\n 8 - Jeff Atwood [4]\n 8 - Edan Maor [1241]\n 7 - carson [33]\n 7 - swanson [839]\n 7 - Jedi Master Spooky [192]\n 7 - nabeelmukhtar [1026]\n 7 - Shay Erlichmen [614]\n 7 - codeka [1290]\n 6 - Kyle Cronin [42]\n 6 - Jason [19]\n 6 - Joel Potter [8]\n 6 - Catchwa [700]\n 6 - Thomas McDonald [1031]\n 6 - Lucas Jones [570]\n 6 - Steffen Opel [377]\n 5 - SztupY [1265]\n 5 - TheHurt [17]\n 5 - ColinD [222]\n 5 - Ricky [199]\n 5 - Jonathan [938]\n 5 - conmulligan [449]\n 5 - Mark Rushakoff [1048]\n 4 - chenyuejie [2292]\n 4 - Koning Baard [451]\n 4 - jjnguy [39]\n 4 - Adam [1395]\n 3 - Martin Plante [28]\n 3 - Riduidel [2192]\n 3 - Yacoby [1049]\n 3 - InfinitiesLoop [1394]\n 3 - Igor Zevaka [113]\n 3 - phsr [693]\n 3 - Robert Munteanu [358]\n 3 - blork [1849]\n 3 - Nick Presta [186]\n 3 - johnwards [638]\n 2 - John Bristowe [70]\n 2 - eWolf [664]\n 2 - Soldier.moth [91]\n 2 - James A. Rosen [140]\n 2 - Nippysaurus [1221]\n 2 - Ryan Brunner [1263]\n 2 - Dennis Williamson [171]\n 2 - adrianbanks [127]\n 2 - radius [295]\n 2 - Kevin [2296]\n 2 - tonklon [2734]\n 2 - Peter Mortensen [151]\n 2 - Josh Kelley [2287]\n 2 - Mark Hurd [44]\n 2 - RichH [757]\n 1 - iconiK [375]\n 1 - Peter Mourfield [424]\n 1 - Robert Cartaino [431]\n 1 - Joe [2418]\n 1 - pufferfish [1689]\n 1 - mlaw [2467]\n 1 - Nicolas Raoul [2679]\n 1 - Artefacto [1179]\n 1 - jmoy [1978]\n 1 - Shane [1270]\n 1 - Matthew Pelser [138]\n 1 - Charles Stewart [2083]\n 1 - coobird [525]\n 1 - Nathan Voxland [2442]\n 1 - Michael B. [234]\n 1 - Robert Love [1578]\n 1 - balpha [43]\n 1 - Matt Culbreth [2829]\n 1 - voyager [20]\n 1 - Lucas McCoy [239]\n 1 - Alexandre Rafalovitch [2883]\n 1 - Ngu Soon Hui [216]\n 1 - Frank Krueger [2203]\n 1 - svick [505]\n 1 - Fernando [1856]\n 1 - tsudot [2662]\n 1 - Chacha102 [23]\n 1 - Nathan Reed [680]\n</code></pre>\n\n<p>Calls made:</p>\n\n<pre><code>http://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=1\nhttp://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=2\nhttp://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=3\nhttp://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=4\nhttp://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=5\nhttp://api.stackapps.com/1.0/questions?body=true&amp;key=&lt;key&gt;&amp;pagesize=100&amp;page=6\nhttp://api.stackapps.com/1.0/users/2;18;14;825;11;5;51;40;956;816;448;29;9;13;30;4;1241;33;839;192;1026;614;1290;42;19;8;700;1031;570;377;1265;17;222;199;938;449;1048;2292;451;39;1395;28;2192;1049;1394;113;693;358;1849;186;638;70;664;91;140;1221;1263;171;127;295;2296;2734;151;2287;44;757;375;424;431;2418;1689;2467;2679;1179;1978;1270;138;2083;525;2442;234;1578;43;2829;20;239;2883;216;2203;505;1856;2662;23;680?key=&lt;key&gt;&amp;page=1&amp;pagesize=100\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 3705,
              "creation_date": 1282097566,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1421,
              "post_type": "answer",
              "score": 0,
              "body": "thanks dave. it is <i>very</i> interesting to see implementations of familiar code in other lanquages/libraries, kinda like a rosetta stone of sorts."
            },
            {
              "comment_id": 3709,
              "creation_date": 1282141227,
              "owner": {
                "user_id": 448,
                "user_type": "registered",
                "display_name": "Dave DeLong",
                "reputation": 5074,
                "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1421,
              "post_type": "answer",
              "score": 0,
              "body": "@code poet yeah, definitely. one of the design decisions i made w/ my wrapper is that a request only returns data of a single type. so even though requesting a question returns user information, i only return the question info itself.  that means that i have to do the extra request at the end for all the user info, but also means i don&#39;t have partially created User objects floating around."
            },
            {
              "comment_id": 3710,
              "creation_date": 1282143664,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 448,
                "user_type": "registered",
                "display_name": "Dave DeLong",
                "reputation": 5074,
                "email_hash": "0bf4d0bd5a77c2e0620c40ba34cc5c2e"
              },
              "post_id": 1421,
              "post_type": "answer",
              "score": 0,
              "body": "sound decision. I took another approach: all api objects are &#39;stubs&#39; by default. If the query in question returns full objects, i clear the <code>IsStub</code> flag, recursively. Subsequently, upon first access, if a stub and lazy loading is enabled on the context, the object is fetched. In some cases this can add up to a lot of requests, so the context has an eager loading option, wherein when a page of objects are retrieved, all of the stubs are fetched in a single batch, so a request for a page of 100 questions (w body/answers/comments) would result in 2 requests and return all the data."
            }
          ]
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1406/timeline",
      "question_comments_url": "/questions/1406/comments",
      "question_answers_url": "/questions/1406/answers",
      "question_id": 1406,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281986413,
      "last_edit_date": 1282163614,
      "last_activity_date": 1282163614,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 198,
      "score": 2,
      "community_owned": true,
      "title": "How to calculate a list of users ranked by question favorite count totals.",
      "body": "<p>The API provides methods to sort and filter individual questions by favorite count.</p>\n\n<p>In order to calculate the question favorite count totals <em>per User</em>, some grouping and set operations are required.</p>\n\n<p>e.g.</p>\n\n<pre>\ntotal_views display_name [user_id]\n------------------------------------------\n1000 John Doe [12]\n900 Joe Snow [431]\n. . . etc etc\n\n</pre>\n\n<p>Post your solution to this use case in the language/library syntax of your choice.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 1405,
          "accepted": false,
          "answer_comments_url": "/answers/1405/comments",
          "question_id": 1404,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281984033,
          "last_edit_date": 1281984355,
          "last_activity_date": 1281984355,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to calculate a list of users ranked by question score (votes sum) totals.",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<pre><code>Context\n    .Official\n    .StackApps\n    .Questions\n    .PageCount(0) // all pages, be careful with this\n    .PageSize(100)\n    .GroupBy(question =&gt; question.OwnerId)\n    .Select(group =&gt; new\n    {\n        User = group.First().Owner.DisplayName + \"[\" + group.First().Owner.UserId + \"]\",\n        Score = group.Sum(question =&gt; question.Score)\n    }).OrderByDescending(item =&gt; item.Score)\n    .ToList().ForEach(item =&gt; Console.WriteLine(\"{0} - {1}\", item.Score, item.User));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n265 - George Edison[18]\n262 - code poet[14]\n187 - Kevin Montrose[2]\n88 - systempuntoout[51]\n76 - Soviut[825]\n71 - S.Mark[40]\n70 - Felix[956]\n70 - Farseeker[816]\n65 - lfoust[11]\n50 - Adam Wright[5]\n41 - Dave Swersky[29]\n38 - Steffen Opel[377]\n38 - carson[33]\n38 - Edan Maor[1241]\n36 - Franci Penov[13]\n32 - Lucas Jones[570]\n31 - Bill the Lizard[9]\n29 - Dave DeLong[448]\n28 - Thomas McDonald[1031]\n28 - Mark Rushakoff[1048]\n25 - Jedi Master Spooky[192]\n25 - Shay Erlichmen[614]\n24 - johnwards[638]\n24 - swanson[839]\n23 - TheHurt[17]\n22 - codeka[1290]\n22 - Catchwa[700]\n21 - Dennis Williamson[171]\n20 - radius[295]\n20 - SztupY[1265]\n17 - jjnguy[39]\n17 - Matt S.[30]\n17 - Kyle Cronin[42]\n17 - ColinD[222]\n16 - Yacoby[1049]\n16 - Jeff Atwood[4]\n16 - Ricky[199]\n16 - Jason[19]\n15 - Nick Presta[186]\n15 - Adam[1395]\n15 - eWolf[664]\n14 - Joel Potter[8]\n13 - Ryan Brunner[1263]\n12 - RichH[757]\n11 - Igor Zevaka[113]\n11 - InfinitiesLoop[1394]\n11 - adrianbanks[127]\n11 - Koning Baard[451]\n10 - nabeelmukhtar[1026]\n10 - Martin Plante[28]\n9 - phsr[693]\n8 - Nathan Reed[680]\n8 - Robert Munteanu[358]\n8 - Peter Mourfield[424]\n8 - Jan Fabry[1303]\n7 - conmulligan[449]\n7 - Josh Kelley[2287]\n6 - balpha[43]\n6 - blork[1849]\n6 - Jonathan[938]\n6 - Michael B.[234]\n6 - Kevin[2296]\n6 - Peter Mortensen[151]\n6 - Martijn Laarman[56]\n5 - Soldier.moth[91]\n5 - TheKaptain[1232]\n5 - fukas78[667]\n5 - chenyuejie[2292]\n5 - mlaw[2467]\n5 - James A. Rosen[140]\n5 - Tim Post[52]\n5 - Riduidel[2192]\n5 - Joe[2418]\n5 - Chacha102[23]\n5 - mikej[339]\n4 - AidenMontgomery[2894]\n4 - Nathan Voxland[2442]\n4 - Matthew Pelser[138]\n4 - Nippysaurus[1221]\n4 - bpedro[2222]\n4 - Robert Cartaino[431]\n4 - jmoy[1978]\n4 - iconiK[375]\n4 - denny[553]\n4 - John Bristowe[70]\n4 - Mark Hurd[44]\n3 - tonklon[2734]\n3 - Matt Culbreth[2829]\n3 - magcius[1304]\n3 - James Johnson[2517]\n3 - Maxim Zaslavsky[32]\n3 - daltojr[1009]\n3 - Bialecki[756]\n3 - svick[505]\n3 - Casebash[169]\n3 - Fatal510[866]\n3 - Dan Atkinson[587]\n3 - Lucas McCoy[239]\n2 - Alexandre Rafalovitch[2883]\n2 - tsudot[2662]\n2 - Roy Tang[2300]\n2 - Greg Bray[150]\n2 - Robert Love[1578]\n2 - Shane[1270]\n2 - Frank Krueger[2203]\n2 - David[2118]\n2 - pierocampanelli[1384]\n2 - Charles Stewart[2083]\n2 - voyager[20]\n2 - coobird[525]\n1 - crucible[1986]\n1 - Peter Ajtai[2618]\n1 - Nicolas Raoul[2679]\n1 - DC01[2603]\n1 - Evan[26]\n1 - Can Berk Güder[636]\n1 - user1711[1711]\n1 - Artefacto[1179]\n1 - Shimmy[2134]\n1 - Michal[1918]\n1 - Fernando[1856]\n1 - JL01[1911]\n1 - Mattias Konradsson[564]\n0 - chanchal1987[2951]\n0 - zengr[1416]\n0 - RichOrr[1749]\n0 - Bidhan Baruah[2735]\n0 - arinte[2616]\n0 - Ngu Soon Hui[216]\n0 - hvgotcodes[2532]\n0 - Dinis Cruz[1676]\n0 - scunliffe[37]\n0 - pufferfish[1689]\n0 - chalup[892]\n0 - Cristian Castiblanco[109]\n0 - stacker[1339]\n0 - Vitaly Polonetsky[1771]\n0 - Vicky[2139]\n0 - theplic[2125]\n0 - Simon Brown[1177]\n0 - C.W.Holeman II[1942]\n0 - Heavy Bytes[939]\n0 - Jim McKeeth[267]\n0 - Wei Hu[1230]\n0 - Chris S[1174]\n0 - ADB[705]\n0 - Matt Huggins[1097]\n0 - Alienfluid[1044]\n0 - Portman[168]\n-1 - peter.newhook[1924]\n-2 - ripper234[298]\n\n</pre>\n\n<p>Not related to the question/answer: these are the requests issued to generate the above results:</p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/questions?pagesize=100&key=foo-bar-fu  15,046  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n2   200 HTTP    api.stackapps.com   /1.0/questions?page=2&pagesize=100&key=foo-bar-fu   14,622  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n3   200 HTTP    api.stackapps.com   /1.0/questions?page=3&pagesize=100&key=foo-bar-fu   15,153  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n4   200 HTTP    api.stackapps.com   /1.0/questions?page=4&pagesize=100&key=foo-bar-fu   14,174  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n5   200 HTTP    api.stackapps.com   /1.0/questions?page=5&pagesize=100&key=foo-bar-fu   14,339  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n6   200 HTTP    api.stackapps.com   /1.0/questions?page=6&pagesize=100&key=foo-bar-fu   3,460   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:8544            \n\n\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1415,
          "accepted": false,
          "answer_comments_url": "/answers/1415/comments",
          "question_id": 1404,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282005726,
          "last_activity_date": 1282005726,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": true,
          "title": "How to calculate a list of users ranked by question score (votes sum) totals.",
          "body": "<h2>JavaSript / Soapi.JS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a></p>\n\n<hr>\n\n<pre><code>   Soapi.RouteFactory(\"api.stackapps.com\", apiKey) // get all users\n    .Questions({ pagesize: 100 }).getPagedResponse(function(data) {\n\n        var values = {}, keys = [];\n        // add up the score for each user\n        for (var i = 0; i &lt; data.items.length; i++) {\n            var q = data.items[i];\n            var u = q.owner;\n            if (u) {\n                if (!values[u.user_id]) {\n                    keys.push(u.user_id);\n                    values[u.user_id] = {\n                        display_name: u.display_name,\n                        score: 0\n                    };\n                }\n                values[u.user_id].score += q.score;\n            }\n        }\n\n        // sort and dump\n        var output = \"\";\n        for (var i = 0; i &lt; keys.sort(function(a, b) {\n            return values[b].score - values[a].score;\n        }).length; i++) {\n            output += values[keys[i]].score + \" \" + values[keys[i]].display_name + \"\\r\\n\";\n        }\n\n        document.getElementById(\"output\").innerHTML = output;\n\n});\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n266 George Edison\n265 code poet\n187 Kevin Montrose\n88 systempuntoout\n77 Soviut\n71 S.Mark\n70 Felix\n70 Farseeker\n65 lfoust\n50 Adam Wright\n42 Dave Swersky\n38 Steffen Opel\n38 carson\n38 Edan Maor\n36 Franci Penov\n32 Lucas Jones\n31 Bill the Lizard\n29 Dave DeLong\n28 Thomas McDonald\n28 Mark Rushakoff\n25 Jedi Master Spooky\n25 Shay Erlichmen\n24 johnwards\n24 swanson\n23 TheHurt\n22 codeka\n22 Catchwa\n21 Dennis Williamson\n20 radius\n20 SztupY\n17 jjnguy\n17 Matt S.\n17 ColinD\n17 Kyle Cronin\n16 Yacoby\n16 Jeff Atwood\n16 Ricky\n16 Jason\n15 Nick Presta\n15 Adam\n15 eWolf\n14 Joel Potter\n13 Ryan Brunner\n12 RichH\n11 Igor Zevaka\n11 InfinitiesLoop\n11 Koning Baard\n11 adrianbanks\n10 nabeelmukhtar\n10 Martin Plante\n9 phsr\n8 Nathan Reed\n8 Robert Munteanu\n8 Peter Mourfield\n8 Jan Fabry\n7 conmulligan\n7 Josh Kelley\n6 balpha\n6 blork\n6 Jonathan\n6 Michael B.\n6 Kevin\n6 Peter Mortensen\n6 Martijn Laarman\n5 Soldier.moth\n5 TheKaptain\n5 fukas78\n5 chenyuejie\n5 mlaw\n5 James A. Rosen\n5 Tim Post\n5 Riduidel\n5 Joe\n5 mikej\n5 Chacha102\n4 AidenMontgomery\n4 Nathan Voxland\n4 bpedro\n4 Robert Cartaino\n4 jmoy\n4 Nippysaurus\n4 iconiK\n4 denny\n4 John Bristowe\n4 Mark Hurd\n4 Matthew Pelser\n3 James Johnson\n3 tonklon\n3 Matt Culbreth\n3 magcius\n3 Bialecki\n3 svick\n3 Casebash\n3 Maxim Zaslavsky\n3 daltojr\n3 Fatal510\n3 Dan Atkinson\n3 Lucas McCoy\n2 Alexandre Rafalovitch\n2 tsudot\n2 Roy Tang\n2 Shane\n2 Frank Krueger\n2 David\n2 pierocampanelli\n2 Charles Stewart\n2 Robert Love\n2 Greg Bray\n2 voyager\n2 coobird\n1 crucible\n1 Peter Ajtai\n1 Nicolas Raoul\n1 DC01\n1 Evan\n1 Can Berk Güder\n1 Shimmy\n1 Michal\n1 Fernando\n1 JL01\n1 user1711\n1 Artefacto\n1 Mattias Konradsson\n0 chanchal1987\n0 zengr\n0 RichOrr\n0 Bidhan Baruah\n0 arinte\n0 Ngu Soon Hui\n0 hvgotcodes\n0 Dinis Cruz\n0 Vitaly Polonetsky\n0 Vicky\n0 theplic\n0 Simon Brown\n0 C.W.Holeman II\n0 pufferfish\n0 chalup\n0 Cristian Castiblanco\n0 stacker\n0 Heavy Bytes\n0 Jim McKeeth\n0 Wei Hu\n0 Chris S\n0 ADB\n0 Matt Huggins\n0 Alienfluid\n0 Portman\n0 scunliffe\n-1 peter.newhook\n-2 ripper234\n\n</pre>\n\n<p><strong>Requests generated</strong> (elapsed time 3 seconds)</p>\n\n<pre>\n\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=1&jsonp=Soapi._internal._callback0  14,486  private     application/json; charset=utf-8 iexplore:3360           \n2   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=2&jsonp=Soapi._internal._callback1  14,704  private     application/json; charset=utf-8 iexplore:3360           \n3   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=3&jsonp=Soapi._internal._callback2  15,407  private     application/json; charset=utf-8 iexplore:3360           \n4   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=4&jsonp=Soapi._internal._callback3  14,012  private     application/json; charset=utf-8 iexplore:3360           \n5   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=5&jsonp=Soapi._internal._callback4  14,457  private     application/json; charset=utf-8 iexplore:3360           \n6   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=6&jsonp=Soapi._internal._callback5  4,234   private     application/json; charset=utf-8 iexplore:3360           \n7   200 HTTP    api.stackapps.com   /1.0/questions?key=foo-bar-fu&pagesize=100&page=7&jsonp=Soapi._internal._callback6  204 private     application/json; charset=utf-8 iexplore:3360           \n\n\n</pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1404/timeline",
      "question_comments_url": "/questions/1404/comments",
      "question_answers_url": "/questions/1404/answers",
      "question_id": 1404,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281983964,
      "last_edit_date": 1282163558,
      "last_activity_date": 1282163558,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 147,
      "score": 2,
      "community_owned": true,
      "title": "How to calculate a list of users ranked by question score (votes sum) totals.",
      "body": "<p>The API provides methods to sort and filter individual questions by score.</p>\n\n<p>In order to calculate the question score (votes sum) totals <em>per User</em>, some grouping and set operations are required.</p>\n\n<p>e.g.</p>\n\n<pre>\ntotal_score display_name [user_id]\n------------------------------------------\n1000 John Doe [12]\n900 Joe Snow [431]\n. . . etc etc\n\n</pre>\n\n<p>Post your solution to this use case in the language/library syntax of your choice.</p>\n",
      "comments": [
        {
          "comment_id": 3685,
          "creation_date": 1281993261,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1404,
          "post_type": "question",
          "score": 0,
          "body": "Here you want the user with the most votes for questions they have posted?"
        },
        {
          "comment_id": 3686,
          "creation_date": 1281995511,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1404,
          "post_type": "question",
          "score": 0,
          "body": "@jjn - this use case involves the sum <code>score</code>. The logical difference is that votes on CW questions do not count towards score. The functional difference is nil as both fields are present on the question object."
        }
      ]
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 1403,
          "accepted": false,
          "answer_comments_url": "/answers/1403/comments",
          "question_id": 1402,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281983637,
          "last_edit_date": 1281984319,
          "last_activity_date": 1281984319,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to calculate a list of users ranked by question view count totals.",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<pre><code>Context\n    .Official\n    .StackApps\n    .Questions\n    .PageCount(0) // all pages. be careful with this\n    .PageSize(100)\n    .GroupBy(question =&gt; question.OwnerId)\n    .Select(group =&gt; new\n    {\n        User = group.First().Owner.DisplayName + \"[\" + group.First().Owner.UserId + \"]\",\n        Views = group.Sum(question =&gt; question.ViewCount)\n    }).OrderByDescending(item =&gt; item.Views)\n    .ToList().ForEach(item =&gt; Console.WriteLine(\"{0} - {1}\", item.Views, item.User));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n17339 - Kevin Montrose[2]\n10642 - George Edison[18]\n8711 - code poet[14]\n3402 - systempuntoout[51]\n3015 - Farseeker[816]\n2894 - lfoust[11]\n2253 - Franci Penov[13]\n1798 - Felix[956]\n1772 - Soviut[825]\n1655 - S.Mark[40]\n1595 - Adam Wright[5]\n1400 - Jedi Master Spooky[192]\n1383 - Jeff Atwood[4]\n1293 - Matt S.[30]\n1158 - Edan Maor[1241]\n1079 - Steffen Opel[377]\n1033 - carson[33]\n1024 - Bill the Lizard[9]\n977 - Dave DeLong[448]\n977 - Mark Rushakoff[1048]\n949 - Shay Erlichmen[614]\n947 - Nick Presta[186]\n940 - Thomas McDonald[1031]\n916 - Dave Swersky[29]\n813 - Jonathan[938]\n812 - eWolf[664]\n806 - swanson[839]\n780 - Adam[1395]\n765 - Lucas Jones[570]\n726 - TheHurt[17]\n705 - johnwards[638]\n690 - Catchwa[700]\n669 - Kyle Cronin[42]\n664 - Jason[19]\n637 - phsr[693]\n623 - codeka[1290]\n602 - InfinitiesLoop[1394]\n588 - nabeelmukhtar[1026]\n566 - Yacoby[1049]\n499 - conmulligan[449]\n437 - Ricky[199]\n432 - Dennis Williamson[171]\n425 - radius[295]\n420 - SztupY[1265]\n360 - Soldier.moth[91]\n359 - ColinD[222]\n353 - Igor Zevaka[113]\n336 - Koning Baard[451]\n320 - Ryan Brunner[1263]\n311 - jjnguy[39]\n298 - Greg Bray[150]\n297 - fukas78[667]\n287 - Nathan Reed[680]\n287 - Michael B.[234]\n283 - iconiK[375]\n258 - Peter Mourfield[424]\n247 - RichH[757]\n244 - blork[1849]\n238 - Casebash[169]\n237 - Joel Potter[8]\n221 - ripper234[298]\n214 - TheKaptain[1232]\n207 - mlaw[2467]\n207 - Lucas McCoy[239]\n205 - Nippysaurus[1221]\n203 - James A. Rosen[140]\n190 - Vitaly Polonetsky[1771]\n188 - bpedro[2222]\n180 - Shane[1270]\n168 - Robert Munteanu[358]\n158 - svick[505]\n138 - Martin Plante[28]\n133 - mikej[339]\n132 - chenyuejie[2292]\n124 - adrianbanks[127]\n122 - Peter Mortensen[151]\n120 - Tim Post[52]\n119 - daltojr[1009]\n117 - magcius[1304]\n114 - Josh Kelley[2287]\n113 - Riduidel[2192]\n110 - Martijn Laarman[56]\n108 - pufferfish[1689]\n104 - balpha[43]\n104 - John Bristowe[70]\n103 - Peter Ajtai[2618]\n103 - Mark Hurd[44]\n102 - jmoy[1978]\n97 - JL01[1911]\n95 - Maxim Zaslavsky[32]\n93 - Joe[2418]\n90 - Kevin[2296]\n86 - Jan Fabry[1303]\n86 - denny[553]\n86 - Robert Cartaino[431]\n85 - Roy Tang[2300]\n85 - Chacha102[23]\n81 - pierocampanelli[1384]\n80 - James Johnson[2517]\n79 - Evan[26]\n79 - Fatal510[866]\n76 - tsudot[2662]\n74 - arinte[2616]\n71 - Charles Stewart[2083]\n70 - Frank Krueger[2203]\n69 - Jim McKeeth[267]\n67 - Chris S[1174]\n67 - voyager[20]\n65 - Dinis Cruz[1676]\n64 - Mattias Konradsson[564]\n63 - crucible[1986]\n63 - ADB[705]\n62 - Dan Atkinson[587]\n59 - theplic[2125]\n58 - Matthew Pelser[138]\n56 - Alexandre Rafalovitch[2883]\n56 - Artefacto[1179]\n56 - Robert Love[1578]\n55 - Nathan Voxland[2442]\n52 - AidenMontgomery[2894]\n52 - Bidhan Baruah[2735]\n51 - Can Berk Güder[636]\n48 - chanchal1987[2951]\n48 - Cristian Castiblanco[109]\n48 - scunliffe[37]\n47 - Fernando[1856]\n46 - DC01[2603]\n45 - Matt Culbreth[2829]\n43 - user1711[1711]\n42 - Simon Brown[1177]\n41 - Nicolas Raoul[2679]\n40 - C.W.Holeman II[1942]\n37 - zengr[1416]\n36 - coobird[525]\n36 - Bialecki[756]\n36 - peter.newhook[1924]\n34 - Vicky[2139]\n32 - RichOrr[1749]\n30 - hvgotcodes[2532]\n28 - Portman[168]\n27 - Heavy Bytes[939]\n25 - stacker[1339]\n23 - chalup[892]\n21 - David[2118]\n21 - Shimmy[2134]\n20 - Ngu Soon Hui[216]\n20 - Wei Hu[1230]\n17 - Michal[1918]\n14 - tonklon[2734]\n11 - Alienfluid[1044]\n4 - Matt Huggins[1097]\n\n</pre>\n\n<p>Not related to the question, but these are the requests issued to generate the above results:</p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n58  200 HTTP    api.stackapps.com   /1.0/questions?pagesize=100&key=foo-bar-fu  14,939  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n59  200 HTTP    api.stackapps.com   /1.0/questions?page=2&pagesize=100&key=foo-bar-fu   14,636  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n60  200 HTTP    api.stackapps.com   /1.0/questions?page=3&pagesize=100&key=foo-bar-fu   15,181  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n61  200 HTTP    api.stackapps.com   /1.0/questions?page=4&pagesize=100&key=foo-bar-fu   14,160  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n62  200 HTTP    api.stackapps.com   /1.0/questions?page=5&pagesize=100&key=foo-bar-fu   14,352  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n63  200 HTTP    api.stackapps.com   /1.0/questions?page=6&pagesize=100&key=foo-bar-fu   3,580   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:7448            \n\n</pre>\n",
          "comments": []
        },
        {
          "answer_id": 1414,
          "accepted": false,
          "answer_comments_url": "/answers/1414/comments",
          "question_id": 1402,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282005370,
          "last_activity_date": 1282005370,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": true,
          "title": "How to calculate a list of users ranked by question view count totals.",
          "body": "<h2>JavaSript / Soapi.JS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/494/soapi-js-v1-0-fluent-javascript-wrapper-for-the-stackoverflow-api\">Soapi.JS</a></p>\n\n<hr>\n\n<pre><code>Soapi.RouteFactory(\"api.stackapps.com\", apiKey) // get all users\n.Questions({ pagesize: 100 }).getPagedResponse(function(data) {\n\n    var values = {}, keys = [];\n    // add up the view count for each user\n    for (var i = 0; i &lt; data.items.length; i++) {\n        var q = data.items[i];\n        var u = q.owner;\n        if (u) {\n            if (!values[u.user_id]) {\n                keys.push(u.user_id);\n                values[u.user_id] = {\n                    display_name: u.display_name,\n                    view_count: 0\n                };\n            }\n            values[u.user_id].view_count += q.view_count;\n        }\n    }\n\n    // sort and dump\n    var output = \"\";\n    for (var i = 0; i &lt; keys.sort(function(a, b) {\n        return values[b].view_count - values[a].view_count;\n    }).length; i++) {\n        output += values[keys[i]].view_count + \" \" + values[keys[i]].display_name + \"\\r\\n\";\n    }\n\n    document.getElementById(\"output\").innerHTML = output;\n\n});\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n17354 Kevin Montrose\n10669 George Edison\n8855 code poet\n3417 systempuntoout\n3020 Farseeker\n2900 lfoust\n2253 Franci Penov\n1800 Felix\n1786 Soviut\n1657 S.Mark\n1604 Adam Wright\n1402 Jedi Master Spooky\n1383 Jeff Atwood\n1293 Matt S.\n1159 Edan Maor\n1087 Steffen Opel\n1034 carson\n1024 Bill the Lizard\n977 Dave DeLong\n977 Mark Rushakoff\n950 Shay Erlichmen\n947 Nick Presta\n940 Thomas McDonald\n918 Dave Swersky\n814 Jonathan\n812 eWolf\n806 swanson\n782 Adam\n766 Lucas Jones\n726 TheHurt\n705 johnwards\n691 Catchwa\n669 Kyle Cronin\n664 Jason\n638 phsr\n624 codeka\n602 InfinitiesLoop\n588 nabeelmukhtar\n568 Yacoby\n502 conmulligan\n437 Ricky\n432 Dennis Williamson\n426 radius\n420 SztupY\n362 Soldier.moth\n359 ColinD\n353 Igor Zevaka\n336 Koning Baard\n320 Ryan Brunner\n311 jjnguy\n298 Greg Bray\n297 fukas78\n288 Nathan Reed\n287 Michael B.\n283 iconiK\n258 Peter Mourfield\n248 RichH\n244 blork\n238 Casebash\n237 Joel Potter\n221 ripper234\n214 TheKaptain\n207 mlaw\n207 Lucas McCoy\n205 Nippysaurus\n203 James A. Rosen\n191 Vitaly Polonetsky\n188 bpedro\n180 Shane\n168 Robert Munteanu\n158 svick\n138 Martin Plante\n133 mikej\n132 chenyuejie\n124 adrianbanks\n122 Peter Mortensen\n120 Tim Post\n119 daltojr\n117 magcius\n114 Josh Kelley\n114 Riduidel\n110 Martijn Laarman\n108 pufferfish\n106 balpha\n104 John Bristowe\n103 Peter Ajtai\n103 Mark Hurd\n102 jmoy\n97 JL01\n95 Maxim Zaslavsky\n93 Joe\n90 Kevin\n86 Roy Tang\n86 Robert Cartaino\n86 Jan Fabry\n86 denny\n85 Chacha102\n83 James Johnson\n81 pierocampanelli\n79 Evan\n79 Fatal510\n76 tsudot\n74 arinte\n71 Charles Stewart\n70 Frank Krueger\n69 Jim McKeeth\n68 Chris S\n67 voyager\n65 Dinis Cruz\n64 Mattias Konradsson\n63 crucible\n63 ADB\n62 Dan Atkinson\n59 theplic\n58 Matthew Pelser\n56 Alexandre Rafalovitch\n56 Artefacto\n56 Robert Love\n55 chanchal1987\n55 Nathan Voxland\n52 AidenMontgomery\n52 Bidhan Baruah\n51 Can Berk Güder\n48 Cristian Castiblanco\n48 scunliffe\n47 Fernando\n46 Matt Culbreth\n46 DC01\n43 user1711\n42 Simon Brown\n41 Nicolas Raoul\n40 C.W.Holeman II\n38 zengr\n36 Bialecki\n36 peter.newhook\n36 coobird\n34 Vicky\n32 RichOrr\n30 hvgotcodes\n28 Portman\n27 Heavy Bytes\n25 stacker\n23 chalup\n22 Shimmy\n21 David\n20 Ngu Soon Hui\n20 Wei Hu\n17 Michal\n14 tonklon\n11 Alienfluid\n4 Matt Huggins\n</pre>\n\n<p><strong>Requests generated</strong> (elapsed time 3 seconds)</p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=1&jsonp=Soapi._internal._callback0  14,494  private     application/json; charset=utf-8 iexplore:7564           \n2   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=2&jsonp=Soapi._internal._callback1  14,704  private     application/json; charset=utf-8 iexplore:7564           \n3   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=3&jsonp=Soapi._internal._callback2  15,408  private     application/json; charset=utf-8 iexplore:7564           \n4   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=4&jsonp=Soapi._internal._callback3  14,012  private     application/json; charset=utf-8 iexplore:7564           \n5   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=5&jsonp=Soapi._internal._callback4  14,457  private     application/json; charset=utf-8 iexplore:7564           \n6   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=6&jsonp=Soapi._internal._callback5  4,234   private     application/json; charset=utf-8 iexplore:7564           \n7   200 HTTP    api.stackapps.com   /1.0/questions?key=qgAq_KfDu0KYzlNG-qaTuw&pagesize=100&page=7&jsonp=Soapi._internal._callback6  204 private     application/json; charset=utf-8 iexplore:7564           \n\n\n</pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1402/timeline",
      "question_comments_url": "/questions/1402/comments",
      "question_answers_url": "/questions/1402/answers",
      "question_id": 1402,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281983378,
      "last_edit_date": 1282163489,
      "last_activity_date": 1282163489,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 88,
      "score": 2,
      "community_owned": true,
      "title": "How to calculate a list of users ranked by question view count totals.",
      "body": "<p>The API provides methods to sort and filter individual questions by view count.</p>\n\n<p>In order to calculate the question view count totals <em>per User</em>, some grouping and set operations are required.</p>\n\n<p>e.g.</p>\n\n<pre>\ntotal_views display_name [user_id]\n------------------------------------------\n1000 John Doe [12]\n900 Joe Snow [431]\n. . . etc etc\n\n</pre>\n\n<p>Post your solution to this use case in the language/library syntax of your choice.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "support",
        "dev-tip"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 1323,
          "accepted": false,
          "answer_comments_url": "/answers/1323/comments",
          "question_id": 1322,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281262240,
          "last_edit_date": 1281262542,
          "last_activity_date": 1281262542,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "API compliant request throttle implementations",
          "body": "<h3>C# sliding window throttle implementation</h3>\n\n<p>This is the throttle implementation used by <a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final\">Soapi.CS</a>. It is compatible with all .net platforms (desktop/silverlight/phone/mono)</p>\n\n<p>It has proven to provide maximum practical API throughput while complying both with the letter of the law as well as compensating for incidental vagaries. I would go so far as to characterize it as bullet-proof.</p>\n\n<p>As a demonstration, I pulled all of Jon Skeet, questions/answers/rep changes/timelines, on all Stack Exchange sites, in less than 3 minutes (560 requests), using the simple code listed after the throttle. <a href=\"http://pastebin.org/456761\" rel=\"nofollow\">Here is the log.</a></p>\n\n<h3>Soapi.Net.RequestThrottle</h3>\n\n<pre><code>//  \n//  Project: SOAPI\n//  http://soapics.codeplex.com\n//  http://stackapps.com/questions/386\n//  \n//  Copyright 2010, Sky Sanders\n//  Licensed under the GPL Version 2 license.\n//  http://soapi.codeplex.com/license\n//  \n\n#region\n\nusing System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Net;\nusing System.Threading;\n\n#endregion\n\nnamespace Soapi.Net\n{\n    /// &lt;summary&gt;\n    ///   This is a fully configurable, thread-safe web request throttle that fully complies with the \n    ///   published usage guidelines. In addition to compliance with the letter of the law, testing\n    ///   has exposed further limitations that are compensated. See code comments for more detail.\n    /// \n    ///   Simply route all WebRequest.Create calls through RequestThrottle.Instance.Create();\n    /// \n    ///   Upon completion of an issued request, regardless of status, you must call \n    ///   RequestThrottle.Instance.Complete() to decrement the outstanding request count.\n    /// \n    ///   NOTE: you can use this as a global throttle using WebRequest.RegisterPrefix\n    ///   http://msdn.microsoft.com/en-us/library/system.net.webrequest.registerprefix.aspx\n    ///   but this is not a viable option for silverlight so in Soapi, where requests\n    ///   are created in one place, we just call it explicitly.\n    /// &lt;/summary&gt;\n    /// &lt;remarks&gt;\n    /// Throttling conversation here: http://stackapps.com/questions/1143/request-throttling-limits\n    /// &lt;/remarks&gt;\n    public sealed class RequestThrottle // : IWebRequestCreate \n    {\n        #region Fields\n\n        private int _outstandingRequests;\n\n        private readonly Queue&lt;DateTime&gt; _requestTimes = new Queue&lt;DateTime&gt;();\n\n        #endregion\n\n        #region Constructors\n\n        private RequestThrottle()\n        {\n            ThrottleWindowTime = new TimeSpan(0, 0, 0, 5);\n            ThrottleWindowCount = 30;\n            MaxPendingRequests = 15;\n        }\n\n        #endregion\n\n        #region Properties\n\n        public static RequestThrottle Instance\n        {\n            get { return Nested.instance; }\n        }\n\n        /// &lt;summary&gt;\n        ///   The maximum number of allowed pending request.\n        /// \n        ///   The throttle window will keep us in compliance with the \n        ///   letter of the law, but testing has shown that a large \n        ///   number of outstanding requests result in a cascade of \n        ///   (500) errors that does not stop. \n        /// \n        ///   So we will block while there are &gt; MaxPendingRequests \n        ///   regardless of throttle window.\n        /// \n        ///   Defaults to 15 which has proven to be reliable.\n        /// &lt;/summary&gt;\n        public int MaxPendingRequests { get; set; }\n\n        /// &lt;summary&gt;\n        ///   If you are interested in monitoring\n        /// &lt;/summary&gt;\n        public int OutstandingRequests\n        {\n            get { return _outstandingRequests; }\n        }\n\n        /// &lt;summary&gt;\n        ///   The quantitive portion (xxx) of the of 30 requests per 5 seconds\n        ///   Defaults to published guidelines of 5 seconds\n        /// &lt;/summary&gt;\n        public int ThrottleWindowCount { get; set; }\n\n        /// &lt;summary&gt;\n        ///   The temporal portion (yyy) of the of 30 requests per 5 seconds\n        ///   Defaults to the published guidelines of 30\n        /// &lt;/summary&gt;\n        public TimeSpan ThrottleWindowTime { get; set; }\n\n        #endregion\n\n        #region Public Methods\n\n        /// &lt;summary&gt;\n        ///   This decrements the outstanding request count.\n        /// \n        ///   This MUST MUST MUST be called when a request has \n        ///   completed regardless of status.\n        /// \n        ///   If a request fails, it may be wise to delay calling \n        ///   this, e.g. cool down, for a few seconds, before \n        ///   reissuing the request.\n        /// &lt;/summary&gt;\n        public void Complete()\n        {\n            _outstandingRequests--;\n        }\n\n        /// &lt;summary&gt;\n        ///   Create a WebRequest. This method will block if too many\n        ///   outstanding requests are pending or the throttle window\n        ///   threshold has been reached.\n        /// &lt;/summary&gt;\n        /// &lt;param name = \"uri\"&gt;&lt;/param&gt;\n        /// &lt;returns&gt;&lt;/returns&gt;\n        public WebRequest Create(Uri uri)\n        {\n            lock (typeof(ThrottleLock))\n            {\n                // note: we could use a list of WeakReferences and \n                // may do so at a later date, but for now, this\n                // works just fine as long as you call .Complete\n                _outstandingRequests++;\n\n                while (_outstandingRequests &gt; MaxPendingRequests)\n                {\n                    using (var throttleGate = new AutoResetEvent(false))\n                    {\n                        throttleGate.WaitOne(100);\n                    }\n                }\n\n                if (_requestTimes.Count == ThrottleWindowCount)\n                {\n                    // pull the earliest request of the bottom\n                    DateTime tail = _requestTimes.Dequeue();\n                    // calculate the interval between now (head) and tail\n                    // to determine if we need to chill out for a few millisecons\n\n                    TimeSpan waitTime = (ThrottleWindowTime - (DateTime.Now - tail));\n\n                    if (waitTime.TotalMilliseconds &gt; 0)\n                    {\n#if !SILVERLIGHT\n                        Trace.WriteLine(\"waiting:\\t\" + waitTime + \"\\t\" + uri.AbsoluteUri);\n#endif\n                        using (var throttleGate = new AutoResetEvent(false))\n                        {\n                            throttleGate.WaitOne(waitTime);\n                        }\n                    }\n                }\n\n                // good to go. \n                _requestTimes.Enqueue(DateTime.Now);\n                return WebRequest.Create(uri);\n            }\n        }\n\n        /// &lt;summary&gt;\n        ///   Create a WebRequest. This method will block if too many\n        ///   outstanding requests are pending or the throttle window\n        ///   threshold has been reached.\n        /// &lt;/summary&gt;\n        /// &lt;param name = \"url\"&gt;&lt;/param&gt;\n        /// &lt;returns&gt;&lt;/returns&gt;\n        public WebRequest Create(string url)\n        {\n            return Create(new Uri(url));\n        }\n\n        #endregion\n\n\n        /// &lt;summary&gt;\n        ///   lock handle\n        /// &lt;/summary&gt;\n        private class ThrottleLock\n        {\n        }\n\n        #region Singleton Plubming\n\n        // the skeet singleton implementation\n        // http://www.yoda.arachsys.com/csharp/singleton.html\n\n        // ReSharper disable ClassNeverInstantiated.Local\n        class Nested\n        // ReSharper restore ClassNeverInstantiated.Local\n        {\n\n            // ReSharper disable EmptyConstructor\n            // Explicit static constructor to tell C# compiler\n            // not to mark type as beforefieldinit\n            static Nested()\n            // ReSharper restore EmptyConstructor\n            {\n            }\n\n            internal static readonly RequestThrottle instance = new RequestThrottle();\n        }\n\n        #endregion\n\n\n    }\n}\n</code></pre>\n\n<h3>Demo</h3>\n\n<p>Simple app, using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-rich-fluent-net-stack-overflow-api-client-library-complete-final\">Soapi.CS</a> that will gather all data for a user on all SE API sites. Simply supply an endpoint and user id to use as reference.</p>\n\n<p>Useful as a throttle test.</p>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing Soapi;\nusing Soapi.Domain;\n\nnamespace Samples\n{\n    public class AllMyStuff\n    {\n        private const string ApiKey = \"your-key-here\";\n        private readonly ApiContext Context;\n        private readonly List&lt;UserData&gt; Users;\n\n        public AllMyStuff(string endpoint, int userId)\n        {\n            Context = new ApiContext(ApiKey);\n            Context.Options.LazyLoadingEnabled(true);\n            Context.Initialize(false);\n            Users = Context.Sites.First(s =&gt; s.ApiEndpoint.StartsWith(endpoint))\n                .User(userId).Associated.Select(u =&gt; new UserData(u)).ToList();\n\n\n            var initEvent = new AutoResetEvent(false);\n\n            foreach (var item in Users)\n            {\n                UserData userData = item;\n                ThreadPool.QueueUserWorkItem(o =&gt;\n                    {\n                        User account = userData.User;\n\n                        userData.Questions = account.Questions\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Answers = account.Answers\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Reputation = account\n                            .RepChanges\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020, 1, 1))\n                            .ToList();\n\n                        userData.Timeline = account\n                            .Timeline\n                            .PageCount(-1)\n                            .FromDate(new DateTime(1980, 1, 1))\n                            .ToDate(new DateTime(2020,1, 1))\n                            .ToList();\n\n                        userData.Initialized = true;\n\n                        lock (Users)\n                            if (Users.All(u =&gt; u.Initialized))\n                                initEvent.Set();\n                    });\n            }\n            initEvent.WaitOne();\n        }\n    }\n\n    public class UserData\n    {\n        public UserData(User user)\n        {\n            User = user;\n            ApiEndpoint = user.Site.ApiEndpoint;\n        }\n        public List&lt;Answer&gt; Answers { get; set; }\n        public string ApiEndpoint { get; set; }\n        public bool Initialized { get; set; }\n        public List&lt;Question&gt; Questions { get; set; }\n        public List&lt;RepChange&gt; Reputation { get; set; }\n        public List&lt;UserTimeline&gt; Timeline { get; set; }\n        public User User { get; set; }\n    }\n}\n</code></pre>\n",
          "comments": []
        },
        {
          "answer_id": 1418,
          "accepted": false,
          "answer_comments_url": "/answers/1418/comments",
          "question_id": 1322,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282041284,
          "last_edit_date": 1282041708,
          "last_activity_date": 1282041708,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": true,
          "title": "API compliant request throttle implementations",
          "body": "<h3>JavaScript</h3>\n\n<p>This is a governed sliding window throttled queue that conforms to the published usage guidelines regarding request rate.</p>\n\n<p>It works by executing queued callbacks at a nominal rate.</p>\n\n<p>Similar to the C# version, but without threading.</p>\n\n<p>It provides:</p>\n\n<ul>\n<li>maximum throughput for isolated bursts</li>\n<li>reliable execution for mass requests.</li>\n</ul>\n\n<p>Usage:</p>\n\n<pre><code>// create a common Throttle\nwindow.RequestThrottle = new Throttle(5000,30,15);\n\n// route every request through the throttle\n\nRequestThrottle.enqueue(function(){ \n\n    /* do something*/\n\n    // but NO MATTER WHAT you need to signal when complete\n    // regardless of state, so get your exception handling hat on.\n    RequestThrottle.signal();    \n});\n</code></pre>\n\n<p>Throttle.js</p>\n\n<pre><code>Throttle = function(throttleWindowTime, throttleWindowCount, maxActiveRequests) {\n    /// &lt;summary&gt;\n    /// The purpose of Throttle is to queue requests in the interest of\n    /// preventing inadvertant DOS attacks.\n    /// \n    /// This throttle is intended to work with a sliding window and a governor.\n    ///        \n    /// The criteria are - X requests per Y seconds while &lt; z requests are pending.\n    /// where X: throttleWindowCount\n    ///       Y: throttleWindowTime\n    ///       X: maxActiveRequests\n    /// \n    /// &lt;/summary&gt;\n    /// &lt;param name=\"throttleWindowTime\" type=\"Number\"&gt;The amount of time, in ms,\n    /// that defines the throttle window.&lt;param&gt;\n    /// &lt;param name=\"throttleWindowCount\" type=\"Number\"&gt;The number of requests\n    /// allowed in any throttle window&lt;param&gt;\n    /// &lt;param name=\"maxActiveRequests\" type=\"Number\"&gt;The maximum allowed number\n    /// of active request&lt;param&gt;\n    /// &lt;remarks&gt;\n    /// Not sure why I care anymore, but it just seems the thing to do.\n    /// \n    /// If you have another idea, better or otherwise, please share.\n    /// &lt;/remarks&gt;\n\n    var times = new Queue(),\n    requests = new Queue(),\n    active = 0,\n    windowTime = throttleWindowTime,\n    windowCount = throttleWindowCount,\n    maxActive = maxActiveRequests,\n    timer = false,\n    that = this;\n\n    var lastRequestTime = 0; // for debugging\n\n    this.processQueue = function() {\n        /// &lt;summary&gt;\n        /// there are several criteria that need to be met in order\n        /// for a request to be executed:\n        ///\n        /// 1 - that the active request count &lt; max allowed active count\n        ///\n        /// 2 - that the difference in time between Now and the\n        ///     throttleWindowCount-nth request is greater than\n        ///     throttleWindowTime.\n        /// &lt;/summary&gt;\n\n        if (requests.count() === 0 || (active === maxActive)) {\n            return;\n        };\n\n        var head = new Date().getTime();\n\n        var queueCount = times.count()\n\n        if (queueCount &gt;= windowCount) {\n            // check the difference\n            var tail = times.peek() || 0;\n\n            if (head - tail &lt; windowTime) {\n                // not time yet\n                return;\n            };\n            // we are a go, snap the tail off\n            times.dequeue();\n        }\n\n\n        // Metrics: the interval since last request\n        //var interval = head - lastRequestTime;\n\n        lastRequestTime = head;\n\n        var request = requests.dequeue();\n\n        if (typeof request == 'function') {\n            active++;\n            times.enqueue(head);\n            request();\n        }\n    };\n\n    this.signal = function() {\n        /// &lt;summary&gt;\n        /// This method simply decrements the active request count.\n        /// It simply MUST be called once for each request issued\n        /// regardless of the final status of the request.\n        /// This means that you MUST NOT swallow execution errors.\n        /// &lt;/summary&gt;\n        active = active - 1;\n        if (active &lt; 0) {\n            throw \"Request count negative.\";\n        };\n    };\n\n    this.enqueue = function(callback) {\n        /// &lt;summary&gt;\n        /// Adds a callback to the throttle queue.\n        /// &lt;/summary&gt;\n        /// &lt;param name=\"callback\" type=\"Function\"&gt;The function to be executed in due time.&lt;param&gt;\n        requests.enqueue(callback);\n    };\n\n    this.clear = function() {\n        /// &lt;summary&gt;\n        /// Suspends processing and clears queues and counts.\n        /// &lt;/summary&gt;\n        that.suspend();\n        times = new Queue();\n        requests = new Queue();\n        active = 0;\n    };\n\n    this.start = function(pollingInterval) {\n        /// &lt;summary&gt;\n        /// Resumes processing of the throttle queue at the specified\n        /// polling interval;\n        /// \n        /// If the throttle is running, calls to this method are ignored.\n        /// &lt;/summary&gt;\n        /// &lt;param name=\"\" type=\"Number\"&gt;The desired polling interval in ms&lt;/param&gt;\n        if (!timer) {\n            timer = window\n            .setInterval(that.processQueue, pollingInterval);\n        };\n    };\n\n    this.suspend = function() {\n        /// &lt;summary&gt;\n        /// Suspends processing of the throttle queue.\n        /// \n        /// If the throttle is not running, calls to this method are ignored.    \n        /// &lt;/summary&gt;\n        if (timer) {\n            window.clearInterval(timer);\n            timer = false;\n        };\n    };\n\n    this.start(75);\n};\n\n\n\n\nfunction Queue() {\n    this._queue = [];\n    this._queueSpace = 0;\n}\n\nQueue.prototype = {\n    enqueue: function(element) {\n        this._queue.push(element);\n    },\n    dequeue: function() {\n        var element = undefined;\n        if (this._queue.length) {\n            element = this._queue[this._queueSpace];\n            if (++this._queueSpace * 2 &gt;= this._queue.length) {\n                this._queue = this._queue.slice(this._queueSpace);\n                this._queueSpace = 0;\n            }\n        }\n        return element;\n    },\n    count: function() {\n        return this._queue.length - this._queueSpace;\n    },\n    peek: function() {\n        var element = undefined;\n        if (this._queue.length) element = this._queue[this._queueSpace];\n        return element;\n    }\n};\n</code></pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 2,
      "question_timeline_url": "/questions/1322/timeline",
      "question_comments_url": "/questions/1322/comments",
      "question_answers_url": "/questions/1322/answers",
      "question_id": 1322,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281260893,
      "last_activity_date": 1282041708,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 659,
      "score": 4,
      "community_owned": true,
      "title": "API compliant request throttle implementations",
      "body": "<p>Balancing compliance with <a href=\"http://stackapps.com/questions/1143/request-throttling-limits\">Request Throttling Limits</a> with maximum allowable throughput in our applications and libraries with any reliability requires self-throttling.</p>\n\n<p>This post is meant to be a repo for Stack Exchange API compliant request throttle implementations.</p>\n",
      "comments": []
    },
    {
      "tags": [
        "discussion",
        "dev-tip"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 1223,
          "accepted": false,
          "answer_comments_url": "/answers/1223/comments",
          "question_id": 1216,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "creation_date": 1280104418,
          "last_edit_date": 1280109947,
          "last_activity_date": 1280109947,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "Simple Activity Monitor - For Educational Purposes only.",
          "body": "<p>Similar code for <a href=\"http://stackapps.com/questions/818/stackwrap4j-java-wrapper\" rel=\"nofollow\">StackWrap4J</a>:</p>\n\n<pre><code>List&lt;Users&gt; allUsers = new UsersList(\n      new StackWrapper(\"api.stackapps.com\"), \n      new UserQuery()\n);\n</code></pre>\n\n<p>You can then iterate through <code>allUsers</code> and see their <code>lastAccessDate</code>.  The currently released version will plow through the allowed calls per second, but v1.0.1 will properly throttle the requests.</p>\n",
          "comments": [
            {
              "comment_id": 3169,
              "creation_date": 1280119404,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1223,
              "post_type": "answer",
              "score": 2,
              "body": "I just noticed you are using a composition paradigm rather that the more imperative syntax that most of us are. I think I like the way that looks and I can immediately see some benefits. It it the case that your <code>UserQuery</code> is simply a property bag with parameters and such"
            },
            {
              "comment_id": 3189,
              "creation_date": 1280149983,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1223,
              "post_type": "answer",
              "score": 0,
              "body": "@code Yeah, we like it too.  It seems to simplify worrying about all of the possible parameters for all of the different routes."
            },
            {
              "comment_id": 3690,
              "creation_date": 1281999773,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1223,
              "post_type": "answer",
              "score": 0,
              "body": "on second look, i wonder if your <code>UserQuery</code> could be characterized as a parameter bag?"
            },
            {
              "comment_id": 3692,
              "creation_date": 1282005669,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1223,
              "post_type": "answer",
              "score": 0,
              "body": "@code, I&#39;m not versed on design patterns...but, yeah.  It&#39;s basically a parameter bag.  (Not sure if that&#39;s a bad thing...)"
            },
            {
              "comment_id": 3693,
              "creation_date": 1282006935,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1223,
              "post_type": "answer",
              "score": 0,
              "body": "not a bad thing at all - ultimately beneath the layers of abstraction in soapi, something similar is happening. Whereas you use <code>UserQuery</code>, I use <code>UsersParameters</code> and reading your code with my eyes painted a different picture, which I also found interesting."
            }
          ]
        },
        {
          "answer_id": 1413,
          "accepted": false,
          "answer_comments_url": "/answers/1413/comments",
          "question_id": 1216,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1282000217,
          "last_activity_date": 1282000217,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": true,
          "title": "Simple Activity Monitor - For Educational Purposes only.",
          "body": "<h2>C# / Soapi.CS</h2>\n\n<hr>\n\n<p>using <a href=\"http://stackapps.com/questions/386/soapi-cs-a-fully-relational-fluent-net-stack-exchange-api-client-library\">Soapi.CS</a></p>\n\n<hr>\n\n<pre><code>Context.Official.StackApps.Users\n    .PageSize(100).PageCount(0)\n    .OrderByDescending(u =&gt; u.LastAccessDate)\n    .ToList().ForEach(u =&gt;\n        Console.WriteLine(\"{0}\\t{1}\",\n        u.LastAccessDate.FormatElapsedTime(), u.DisplayName));\n</code></pre>\n\n<p><strong>Output:</strong></p>\n\n<pre>\n59 seconds ago    Greg Bray\n4 minutes ago    Don\n5 minutes ago    Lance Roberts\n5 minutes ago    CharlesB\n5 minutes ago    Ben Rowe\n7 minutes ago    pkaeding\n8 minutes ago    George Edison\n12 minutes ago    Jeff Atwood\n12 minutes ago    Sam Saffron\n13 minutes ago    Kevin Montrose\n13 minutes ago    code poet\n14 minutes ago    Mark Hurd\n21 minutes ago    jjnguy\n21 minutes ago    ahsteele\n23 minutes ago    Steffen Opel\n24 minutes ago    MattB\n24 minutes ago    Roger Pate\n33 minutes ago    Matt S.\n35 minutes ago    UncleZeiv\n42 minutes ago    Dennis Williamson\nan hour ago    Tamschi\nan hour ago    swanson\nan hour ago    Troy Hunt\nan hour ago    Joshua\nan hour ago    Scott Saad\nan hour ago    mlaw\nan hour ago    Leonard Thieu\nan hour ago    Dori\nan hour ago    Waleed Al-Balooshi\nan hour ago    Peter Jaric\n1 hours ago    Kevin Y\n1 hours ago    sideproject\n1 hours ago    kajaco\n1 hours ago    Doug\n1 hours ago    Michael B.\n1 hours ago    AidenMontgomery\n1 hours ago    jtimberman\n2 hours ago    systempuntoout\n2 hours ago    SztupY\n2 hours ago    Soviut\n2 hours ago    Bill the Lizard\n2 hours ago    KeithB\n2 hours ago    Boris Terzic\n2 hours ago    Jonathan\n2 hours ago    lfoust\n2 hours ago    csgillespie\n2 hours ago    Jason Merrill\n2 hours ago    Adam Wright\n2 hours ago    conmulligan\n2 hours ago    tonklon\n2 hours ago    David Fullerton\n3 hours ago    Maxim Zaslavsky\n3 hours ago    David\n3 hours ago    Sorskoot\n3 hours ago    user2958\n3 hours ago    Sandor Drieënhuizen\n3 hours ago    RegDwight\n3 hours ago    cori\n3 hours ago    Greg Roberts\n3 hours ago    neo\n3 hours ago    Felix\n3 hours ago    oivvio\n3 hours ago    chanchal1987\n3 hours ago    David Kaneda\n4 hours ago    carson\n4 hours ago    Ivo Flipse\n4 hours ago    AaronSieb\n4 hours ago    Dan Atkinson\n4 hours ago    Ryan Duffield\n4 hours ago    Freddie\n5 hours ago    Justin Ethier\n5 hours ago    Jeremy\n5 hours ago    Jarret Hardie\n5 hours ago    Adam\n5 hours ago    Terry Wilcox\n5 hours ago    David Basarab\n5 hours ago    Chris Tybur\n6 hours ago    Dave DeLong\n6 hours ago    Humpton\n6 hours ago    Jeff Yates\n6 hours ago    Midhat\n6 hours ago    Jason\n6 hours ago    Paolo Bergantino\n6 hours ago    Sanction10\n6 hours ago    Artefacto\n6 hours ago    Lucas Jones\n6 hours ago    Hasturkun\n6 hours ago    AnonJr\n6 hours ago    Edan Maor\n6 hours ago    Daniel\n7 hours ago    Sam Hasler\n7 hours ago    Jawa\n7 hours ago    Vladislav Tserman\n7 hours ago    Tim Büthe\n7 hours ago    FordBucha\n... 2900 other users\n2 months ago    Eric\n2 months ago    Batgar\n\n</pre>\n\n<p><strong>Requests generated</strong> (elapsed time 3 seconds)</p>\n\n<pre>\n#   Result  Protocol    Host    URL Body    Caching Content-Type    Process Comments    Custom  \n1   200 HTTP    api.stackapps.com   /1.0/users?pagesize=100&key=foo-bar-fu  34,610  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n2   200 HTTP    api.stackapps.com   /1.0/users?page=2&pagesize=100&key=foo-bar-fu   29,498  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n3   200 HTTP    api.stackapps.com   /1.0/users?page=3&pagesize=100&key=foo-bar-fu   25,432  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n4   200 HTTP    api.stackapps.com   /1.0/users?page=4&pagesize=100&key=foo-bar-fu   30,206  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n5   200 HTTP    api.stackapps.com   /1.0/users?page=5&pagesize=100&key=foo-bar-fu   25,294  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n6   200 HTTP    api.stackapps.com   /1.0/users?page=6&pagesize=100&key=foo-bar-fu   27,335  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n7   200 HTTP    api.stackapps.com   /1.0/users?page=7&pagesize=100&key=foo-bar-fu   26,925  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n8   200 HTTP    api.stackapps.com   /1.0/users?page=8&pagesize=100&key=foo-bar-fu   26,287  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n9   200 HTTP    api.stackapps.com   /1.0/users?page=9&pagesize=100&key=foo-bar-fu   24,423  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n10  200 HTTP    api.stackapps.com   /1.0/users?page=10&pagesize=100&key=foo-bar-fu  27,587  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n11  200 HTTP    api.stackapps.com   /1.0/users?page=11&pagesize=100&key=foo-bar-fu  25,370  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n12  200 HTTP    api.stackapps.com   /1.0/users?page=12&pagesize=100&key=foo-bar-fu  27,375  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n13  200 HTTP    api.stackapps.com   /1.0/users?page=13&pagesize=100&key=foo-bar-fu  26,469  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n14  200 HTTP    api.stackapps.com   /1.0/users?page=14&pagesize=100&key=foo-bar-fu  27,050  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n15  200 HTTP    api.stackapps.com   /1.0/users?page=15&pagesize=100&key=foo-bar-fu  25,317  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n16  200 HTTP    api.stackapps.com   /1.0/users?page=16&pagesize=100&key=foo-bar-fu  24,794  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n17  200 HTTP    api.stackapps.com   /1.0/users?page=17&pagesize=100&key=foo-bar-fu  23,604  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n18  200 HTTP    api.stackapps.com   /1.0/users?page=20&pagesize=100&key=foo-bar-fu  24,952  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n19  200 HTTP    api.stackapps.com   /1.0/users?page=18&pagesize=100&key=foo-bar-fu  25,322  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n20  200 HTTP    api.stackapps.com   /1.0/users?page=19&pagesize=100&key=foo-bar-fu  25,732  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n21  200 HTTP    api.stackapps.com   /1.0/users?page=21&pagesize=100&key=foo-bar-fu  20,903  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n22  200 HTTP    api.stackapps.com   /1.0/users?page=22&pagesize=100&key=foo-bar-fu  19,582  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n23  200 HTTP    api.stackapps.com   /1.0/users?page=23&pagesize=100&key=foo-bar-fu  19,149  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n24  200 HTTP    api.stackapps.com   /1.0/users?page=24&pagesize=100&key=foo-bar-fu  19,628  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n25  200 HTTP    api.stackapps.com   /1.0/users?page=25&pagesize=100&key=foo-bar-fu  21,179  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n26  200 HTTP    api.stackapps.com   /1.0/users?page=28&pagesize=100&key=foo-bar-fu  20,692  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n27  200 HTTP    api.stackapps.com   /1.0/users?page=26&pagesize=100&key=foo-bar-fu  19,142  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n28  200 HTTP    api.stackapps.com   /1.0/users?page=27&pagesize=100&key=foo-bar-fu  22,512  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n29  200 HTTP    api.stackapps.com   /1.0/users?page=29&pagesize=100&key=foo-bar-fu  17,528  private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n30  200 HTTP    api.stackapps.com   /1.0/users?page=30&pagesize=100&key=foo-bar-fu  7,239   private     application/json; charset=utf-8 jetbrains.resharper.taskrunner.msil:6940            \n\n</pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 1,
      "question_timeline_url": "/questions/1216/timeline",
      "question_comments_url": "/questions/1216/comments",
      "question_answers_url": "/questions/1216/answers",
      "question_id": 1216,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1280063916,
      "last_edit_date": 1282000667,
      "last_activity_date": 1282000667,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 130,
      "score": 4,
      "community_owned": true,
      "title": "Simple Activity Monitor - For Educational Purposes only.",
      "body": "<p>This <a href=\"http://stackapps.com/questions/494\" rel=\"nofollow\">Soapi.JS</a> script, if abused is likely to provoke frowns from those whom you would like to see smiles.</p>\n\n<p>Note: the dataset is only valid if the entire user base is pulled, and on just about any other site there are far too many users for the execution to be even remotely considered non-abusive or even remotely useful.</p>\n\n<p>So - bottom line is: you could have figured it out yourself, so no harm in me posting it.</p>\n\n<p>Let's just say it is an example of how to get cached/throttled paged results from the api with JavaScript.</p>\n\n<hr>\n\n<p><strong>OOPS</strong>\nBusted abusing the API!!!</p>\n\n<pre>\n Dont try this on stack overflow or really any other site with more than a couple thousand users. Really\nPage 26 of 26\n52 seconds Jeff Atwood\n74 seconds Bill the Lizard\n3 minutes rchern\n3 minutes Don\n3 minutes Nippysaurus\n5 minutes Steffen Opel\n7 minutes Ivo Trompert\n12 minutes code poet\n13 minutes Roger Pate\n14 minutes Adam Smith\n17 minutes ahsteele\n18 minutes Mark Hurd\n....\n</pre>\n\n<hr>\n\n<pre><code>&lt;!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\"&gt;\n&lt;html xmlns=\"http://www.w3.org/1999/xhtml\"&gt;\n&lt;head&gt;\n    &lt;title&gt;&lt;/title&gt;\n\n    &lt;script src=\"http://soapi.info/code/js/stable/3rd-party/jquery-1.4.1.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n\n    &lt;script src=\"http://soapi.info/code/js/stable/scripts/Soapi.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n\n    &lt;script type=\"text/javascript\"&gt;\n\n        // Soapi JavaScript Library\n        // http://stackapps.com/questions/494\n        // http://soapi.info/\n\n        $(function() {\n\n            var apiKey = '';\n\n            Soapi.RouteFactory(\"api.stackapps.com\", apiKey).Users()\n            .getPagedResponse(function(data) {\n\n                var table = $(\"#status\").append(\"&lt;table&gt;\");\n\n                for (var i in data.items.sort(function(a, b) {\n                    return b.last_access_date - a.last_access_date\n                })) {\n                    var timeAgo = Soapi.Utilities.getTimeAgo(data.items[i].last_access_date);\n                    var who = data.items[i].display_name;\n                    table.append(\"&lt;tr&gt;&lt;td&gt;\" + timeAgo + \"&lt;/td&gt;&lt;td&gt;\" + who + \"&lt;/td&gt;&lt;/tr&gt;\");\n                }\n            }, null, function(data) {\n                $(\"#status\")\n                .html(\"Page \" + data.page + \" of \" + (Math.floor(data.total / data.pagesize) + 1));\n            });\n        });\n    &lt;/script&gt;\n\n&lt;/head&gt;\n&lt;body&gt;\n    &lt;p&gt;\n        Dont try this on stack overflow or really any other site with more than a couple\n        thousand users. Really&lt;/p&gt;\n    &lt;div id=\"status\"&gt;\n    &lt;/div&gt;\n&lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n",
      "comments": [
        {
          "comment_id": 3119,
          "creation_date": 1280065177,
          "owner": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "Pretty impressive stuff, you really <i>move fast and clean</i> ;)"
        },
        {
          "comment_id": 3120,
          "creation_date": 1280065685,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 377,
            "user_type": "registered",
            "display_name": "Steffen Opel",
            "reputation": 1240,
            "email_hash": "02d931a2e2b27845705f2bae20ec3d1e"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "@steffen - aww shucks - you are making me blush."
        },
        {
          "comment_id": 3123,
          "creation_date": 1280075110,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "So all it does is tell you when every user was last seen?"
        },
        {
          "comment_id": 3125,
          "creation_date": 1280079271,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "@geo - yea, <i>all</i> this line of code, <code>Soapi.RouteFactory(&quot;api.stackapps.com&quot;, apiKey).Users().getPagedResponse( function(data) {&#47;* data.items == all users on stackapps *&#47; });</code> does is return an array of all the users on stackapps while observing a 1 minute cached duration and complying with the throttle guidelines."
        },
        {
          "comment_id": 3132,
          "creation_date": 1280087636,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "@code: Don&#39;t misunderstand me, I&#39;m not criticizing it. I&#39;m in awe that such a small piece of code does so much."
        },
        {
          "comment_id": 3133,
          "creation_date": 1280088541,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1216,
          "post_type": "question",
          "score": 0,
          "body": "@geo - i am just bustin your balls. I don&#39;t misunderstand you. Actually, I think I understand you quite well. no worries."
        }
      ]
    },
    {
      "tags": [
        "discussion",
        "status-completed"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1021,
          "accepted": false,
          "answer_comments_url": "/answers/1021/comments",
          "question_id": 889,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1278358680,
          "last_activity_date": 1278358680,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to batch up multiple id requests to maximize economy and still avoid (400) Bad Request",
          "body": "<h3>JavaScript implementation</h3>\n\n<p>This code is taken from <a href=\"http://stackapps.com/questions/494\" rel=\"nofollow\">Soapi.JS</a> and is free to use without restriction of any kind.</p>\n\n<p>Documented with JsDoc and VS Xml Docs, take your pick of either or remove both. Not my business. ;-)</p>\n\n<p><strong>The Code:</strong></p>\n\n<pre><code>/**\n* Creates a new VectorizedIdList.\n* @class A class for batching up API requests without hitting the max path limit and generating (400) Bad Request errors\n* @param {Number} maxBatchLength Maximum string length of batches\n*/\nvar VectorizedIdList = function(maxBatchLength) {\n    /// &lt;summary&gt;\n    /// A class for batching up API requests without hitting\n    /// the max path limit and generating (400) Bad Request errors\n    /// &lt;summary&gt;\n    /// &lt;param name=\"maxBatchLength\" type=\"Number\"&gt;Maximum string length of batches&lt;/param&gt;\n    /// &lt;field name=\"maxBatchLength\" type=\"Number\"&gt;Maximum string length of batches&lt;/field&gt;\n    /// &lt;returns type=\"Soapi.Utilities.VectorizedIdList\"/&gt;\n\n    /**\n    * Maximum string length of batches\n    * @field\n    * @type Number \n    */\n    this.maxBatchLength = maxBatchLength;\n\n\n    var list = [];\n    var that = this;\n\n\n    this.indexOf = function(value) {\n        for (var i = 0; i &lt; list.length; i++) {\n            if (list[i] == value) {\n                return i;\n            };\n        };\n        return -1;\n    };\n\n\n    /**\n    * Adds an array of values to the batch, each if it does not already exist\n    * @function\n    * @param {Array[Number|String]} values An array of values to add to the batch\n    */\n    this.addRange = function(values) {\n        /// &lt;summary&gt;Adds an array of values to the batch, each if it does not already exist&lt;/summary&gt;\n        /// &lt;param name=\"values\" type=\"Array[Number|String]\"&gt;An array of values to add to the batch&lt;/param&gt;\n        list = list.concat(values);\n    };\n\n    /**\n    * Adds a value to the batch, if it does not already exist\n    * @function\n    * @param {Number|String} value A value to add to the batch\n    */\n    this.add = function(value) {\n        /// &lt;summary&gt;Adds a value to the batch, if it does not already exist&lt;/summary&gt;\n        /// &lt;param name=\"value\" type=\"Number|String\"&gt;&lt;/param&gt;\n        if (this.indexOf(value) == -1) {\n            list.push(value);\n        }\n    };\n\n    /**\n    * Removes a value from the batch, if it exists\n    * @function\n    * @param {Number|String} remove A value to remove from the batch\n    */\n    this.remove = function(value) {\n        /// &lt;summary&gt;Removes a value from the batch, if it exists&lt;/summary&gt;\n        /// &lt;param name=\"value\" type=\"Number|String\"&gt;A value to remove from the batch&lt;/param&gt;\n\n        var index = this.indexOf(value);\n        if (index &gt; -1) {\n            list.splice(index, 1);\n        };\n    };\n\n    /**\n    * Gets an array of vectorized list strings, each length being equal or less than maxBatchLength\n    * @function\n    * @param {Boolean} clear whether to clear the inner list after batch generation\n    * @returns {Array[String]} An array of vectorized id lists\n    */\n    this.getBatchesVectorized = function(clear) {\n        /// &lt;summary&gt;Gets an array of vectorized list strings, each length being equal or less than maxBatchLength&lt;/summary&gt;\n        /// &lt;param name=\"clear\" type=\"Boolean\"&gt;whether to clear the inner list after batch generation&lt;/param&gt;\n        /// &lt;returns type=\"Array\"/&gt;\n        var batches = this.getBatches(clear);\n        for (var i = 0; i &lt; batches.length; i++) {\n            batches[i] = batches[i].join(\";\");\n        };\n        return batches;\n    };\n\n    /**\n    * Gets an array of arrays containing batched values\n    * @function\n    * @param {Boolean} clear whether to clear the inner list after batch generation\n    * @returns {Array[Array[Number]]} An array of array, each representing a viable batch\n    */\n    this.getBatches = function(clear) {\n        /// &lt;summary&gt;Gets an array of arrays containing batched values&lt;/summary&gt;\n        /// &lt;param name=\"clear\" type=\"Boolean\"&gt;whether to clear the inner list after batch generation&lt;/param&gt;\n        /// &lt;returns type=\"Array\"/&gt;\n\n        var batches = [];\n        var batch = [];\n        var batchString = \"\";\n        for (var i = 0; i &lt; list.length; i++) {\n            var token = list[i].toString() + \";\";\n            if ((batchString + token).length &gt;= that.maxBatchLength) {\n                batches.push(batch);\n                batch = [];\n                batchString = \"\";\n                batch.push(list[i]);\n\n            } else {\n                batchString += token;\n                batch.push(list[i]);\n            };\n\n        };\n\n        if (batch.length &gt; 0) {\n            batches.push(batch);\n        }\n        if (clear) {\n            list = [];\n        };\n        return batches;\n    };\n};\n</code></pre>\n\n<p><strong>The qunit test:</strong></p>\n\n<pre><code>module(\"vectorizedIdList\");\ntest(\"\", function()\n{\n    var list = new VectorizedIdList(200);\n    for (var i = 0; i &lt; 200; i++)\n    {\n        list.add(i);\n    };\n    var batches = list.getBatches();\n    var total = 0;\n    for (var i = 0; i &lt; batches.length; i++)\n    {\n        total += batches[i].length;\n    }\n    ok(total == 200, \"item count\");\n\n    batches = list.getBatchesVectorized();\n    var passes = true;\n    for (var i = 0; i &lt; batches.length; i++)\n    {\n        if (batches[i].toString().length &gt; 200)\n        {\n            passes = false;\n            break;\n        };\n    }\n\n    ok(passes, \"vlist length\");\n});\n</code></pre>\n\n<p><strong>More implementations in other languages welcome.</strong></p>\n",
          "comments": []
        }
      ],
      "favorite_count": 3,
      "closed_date": 1282000533,
      "closed_reason": "noise or pointless",
      "question_timeline_url": "/questions/889/timeline",
      "question_comments_url": "/questions/889/comments",
      "question_answers_url": "/questions/889/answers",
      "question_id": 889,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1277477280,
      "last_edit_date": 1282000519,
      "last_activity_date": 1282000519,
      "up_vote_count": 8,
      "down_vote_count": 0,
      "view_count": 304,
      "score": 8,
      "community_owned": false,
      "title": "How to batch up multiple id requests to maximize economy and still avoid (400) Bad Request",
      "body": "<h3>Update:</h3>\n\n<p>All of our grumblings and the unbearable beauty of our workarounds resulted in this issue being fixed last week.</p>\n\n<p>You can now send 100 id in one request and receive 100 responses.</p>\n\n<p>See <a href=\"http://stackapps.com/questions/1170/url-length-limits-have-been-increased\" rel=\"nofollow\">http://stackapps.com/questions/1170/url-length-limits-have-been-increased</a></p>\n\n<p>This code <em>could</em> be implemented such to output fixed batches of 100 items instead of being constrained on string length, for when you are gathering id's from a possibly very large source and it would simplify your life greatly.</p>\n\n<p>I will create another implementation in C# and JS.</p>\n\n<hr>\n\n<h3>Problem</h3>\n\n<p>When batching up <code>id</code> requests, e.g. <code>/questions/{id}</code> the responsibility is on you to ensure that the length of your path is less than <a href=\"http://stackapps.com/questions/619/url-length-limit-for-for-requests-taking-vectorised-ids-answers-id-question\" rel=\"nofollow\"><strong>???</strong></a> otherwise a <code>400 Bad Request</code> is thrown.</p>\n\n<p>A path is the part of the url that is before any <code>?</code>. e.g.</p>\n\n<p><code>http://api.stackapps.com/0.9/method/0;1;2;/foo</code></p>\n\n<h3>Use Case</h3>\n\n<p>It is always best, for the performance of your app as well as reducing requests to the api, to batch up multiple requests, when it makes sense to do so.</p>\n\n<p>For instance, if you have a list of questions that have previously been pulled and you simply want to update them if they have had activity. </p>\n\n<p>You <em>could</em> simply repull each one individually. This is the worst solution. It slows down your app, wastes bandwidth both net and cpu and exhausts your api key.</p>\n\n<p>So you want to batch them, which means constructing a 'vectorized' or semi-colon delimited string containing the ids of the questions you wish to query.</p>\n\n<p>Something similar to...</p>\n\n<p><code>http://api.stackapps.com/0.9/questions/95;96;97;98;99;100;101;102;103;104;105;106?sort=activity&amp;min=1277476364&amp;max=1593095563&amp;order=asc</code></p>\n\n<p>Which gets these questions <strong>if</strong> they have had activity, e.g. created, answered, edited, between the dates specified in min/max.</p>\n\n<p>The task is to manage the length of the path with the least amount of complexity.</p>\n\n<h3>One Solution</h3>\n\n<p>The code presented is in C# but is quite general and can be applied in most any programming language. I will provide a JavaScript implementation at some later date, others may wish to contribute by providing implementations in their language of choice.</p>\n\n<p>One solution is to create a class that allows you to stuff as many values into it as you like and at your request, batch them up into groups that satisfy your current length requirements which includes then length of your current path without the id component.</p>\n\n<p><strong>Test First</strong></p>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.IO;\nusing System.Linq;\nusing System.Net;\nusing NUnit.Framework;\n\nnamespace StackApps.Tips\n{\n    [TestFixture]\n    public class VectorizedIdListFixture\n    {\n        [Test]\n        public void Test()\n        {\n            // according to the only semi-answer as to the max length of a\n            // path you need to take into account the length of the path, \n            // e.g.\n            // http://api.foooverflow.com/0.X/foo/{dont count id}/bar\n            // to ensure your path is less that 260.\n\n            // this test shows that ~290 is the max path including protocol\n            // but it seems to waver quite a bit so I am guessing that \n            // urlencoding of the semicolons is being counted on the other end.\n\n            // Creating a usable constant from a variable amount of semis is \n            // a losing fight, so I would suggest 240 as a safe max\n            // path length.\n\n            const int maxPathLength = 240; \n\n            const string yourAPiKey = \"\";\n\n            const string myApiRequestPath \n                = \"http://api.stackapps.com/0.9/questions/{0}\";\n\n            int urlLength = myApiRequestPath.Length - \"{0}\".Length;\n\n            var list = new VectorizedIdList&lt;int&gt;(maxPathLength - urlLength);\n\n            const int questionCount = 200;\n\n            for (int i = 0; i &lt; questionCount; i++)\n            {\n                list.Add(i);\n            }\n\n            // get the batches as List&lt;int&gt; for testing\n            var batches = list.GetBatches();\n\n            // all our id's are accounted for\n            Assert\n                .AreEqual(questionCount, batches.Sum(b =&gt; b.Count()));\n\n\n            // get the batches as vectorized for direct consumption\n            var vectorizedBatches = list.GetBatchesVectorized();\n\n            // none of our batches exceed the max length\n            Assert\n                .LessOrEqual(vectorizedBatches.Max(b =&gt; b.Length), maxPathLength);\n\n\n            // build a list of URL\n            List&lt;string&gt; batchedUrls = vectorizedBatches\n                .Select(b =&gt; string.Format(myApiRequestPath, b) + \"?key=\" + yourAPiKey).ToList();\n\n            Console.WriteLine(maxPathLength);\n\n            // fetch all of the urls\n            batchedUrls.ForEach(u =&gt;\n                {\n                    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(u);\n                    request.UserAgent = \"soapi-tips testing path length\";\n                    request.AutomaticDecompression = DecompressionMethods.GZip;\n\n                    Console.WriteLine(u);\n                    var json =\n                        new StreamReader(request\n                            .GetResponse()\n                            .GetResponseStream())\n                            .ReadToEnd();\n                    // no need to write it. a 400 would have failed the test\n                    // Console.WriteLine(json);\n                });\n        }\n    }\n}\n</code></pre>\n\n<p><strong>Results</strong>:</p>\n\n<p>240</p>\n\n<pre>http://api.stackapps.com/0.9/questions/0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69?key=\nhttp://api.stackapps.com/0.9/questions/70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99;100;101;102;103;104;105;106;107;108;109;110;111;112;113;114;115;116;117;118;119;120;121;122;123;124;125;126?key=\nhttp://api.stackapps.com/0.9/questions/127;128;129;130;131;132;133;134;135;136;137;138;139;140;141;142;143;144;145;146;147;148;149;150;151;152;153;154;155;156;157;158;159;160;161;162;163;164;165;166;167;168;169;170;171;172;173;174;175;176?key=\nhttp://api.stackapps.com/0.9/questions/177;178;179;180;181;182;183;184;185;186;187;188;189;190;191;192;193;194;195;196;197;198;199?key=\n</pre>\n\n<h3>The Code:</h3>\n\n<p>This code is taken from <a href=\"http://stackapps.com/questions/386\" rel=\"nofollow\">Soapi.CS</a> and is free to use with no restrictions.</p>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\n\nnamespace StackApps.Tips\n{\n    /// &lt;summary&gt;\n    ///   A class for batching up API requests without hitting\n    ///   the max path limit and generating (400) Bad Request errors\n    /// &lt;/summary&gt;\n    /// &lt;typeparam name = \"T\"&gt;&lt;/typeparam&gt;\n    public class VectorizedIdList&lt;T&gt;\n    {\n        public VectorizedIdList(string id, int maxBatchLength)\n            : this(maxBatchLength)\n        {\n            Id = id;\n        }\n\n        public VectorizedIdList(int maxBatchLength)\n        {\n            MaxBatchLength = maxBatchLength;\n            List = new List&lt;T&gt;();\n        }\n\n        public List&lt;T&gt; List { get; private set; }\n\n        /// &lt;summary&gt;\n        ///   Maximum string length of batches\n        /// &lt;/summary&gt;\n        public int MaxBatchLength { get; set; }\n\n        /// &lt;summary&gt;\n        ///   To make managing instances of IdList easier\n        /// &lt;/summary&gt;\n        public string Id { get; private set; }\n\n        public void AddRange(IEnumerable&lt;T&gt; values)\n        {\n            foreach (T value in values)\n            {\n                Add(value);\n            }\n        }    \n\n        public void Add(T item)\n        {\n            if (!List.Contains(item))\n            {\n                List.Add(item);\n            }\n        }\n\n        public void Remove(T item)\n        {\n            if (List.Contains(item))\n            {\n                List.Remove(item);\n            }\n        }\n\n\n        public List&lt;string&gt; GetBatchesVectorized()\n        {\n            return GetBatchesVectorized(false);\n        }\n\n        public List&lt;string&gt; GetBatchesVectorized(bool clear)\n        {\n            var batches = GetBatches(clear);\n\n            var result = batches.Select(batch =&gt;\n                                        string.Join(\";\", batch.Select(i =&gt; i.ToString()).ToArray())\n                                            .TrimEnd(';'));\n            return result.ToList();\n        }\n\n        public List&lt;List&lt;T&gt;&gt; GetBatches()\n        {\n            return GetBatches(false);\n        }\n\n        public List&lt;List&lt;T&gt;&gt; GetBatches(bool clear)\n        {\n            List&lt;List&lt;T&gt;&gt; result = new List&lt;List&lt;T&gt;&gt;();\n\n            List&lt;T&gt; batch = new List&lt;T&gt;();\n            // to keep track of the net length of the batch\n            StringBuilder batchCounter = new StringBuilder();\n\n            foreach (T item in List)\n            {\n                string token = String.Format(\"{0};\", item);\n\n                if (batchCounter.Length + token.Length &gt;= MaxBatchLength)\n                {\n                    result.Add(batch);\n                    batch = new List&lt;T&gt; {item};\n                    batchCounter = new StringBuilder(token);\n                }\n                else\n                {\n                    batch.Add(item);\n                    batchCounter.Append(token);\n                }\n            }\n\n            // pick up the get the crumbs\n            if (batch.Count &gt; 0)\n            {\n                result.Add(batch);\n            }\n\n            if (clear)\n            {\n                List.Clear();\n            }\n\n            return result;\n        }\n    }\n}\n</code></pre>\n\n<p><strong>More implementations in the language of your choice are welcome</strong></p>\n",
      "comments": []
    },
    {
      "tags": [
        "discussion",
        "dev-tip",
        "javascript"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 2,
      "question_timeline_url": "/questions/891/timeline",
      "question_comments_url": "/questions/891/comments",
      "question_answers_url": "/questions/891/answers",
      "question_id": 891,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1277482192,
      "last_edit_date": 1282000423,
      "last_activity_date": 1282000423,
      "up_vote_count": 4,
      "down_vote_count": 0,
      "view_count": 3004,
      "score": 4,
      "community_owned": true,
      "title": "How to call the API via JSONP in Plain Old JavaScript",
      "body": "<p>This tips demonstrates how to call the API in JavaScript <strong>without</strong> the need of jQuery or other frameworks.</p>\n\n<p>In a lot of cases you will find that the JSONP implementations provided in various frameworks are just not quite right for the job and require a lot of massaging.</p>\n\n<p>Here is a JSONP implementation I designed specifically for use with the API.</p>\n\n<p>I have tested on many browsers on windows and have yet to encounter a failure.</p>\n\n<p>It may be easy to miss, but a packed version is at the bottom of this post and weighs in at 696 bytes.</p>\n\n<h3>Usage Example</h3>\n\n<pre><code>&lt;script src=\"scripts/DevTips.js\" type=\"text/javascript\"&gt;&lt;/script&gt;\n\n&lt;script type=\"text/javascript\"&gt;\n\n    var myApiKey = \"\";\n\n    var url = \"http://api.stackapps.com/0.9/questions/unanswered\";\n\n    var parameters = {\n        \"sort\": \"votes\",\n        \"min\": \"5\",\n        \"order\": \"asc\"\n    };\n\n\n    DevTips.jsonp(url, parameters, myApiKey,\n    function success(data) {\n        alert(data.total);\n    },\n    function failure(error) {\n        alert(error.message);\n    });\n\n&lt;/script&gt;\n</code></pre>\n\n<h3>The Code:</h3>\n\n<pre><code>var DevTips = DevTips || {};\n\n(function(dt) {\n\n    var __callbackId = 0;\n    var maxQueryStringLengthErrorMessage = \"Query string length exceeds maximum recommended value of \";\n    var maxPathLengthErrorMessage = \"Url path length exceeds maximum recommended value of \";\n\n    // expose these for reference\n    var maxQueryStringLength = dt.maxQueryStringLength = 1000;\n    var maxPathLength = dt.maxPathLength = 240;\n\n    var jsEncode = dt.jsEncode = function(value) {\n        // properly encode arrays and dates\n        // NOTE: use this to turn arrays of ids into\n        // semicolon delimited string.\n\n        if (value instanceof Date) {\n            return new Date(value).getTime();\n        };\n\n        if (value instanceof Array) {\n            var values = [];\n            for (var i = 0; i &lt; value.length; i++) {\n                values.push(encodeURIComponent(value[i]));\n            };\n            // vectorize arrays\n            return values.join(\";\");\n        };\n\n        return encodeURIComponent(value);\n\n    };\n\n    var jsonp = dt.jsonp = function(url, parameters, apiKey, success, error, timeout) {\n        /// &lt;summary&gt;\n        /// Sets up a JSONP call to the api.\n        /// &lt;/summary&gt;\n        /// &lt;param name=\"url\" type=\"String\"&gt;&lt;/param&gt;\n        /// &lt;param name=\"parameters\" type=\"Map\"&gt;Optional&lt;/param&gt;\n        /// &lt;param name=\"apiKey\" type=\"String\"&gt;Optional&lt;/param&gt;\n        /// &lt;param name=\"success\" type=\"Function(data)\"&gt;Handle successful api call. data = api JSOB&lt;/param&gt;\n        /// &lt;param name=\"error\" type=\"Function(error)\"&gt;Handle and error condition. error = API error JSOB. \n        /// Optional, if you are crazy or would like to be driven that way.&lt;/param&gt;\n        /// &lt;param name=\"timeout\" type=\"Number\"&gt;Timeout in ms. Optional. Defaults to 10,000&lt;/param&gt;\n\n        if (url.length &gt; maxPathLength) {\n            throw new Error(maxPathLengthErrorMessage + maxPathLength);\n        };\n\n        var callBackName = \"_callback\" + __callbackId++;\n\n        var queryString = \"?jsonp=DevTips.jsonp.\" + callBackName;\n        if (parameters) {\n            for (var name in parameters) {\n                if (parameters.hasOwnProperty(name)) {\n                    queryString = queryString + \"&amp;\" + name + \"=\" + jsEncode(parameters[name]);\n                };\n            };\n        };\n        if (queryString.length &gt; maxQueryStringLength) {\n            throw new Error(maxQueryStringLengthErrorMessage + maxQueryStringLength);\n        };\n\n        // setup the callback\n        jsonp[callBackName] = function(data) {\n            delete jsonp[callBackName];\n            if (data.error) {\n                if (error) {\n                    data.error.callback = callBackName;\n                    error(data.error);\n                };\n            }\n            else {\n                success(data);\n            };\n        };\n\n        // send the request\n        var scr = document.createElement(\"script\");\n        scr.type = \"text/javascript\";\n        scr.src = url + queryString;\n        var head = document.getElementsByTagName(\"head\")[0];\n        head.insertBefore(scr, head.firstChild);\n\n\n        // default to 10 second timeout\n        timeout = timeout || 10000;\n\n        window.setTimeout(function() {\n            if (typeof jsonp[callBackName] == \"function\") {\n\n                // replace success with null callback in case the request is just very latent.\n                jsonp[callBackName] = function(data) {\n                    delete jsonp[callBackName];\n                };\n\n                // call the error callback\n                error({ code: 408, message: \"Request Timeout\", callback: callBackName });\n\n                // set a longer timeout to safely clean up the unused callback.\n                window.setTimeout(function() {\n                    if (typeof jsonp[callBackName] == \"function\") {\n                        delete jsonp[callBackName];\n                    };\n                }, 60000);\n            };\n        }, timeout);\n    };\n})(DevTips);\n</code></pre>\n\n<h3>The Code Packed with Dojo ShrinkSafe (696 bytes)</h3>\n\n<pre><code>var DevTips=DevTips||{}; (function(dt){ var _2=0; var _3=\"Query string length exceeds maximum recommended value of \"; var _4=\"Url path length exceeds maximum recommended value of \"; var _5=dt.maxQueryStringLength=1000; var _6=dt.maxPathLength=240; var _7=dt.jsEncode=function(_8){ if(_8 instanceof Date){ return new Date(_8).getTime(); } if(_8 instanceof Array){ var _9=[]; for(var i=0;i&lt;_8.length;i++){ _9.push(encodeURIComponent(_8[i])); } return _9.join(\";\"); } return encodeURIComponent(_8); }; var _b=dt.jsonp=function(_c,_d,_e,_f,_10,_11){ if(_c.length&gt;_6){ throw new Error(_4+_6); } var _12=\"_callback\"+_2++; var _13=\"?jsonp=DevTips.jsonp.\"+_12; if(_d){ for(var _14 in _d){ if(_d.hasOwnProperty(_14)){ _13=_13+\"&amp;\"+_14+\"=\"+_7(_d[_14]); } } } if(_13.length&gt;_5){ throw new Error(_3+_5); } _b[_12]=function(_15){ delete _b[_12]; if(_15.error){ if(_10){ _15.error.callback=_12; _10(_15.error); } }else{ _f(_15); } }; var scr=document.createElement(\"script\"); scr.type=\"text/javascript\"; scr.src=_c+_13; var _17=document.getElementsByTagName(\"head\")[0]; _17.insertBefore(scr,_17.firstChild); _11=_11||10000; window.setTimeout(function(){ if(typeof _b[_12]==\"function\"){ _b[_12]=function(_18){ delete _b[_12]; }; _10({code:408,message:\"Request Timeout\",callback:_12}); window.setTimeout(function(){ if(typeof _b[_12]==\"function\"){ delete _b[_12]; } },60000); } },_11); }; })(DevTips);\n</code></pre>\n",
      "comments": [
        {
          "comment_id": 1955,
          "creation_date": 1277488453,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "Thanks for the tip... but my app uses jQuery anyway."
        },
        {
          "comment_id": 1974,
          "creation_date": 1277504902,
          "owner": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "ya, i did this in jquery in about 10% of the code here."
        },
        {
          "comment_id": 1977,
          "creation_date": 1277512523,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "@jason - Really? Congratulations. And your point is <i>what</i>? As long as we are throwing non-sequiturs around, you might be interested in the fact that the only reason you <i>can</i> reliably use jquery to consume the api is here <a href=\"http://stackapps.com/questions/628/api-suggestion-suppress-http-error-code-when-jsonp-is-specified\" title=\"api suggestion suppress http error code when jsonp is specified\">stackapps.com/questions/628/&hellip;</a>.  But again, that is not the point.  If you are still not picking up what I am putting down, perhaps from now on, you should count to 10 and take that time to ask yourself if what you are about to post is noise or signal."
        },
        {
          "comment_id": 1981,
          "creation_date": 1277516859,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@jason - and I ain&#39;t mad at ya. It is just obvious that you made no effort to understand the point of this post and there was zero thought put into the comment you made. capisce? and as soon as it disappears, so will these."
        },
        {
          "comment_id": 1982,
          "creation_date": 1277518201,
          "owner": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "@code poet - easy there, killer... that comment had nothing to do with you or your efforts or anything. it was merely a statement of fact in response to george&#39;s comment. i can (and do) perform the same action that you do here in approximately 10% of the code using jQuery. And no, it&#39;s not because of that link to whatever wrapper you wrote that I have never seen before now. jeez.. you sound like my girlfriend always making everything about you :\\"
        },
        {
          "comment_id": 1983,
          "creation_date": 1277518568,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@jason - let&#39;s try this again. read. then count. then post. really. and noise in response to noise is still noise."
        },
        {
          "comment_id": 1984,
          "creation_date": 1277519575,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 19,
            "user_type": "registered",
            "display_name": "Jason",
            "reputation": 2755,
            "email_hash": "0e2e822d32a7ab3d7f0b7098d03b1d16"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "@jason - &#39;And no, it&#39;s not because of that link to whatever wrapper you wrote that I have never seen before now. jeez.. you sound like my girlfriend always making everything about you :\\&#39; - you sound like someone who cannot be bothered to inform themselves before blurting emotional responses. That link is to a post addressing a flaw that prevented reliable consumption of the api via JSONP. It has nothing to do with me other than the fact that I wrote it. Do you really want to keep this going?"
        },
        {
          "comment_id": 1985,
          "creation_date": 1277519669,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 2,
          "body": "@moderator - can you please delete all of this noise, including mine. It adds absolutely no value."
        },
        {
          "comment_id": 1987,
          "creation_date": 1277520289,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "@geo - i blame this on you and your non-comment comment. see what you started? butterflies and hurricanes and all that. i am smiling but cannot bring myself to type one more frakking emoticon. i just don&#39;t have it in me toady."
        },
        {
          "comment_id": 1988,
          "creation_date": 1277521194,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "@code: Oh <b>wow</b>! I <i>did</i> start something :O"
        },
        {
          "comment_id": 1996,
          "creation_date": 1277555019,
          "owner": {
            "user_id": 113,
            "user_type": "registered",
            "display_name": "Igor Zevaka",
            "reputation": 375,
            "email_hash": "fecb84f9ad278f1afa3c57981eba50f3"
          },
          "post_id": 891,
          "post_type": "question",
          "score": 0,
          "body": "prozac........."
        }
      ]
    },
    {
      "tags": [
        "discussion",
        "dev-tip",
        "c#",
        "silverlight"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 1,
      "question_timeline_url": "/questions/892/timeline",
      "question_comments_url": "/questions/892/comments",
      "question_answers_url": "/questions/892/answers",
      "question_id": 892,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1277485801,
      "last_edit_date": 1282000401,
      "last_activity_date": 1282000401,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 284,
      "score": 2,
      "community_owned": true,
      "title": "How to retrieve paged API results in C# and Silverlight",
      "body": "<p>In this tip we are going to leverage the <a href=\"http://stackapps.com/questions/890/dev-tip-how-to-call-the-api-in-c-and-silverlight\" rel=\"nofollow\">SimpleRequestFactory</a> and gather a multipage response.</p>\n\n<p>Lets pull the first 5 pages of 100 users on stackapps.com.</p>\n\n<p>NOTE: for Silverlight, substitute <code>Newtonsoft.Json.JsonConvert</code> for the <code>JavaScriptSerializer</code>.</p>\n\n<h3>Simple Domain Objects</h3>\n\n<p>First we need some domain objects to deserialize into and a simple deserialization strategy.</p>\n\n<pre><code>using System.Collections.Generic;\nusing System.IO;\nusing System.Net;\nusing System.Web.Script.Serialization; // in System.Web.Extensions\n\nnamespace StackApps.Tips.ApiDomain\n{\n\n    public static class SimpleDeserializer\n    {\n        private static readonly JavaScriptSerializer Serializer = new JavaScriptSerializer();\n\n\n        public static T Deserialize&lt;T&gt;(string json) where T : new()\n        {\n            return Serializer.Deserialize&lt;T&gt;(json);\n        }\n\n\n        public static T GetResponse&lt;T&gt;(HttpWebRequest request) where T : new()\n        {\n            using (var response = request.GetResponse())\n            {\n                using (var stream = response.GetResponseStream())\n                {\n                    using (var reader = new StreamReader(stream))\n                    {\n                        string json = reader.ReadToEnd();\n                        return Deserialize&lt;T&gt;(json);\n                    }\n                }\n            }\n        }\n    }\n\n\n    public class UsersResponse\n    {\n        public int page;\n        public int pagesize;\n        public List&lt;User&gt; users;\n        public int total;\n    }\n\n    /// &lt;summary&gt;\n    /// This is a slimmed down User. Add fields \n    /// as you see fit\n    /// &lt;/summary&gt;\n    public class User\n    {\n        public string display_name;\n        public string email_hash;\n        public int reputation;\n        public int user_id;\n        public string user_type;\n    }\n}\n</code></pre>\n\n<h3>Test as Example</h3>\n\n<pre><code>using System;\nusing System.Collections.Generic;\nusing System.Collections.Specialized;\nusing System.Net;\nusing NUnit.Framework;\nusing StackApps.Tips.ApiDomain;\n\nnamespace StackApps.Tips\n{\n    [TestFixture]\n    public class PagedResponseFixture\n    {\n        [Test]\n        public void SimpleTest()\n        {\n            const string yourAPiKey = \"\";\n\n            var myApiRequestPath\n                = new Uri(\"http://api.stackapps.com/0.9/users\");\n\n\n            var users = new List&lt;User&gt;();\n\n            int page = 1;\n            var parameters = new NameValueCollection\n                                 {\n                                     {\"pagesize\", \"100\"},\n                                     {\"page\", page.ToString()},\n                                 };\n\n            HttpWebRequest request\n                = SimpleRequestFactory.Create(myApiRequestPath, parameters, yourAPiKey);\n\n            var response = SimpleDeserializer.GetResponse&lt;UsersResponse&gt;(request);\n\n            while (response.users.Count &gt; 0 &amp;&amp; page &lt; 6)\n            {\n\n                users.AddRange(response.users);\n                page++;\n                parameters[\"page\"] = page.ToString();\n\n                request = SimpleRequestFactory.Create(myApiRequestPath, parameters, yourAPiKey);\n                response = SimpleDeserializer.GetResponse&lt;UsersResponse&gt;(request);\n            }\n\n            Assert.AreEqual(500, users.Count);\n        }\n    }\n}\n</code></pre>\n\n<p><strong>Remember to include the code for <a href=\"http://stackapps.com/questions/890/dev-tip-how-to-call-the-api-in-c-and-silverlight\" rel=\"nofollow\">SimpleRequestFactory</a></strong></p>\n",
      "comments": []
    },
    {
      "tags": [
        "bug"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1367/timeline",
      "question_comments_url": "/questions/1367/comments",
      "question_answers_url": "/questions/1367/answers",
      "question_id": 1367,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281622501,
      "last_activity_date": 1281964390,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 46,
      "score": 2,
      "community_owned": false,
      "title": "/users/{id}/tags - 504 Gateway Timeout",
      "body": "<p>this url is technically valid but generates 504.</p>\n\n<p><a href=\"http://api.stackoverflow.com/1.0/users/242897/tags?filter=c%23&amp;fromdate=0&amp;max=1577836800&amp;min=0&amp;page=1&amp;pagesize=100&amp;sort=Activity&amp;todate=1577836800&amp;key=qgAq_KfDu0KYzlNG-qaTuw\">http://api.stackoverflow.com/1.0/users/242897/tags?filter=c%23&amp;fromdate=0&amp;max=1577836800&amp;min=0&amp;page=1&amp;pagesize=100&amp;sort=Activity&amp;todate=1577836800&amp;key=qgAq_KfDu0KYzlNG-qaTuw</a></p>\n",
      "comments": []
    },
    {
      "tags": [
        "app",
        "dev-tool",
        "silverlight",
        "soapi.cs"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1378,
          "accepted": false,
          "answer_comments_url": "/answers/1378/comments",
          "question_id": 1377,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281685323,
          "last_activity_date": 1281685323,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.Explore (silverlight) - The entire API at your command",
          "body": "<h3>Source</h3>\n\n<p>As an example of how leveraging <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a> and the reusable controls in Soapi.Contrib.Silverlight can increase productivity when writing code against the API, I include the source code for the Soapi.Explore Silverlight application.</p>\n\n<pre><code>//  \n//  Project: SOAPI\n//  http://soapics.codeplex.com\n//  http://stackapps.com/questions/386\n//  \n//  Copyright 2010, Sky Sanders\n//  Licensed under the GPL Version 2 license.\n//  http://soapics.codeplex.com/license\n//  \n//  Date: Aug 12 2010 \n//  API ver 1.0 rev 2010.0709.04\n//  \n\n#region\n\nusing System;\nusing System.Text.RegularExpressions;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Controls;\nusing Amp.Controls.MouseWheel;\nusing Soapi;\nusing Soapi.Contrib.Controls;\nusing Soapi.Domain;\nusing Soapi.Net;\nusing Soapi.Parameters;\nusing Soapi.Routes;\n\n#endregion\n\nnamespace Explore\n{\n    public partial class MainPage\n    {\n        #region Constants\n\n        private const string ApiKey = \"qgAq_KfDu0KYzlNG-qaTuw\";\n\n        #endregion\n\n        #region Fields\n\n        private TextBlock _busyMessage;\n\n        private bool _cancel;\n\n        private Button _cancelButton;\n\n        private ApiContext _context;\n\n        #endregion\n\n        #region Constructors\n\n        public MainPage()\n        {\n            InitializeComponent();\n            InitializeContext();\n        }\n\n        private void InitializeContext()\n        {\n            BusyIndicator.IsBusy = true;\n            BusyIndicator.DisplayAfter = new TimeSpan(0, 0, 0, 0, 500);\n            ScrollViewerMouseWheelSupport.Initialize(this);\n            AccordionScroller.AddMouseWheelSupport();\n            JsonOutputScroller.AddMouseWheelSupport();\n            RequestCache.Instance.DefaultDuration = new TimeSpan(0, 0, 0, 1);\n            _context = new ApiContext(ApiKey);\n            _context.Initialized += ContextInitialized;\n\n\n            _context.Initialize(true);\n        }\n\n        void ContextInitialized(object sender, EventArgs e)\n        {\n            Dispatcher.BeginInvoke(() =&gt;\n                {\n                    SitesComboBox.ItemsSource = _context.Sites;\n                    SitesComboBox.SelectedIndex = 0;\n\n                    // this is a total hack. need to use mvvm light and a command pattern.\n\n                    WireUpRouteControl(AnswersById);\n                    WireUpRouteControl(AnswersByIdComments);\n                    WireUpRouteControl(Badges);\n                    WireUpRouteControl(BadgesById);\n                    WireUpRouteControl(BadgesName);\n                    WireUpRouteControl(BadgesTags);\n                    WireUpRouteControl(CommentsById);\n                    WireUpRouteControl(PostsByIdComments);\n                    WireUpRouteControl(Questions);\n                    WireUpRouteControl(QuestionsById);\n                    WireUpRouteControl(QuestionsByIdAnswers);\n                    WireUpRouteControl(QuestionsByIdComments);\n                    WireUpRouteControl(QuestionsByIdTimeline);\n                    WireUpRouteControl(QuestionsUnanswered);\n                    WireUpRouteControl(RevisionsById);\n                    WireUpRouteControl(RevisionsByIdByRevisionGuid);\n                    WireUpRouteControl(Search);\n                    WireUpRouteControl(Stats);\n                    WireUpRouteControl(Tags);\n                    WireUpRouteControl(Users);\n                    WireUpRouteControl(UsersById);\n                    WireUpRouteControl(UsersByIdAnswers);\n                    WireUpRouteControl(UsersByIdBadges);\n                    WireUpRouteControl(UsersByIdComments);\n                    WireUpRouteControl(UsersByIdCommentsTo);\n                    WireUpRouteControl(UsersByIdFavorites);\n                    WireUpRouteControl(UsersByIdMentioned);\n                    WireUpRouteControl(UsersByIdQuestions);\n                    WireUpRouteControl(UsersByIdReputation);\n                    WireUpRouteControl(UsersByIdTags);\n                    WireUpRouteControl(UsersByIdTimeline);\n                    WireUpRouteControl(UsersModerators);\n                    WireUpRouteControl(Sites);\n                    WireUpRouteControl(UsersByIdAssociated);\n                    BusyIndicator.IsBusy = false;\n                });\n        }\n\n        #endregion\n\n        #region Private Methods\n\n        private void BusyMessageLoaded(object sender, RoutedEventArgs e)\n        {\n            _busyMessage = (TextBlock)sender;\n        }\n\n        private void CancelButtonClick(object sender, RoutedEventArgs e)\n        {\n            _cancel = true;\n            _cancelButton.IsEnabled = false;\n        }\n\n        private void CancelButtonLoaded(object sender, RoutedEventArgs e)\n        {\n            _cancelButton = (Button)sender;\n        }\n\n        private void SetJsonText(string value, bool scroll)\n        {\n            JsonOutput.Text += value;\n            if (scroll)\n            {\n\n                try\n                {\n                    JsonOutput.SelectionStart = JsonOutput.Text.LastIndexOf(Environment.NewLine);\n                    JsonOutput.SelectionStart = JsonOutput.Text.LastIndexOf(Environment.NewLine, JsonOutput.SelectionStart);\n                    JsonOutput.SelectionLength = 0;\n                }\n                catch\n                {\n                }\n            }\n\n        }\n        private void SetUrl(IRoute route)\n        {\n            var url = Regex.Replace(route.RequestUri.AbsoluteUri, @\"(\\?|&amp;)key=\" + ApiKey, \"\");\n            QueryUrl.Content = url;\n            QueryUrl.NavigateUri = new Uri(url);\n        }\n\n        private void WireUpRouteControl(ParametersControl ctrl)\n        {\n\n\n            ctrl.ExecuteQuery += (s, e) =&gt;\n                {\n\n                    IParameter parameters = ctrl.Parameters;\n                    try\n                    {\n                        parameters.Validate();\n                    }\n                    catch (Exception ex)\n                    {\n                        Dispatcher.BeginInvoke(() =&gt;\n                            MessageBox.Show(ex.Message));\n\n                        return;\n                    }\n\n                    var site = ((Site)SitesComboBox.SelectedItem);\n                    var route = site.RouteFactory.GetRouteByPath(ctrl.Route);\n                    route.Parameters = parameters;\n                    var pagedRoute = route as IPagedRoute;\n                    if (pagedRoute != null)\n                    {\n\n                        var pageParameters = (IPageParameter)parameters;\n                        if (pageParameters.PageCount &lt; 1 || pageParameters.PageCount &gt; 9)\n                        {\n                            var result =\n                                MessageBox.Show(\n                                    \"Large result sets may be hard for your browser to handle.\\r\\nAre you sure you want to continue?\"\n                                    +\"\\r\\n\\r\\nNote: I am working on a virtualized textbox\\r\\nthat will relieve this issue.\"\n                                    , \"Large Result Warning\", MessageBoxButton.OKCancel);\n                            if (result == MessageBoxResult.Cancel)\n                            {\n                                return;\n                            }\n                        }\n\n                    }\n\n\n                    Dispatcher.BeginInvoke(() =&gt;\n                        {\n                            _cancelButton.IsEnabled = true;\n                            BusyIndicator.IsBusy = true;\n                            _busyMessage.Text = String.Format(\"Initializing request\");\n                            JsonOutput.Text = string.Empty;\n                        });\n\n\n\n                    ThreadPool.QueueUserWorkItem(ignored =&gt;\n                        {\n\n                            if (pagedRoute != null)\n                            {\n                                pagedRoute.PageRecieved += (ss, ee) =&gt;\n                                    {\n                                        Dispatcher.BeginInvoke(() =&gt;\n                                            {\n                                                _busyMessage.Text = String.Format(\"Fetched Page {0} of {1}\", ee.CurrentPage, ee.TotalPages);\n                                                string value = \"\\r\\n\" + ee.Result.ResponseText;\n\n                                                SetJsonText(value, false);\n                                                SetUrl(route);\n                                            });\n                                        ee.Cancel = _cancel;\n                                    };\n                            }\n                            try\n                            {\n#pragma warning disable 168\n                                // need this to build structured response\n                                var response = route.GetResponse();\n#pragma warning restore 168\n                                // todo - structured output of response\n                                if (pagedRoute == null)\n                                {\n                                    Dispatcher.BeginInvoke(() =&gt;\n                                        {\n                                            SetJsonText(route.ResponseText, false);\n                                            SetUrl(route);\n                                        });\n                                }\n                            }\n                            catch (Exception ex)\n                            {\n                                Dispatcher.BeginInvoke(() =&gt;\n                                    {\n                                        SetJsonText(\"\\r\\n--------------------------------------------------\"\n                                            + \"\\r\\nERROR:\"\n                                            + \"\\r\\n--------------------------------------------------\\r\\n\"\n                                            + ex.Message\n                                            + \"\\r\\n--------------------------------------------------\\r\\n\"\n                                            + ex\n                                            + \"\\r\\n--------------------------------------------------\", true);\n                                        SetUrl(route);\n                                    });\n                            }\n                            finally\n                            {\n                                Dispatcher.BeginInvoke(() =&gt;\n                                    {\n                                        _cancel = false;\n                                        BusyIndicator.IsBusy = false;\n                                    });\n                            }\n                        });\n                };\n        }\n\n        #endregion\n\n    }\n}\n</code></pre>\n",
          "comments": []
        }
      ],
      "favorite_count": 2,
      "question_timeline_url": "/questions/1377/timeline",
      "question_comments_url": "/questions/1377/comments",
      "question_answers_url": "/questions/1377/answers",
      "question_id": 1377,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281685045,
      "last_edit_date": 1281955994,
      "last_activity_date": 1281955994,
      "up_vote_count": 5,
      "down_vote_count": 0,
      "view_count": 539,
      "score": 5,
      "community_owned": false,
      "title": "Soapi.Explore (silverlight) - The entire API at your command",
      "body": "<h2><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a></h2>\n\n<p><img src=\"http://img541.imageshack.us/img541/592/soapiexploresilverlight.png\" alt=\"alt text\"></p>\n\n<h2>About</h2>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> is a Silverlight based annotated test harness for the Stack Exchange API. All API methods and parameters are fully supported.</p>\n\n<h3>Features:</h3>\n\n<ul>\n<li>Sites are updated automatically - you may query any site in the Stack Exchange network.</li>\n<li>Includes StackAuth support</li>\n<li>All parameters are documented in tooltips and are validated.</li>\n<li>Min/Max parameters are properly typed for the chosen Sort</li>\n<li>Multi-Page results are fully supported.</li>\n<li>JSON output may be copied to the clipboard.<sup><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">1</a></sup></li>\n<li><em>coming soon</em> structured data output that is sortable, filterable and exportable.</li>\n</ul>\n\n<p><sub><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">1</a> In order to deal with large datasets, a custom virtualized listbox is used to display the JSON. You may not select text to copy but may press <kbd>ctrl</kbd>+<kbd>c</kbd> to copy the entire result to the clipboard.</sub></p>\n\n<h3>Known Issues</h3>\n\n<ul>\n<li>Silverlight, when accessing the API, does not have the ability to detect error details. All API errors will be reported in the JSON output as 'Not Found'.</li>\n</ul>\n\n<h3>License</h3>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> is free to use and is licensed under GPL V2.</p>\n\n<h3>Download</h3>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> is hosted at <a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">http://soapi.info/explore.aspx</a></p>\n\n<h3>Platform</h3>\n\n<p>Any platform/browser that supports Silverlight 3. This includes Windows and MacOS.</p>\n\n<p>A Windows Phone 7 version will be forthcoming.</p>\n\n<h2>Contact</h2>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> was created by <a href=\"http://stackapps.com/users/14/code-poet\">code poet</a>.</p>\n\n<h2>Code</h2>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> was written in C# 3.0 using Visual Studio 2008 and Expression Blend as a sample reference implementation for the <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a> client library. </p>\n\n<p>Full source code for <a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> is found in the samples folder of the <a href=\"http://stackapps.com/questions/386/\">Soapi.CS</a> source code.</p>\n\n<p><a href=\"http://soapi.info/explore.aspx\" rel=\"nofollow\">Soapi.Explore SL</a> is the logical extension of the JavaScript application <a href=\"http://stackapps.com/questions/603/\">SOAPI-EXPLORE</a>, which is dynamically generated from the API meta data.</p>\n\n<p>The difference is that the JS version is a sanity check tool that reflects the current state of the API, whatever that may be, and this Silverlight application is finely tuned to the API version 1.0 as published.</p>\n",
      "comments": [
        {
          "comment_id": 3580,
          "creation_date": 1281686790,
          "owner": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1377,
          "post_type": "question",
          "score": 0,
          "body": "Could you please stop to post awesome software?"
        },
        {
          "comment_id": 3581,
          "creation_date": 1281687546,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 51,
            "user_type": "registered",
            "display_name": "systempuntoout",
            "reputation": 6905,
            "email_hash": "0db359dc9dcb63067f6d7c8ad856e019"
          },
          "post_id": 1377,
          "post_type": "question",
          "score": 0,
          "body": "@system - sorry, just doing what i do. (thanks for the compliment)"
        },
        {
          "comment_id": 3582,
          "creation_date": 1281688380,
          "owner": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1377,
          "post_type": "question",
          "score": 0,
          "body": "Minor typo in the title <code>s&#47;Soap&#47;Soapi</code> (sorry, just doing what <i>I</i> do)."
        },
        {
          "comment_id": 3583,
          "creation_date": 1281688766,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 171,
            "user_type": "registered",
            "display_name": "Dennis Williamson",
            "reputation": 650,
            "email_hash": "a85af5779b78386bc17a9532a5126ecb"
          },
          "post_id": 1377,
          "post_type": "question",
          "score": 0,
          "body": "@dennis - i expect no less"
        },
        {
          "comment_id": 3753,
          "creation_date": 1282516557,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1377,
          "post_type": "question",
          "score": 0,
          "body": "Finally got around to firing up Windows - looks very nice! +1"
        }
      ]
    },
    {
      "tags": [
        "libraries"
      ],
      "answer_count": 3,
      "answers": [
        {
          "answer_id": 700,
          "accepted": false,
          "answer_comments_url": "/answers/700/comments",
          "question_id": 666,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "creation_date": 1276498669,
          "last_activity_date": 1276498669,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "BOUNTY: Build an app with Soapi.JS and gain praise and adulation. And some rep.",
          "body": "<p>I was going to write this as a comment, but it got too long:</p>\n\n<p>I've got about 50% of the way through my JS app using your wrapper, but I'm heading back to work after some extended leave and there's no way I'm going to get it finished. That said, what I used worked great, only one suggestion, it would be great if the requests could be synchronous (rather than a-sync), because then when queuing up multiple requests to the same method you don't need to create a watcher.</p>\n\n<p>E.G. I wanted to retrieve 5 individual questions, mixing and matching them from different sites. So:</p>\n\n<pre><code>for (var x=0;x&lt;sitedata.length;x++){\n    var soapi = new  Soapi.RouteFactory(sitedata[x][0], apiKey);\n    var q = soapi.QuestionsById(sitedata[x][1]);\n    q.getResponse(function success(data) {\n         //.....\n    })\n}\n</code></pre>\n\n<p>then needs a <code>setInterval</code> to detect when all the responses have come back (increasing a progress meter along the way). Not a huge thing, probably won't upset too many people, but I found myself constantly creating watchers to then fire another function.</p>\n\n<p>Apart from that, I applaud a job well done and I look forward to your 30\" monitor winning application (although in my opinion you'll be hard pressed to beat <a href=\"http://stackapps.com/questions/623/six-to-eight-an-iphone-client\" rel=\"nofollow\">Six to Eight</a> - if it gets released before the cutoff date).</p>\n",
          "comments": [
            {
              "comment_id": 1308,
              "creation_date": 1276499931,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 0,
              "body": "Hey, the rest of us haven&#39;t given up on the monitor either :)"
            },
            {
              "comment_id": 1309,
              "creation_date": 1276503207,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 1,
              "body": "Aside from the obvious dark pit of hades into which I would be thrown if I were able to implement a blocking call in JS, how to implement a blocking call in a jsonp wrapper is not immediately apparent to me. The api calls are made via jsonp, injected script tags, not XMLHttpRequest. Do you have any ideas?  I have implemented a viable blocking call in the silverlight version, but then I have threads and am able to force the call to be made on a thread other than the UI thread. No such animal in regards to browsers (workers in chrome) in general distribution any time in the near future."
            },
            {
              "comment_id": 1312,
              "creation_date": 1276510345,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 0,
              "body": "And I typically chain calls that would otherwise be suited to be run synchronously. e.g. make the next call from within the success function. With a little imagination and a flag or two this can serve such a purpose. And as far as a queue goes, I have an implementation somewhere in my qunit code. I will try to dig it up."
            },
            {
              "comment_id": 1323,
              "creation_date": 1276532690,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 0,
              "body": "Writing a blocking jsonp call seems like it shouldn&#39;t even be possible :)"
            },
            {
              "comment_id": 1356,
              "creation_date": 1276554024,
              "owner": {
                "user_id": 816,
                "user_type": "registered",
                "display_name": "Mark Henderson",
                "reputation": 2498,
                "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@code, as usual everything you&#39;ve said sounds right... I was just too late into the design of my application to change it to one of the methods you mentioned. I didn&#39;t really put much thought into the idea to be honest, but I can see the problem that this is faced. I guess the answer is &quot;no - next time design your app to use the library properly&quot; ;)"
            },
            {
              "comment_id": 1453,
              "creation_date": 1276666336,
              "owner": {
                "user_id": 816,
                "user_type": "registered",
                "display_name": "Mark Henderson",
                "reputation": 2498,
                "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
              },
              "post_id": 700,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "Can someone -1 this just so that it sits at the bottom of the list and doesn&#39;t get the bounty"
            }
          ]
        },
        {
          "answer_id": 712,
          "accepted": false,
          "answer_comments_url": "/answers/712/comments",
          "question_id": 666,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1276561076,
          "last_edit_date": 1276893435,
          "last_activity_date": 1276893435,
          "up_vote_count": 0,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 0,
          "community_owned": false,
          "title": "BOUNTY: Build an app with Soapi.JS and gain praise and adulation. And some rep.",
          "body": "<p><strike><strong>This will eventually turn into the entry for my app.</strong></strike> <em>It didn't! See my other answer.</em></p>\n\n<p><em>Support: the page at <a href=\"http://stackoverflow.quickmediasolutions.com/stackad/\" rel=\"nofollow\">http://stackoverflow.quickmediasolutions.com/stackad/</a> is having some trouble pulling answers.</em></p>\n\n<pre><code>// an url built with soapi-explore...\n\n// http://api.meta.stackoverflow.com/0.8/questions/53346/answers?body=true&amp;min=6&amp;order=asc&amp;sort=votes\n\n// can be easily translated to Soapi.JS..\n\nnew Soapi.RouteFactory('api.meta.stackoverflow.com', '')\n.QuestionsByIdAnswers(53346).applyParameters({\n    body: true,\n    min: 6,\n    order: 'asc',\n    sort: 'votes'\n}).getResponse(\nfunction success(data) {\n    alert(data.answers[0].score);\n},\nfunction error(err) {\n    alert(err.message);\n});\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 1362,
              "creation_date": 1276562215,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "george, i already addressed this - you are trying to query an &#39;answer&#39; source with a question id. try 53466, which is an answer id to see what I mean. AnswersById gets answers specifically requested.  If you want all of the answers to a specific question, use QuestionsById or QuestionsByIdAnswers"
            },
            {
              "comment_id": 1363,
              "creation_date": 1276562513,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "and to answer your other question, yes, the api supports (but does not properly document) the ability to all of the answers for a specific question with a score of 6 or higher.  Here is the raw url, <a href=\"http://api.meta.stackoverflow.com/0.8/questions/53346/answers?body=true&amp;min=6&amp;order=asc&amp;sort=votes\" title=\"questions\">api.meta.stackoverflow.com/0.8/questions/53346/&hellip;</a> I will leave it to you to translate that into soapi.JS. (hint, the soapi was generated directly from the api)"
            },
            {
              "comment_id": 1365,
              "creation_date": 1276562678,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "And did I mention that I spend a LOT of time in soapi-explore. You don&#39;t use visual studio so soapi-explore can save you a lot of time with the parameter tooltip documentation. you can build requests and test them, see the results, and then very easily translate the url in to soapi.JS"
            },
            {
              "comment_id": 1366,
              "creation_date": 1276562788,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: I <b>changed</b> my code to <i>QuestionsByIdAnswers</i> already. It <b>still</b> doesn&#39;t work."
            },
            {
              "comment_id": 1367,
              "creation_date": 1276562877,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "And I am having trouble translating API calls to SOAPI calls, though I&#39;m starting to get the hang of it now."
            },
            {
              "comment_id": 1368,
              "creation_date": 1276564951,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@george - this is what you are looking for."
            },
            {
              "comment_id": 1369,
              "creation_date": 1276565701,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: This? What is &quot;this?&quot;"
            },
            {
              "comment_id": 1370,
              "creation_date": 1276565849,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "what? you want me to write your code and then post it in comments? ;-) work with me dude."
            },
            {
              "comment_id": 1371,
              "creation_date": 1276566460,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Of course not, it&#39;s just that I have no idea where the problem even <i>is</i> - once we can find it, I can probably fix it no problem."
            },
            {
              "comment_id": 1372,
              "creation_date": 1276566736,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "<b>Never mind.</b> I didn&#39;t see that you edited my answer :)"
            },
            {
              "comment_id": 1417,
              "creation_date": 1276638945,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 4,
              "body": "@code: I have copied your code verbatim and I get: Uncaught TypeError: Cannot set property &#39;apiVersion&#39; of undefined.\nUncaught TypeError: Object [object Object] has no method &#39;QuestionsByIdAnswers&#39;"
            },
            {
              "comment_id": 1418,
              "creation_date": 1276639375,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@george - the api had some drama last night. check <a href=\"http://twitter.com/soapiwatch\" rel=\"nofollow\">twitter.com/soapiwatch</a> and <a href=\"http://twitter.com/soapigen\" rel=\"nofollow\">twitter.com/soapigen</a> and then download new js files from <a href=\"http://soapi.info/Services/CodeGeneration.aspx\" rel=\"nofollow\">soapi.info/Services/CodeGeneration.aspx</a> - I suggest that if you want to write code against an evolving beta api that you take advantage of the notification and discovery tools i have provided on <a href=\"http://soapi.info\" rel=\"nofollow\">soapi.info</a>.  You gotta keep up, dude. ;-)"
            },
            {
              "comment_id": 1419,
              "creation_date": 1276639721,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "Also - you will probably the reason you cannot find <code>apiVersion</code> on stats is that there is no member of that name. try <code>api_version</code>. Ok? If you have questions about a member of the api in it&#39;s running state look @ <a href=\"http://soapi.info/Services/Watch.aspx\" rel=\"nofollow\">soapi.info/Services/Watch.aspx</a> and see if you can figure it out."
            },
            {
              "comment_id": 1420,
              "creation_date": 1276639818,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "And whatever you copied likely wasn&#39;t mine. or wasn&#39;t copied verbatim."
            },
            {
              "comment_id": 1421,
              "creation_date": 1276640648,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@code: I know. My mobile client went crazy last night too and I had a feeling in the back of my mind that that&#39;s why your code wasn&#39;t working either. As for copying code, I just copied and pasted what you edited into my question above. Well, I&#39;ll get the new versions of the files and see what I can do."
            },
            {
              "comment_id": 1423,
              "creation_date": 1276640856,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Okay. I just updated the &#39;Soapi.Generated.js&#39; file to the latest version on your site. Still have the same problems :("
            },
            {
              "comment_id": 1426,
              "creation_date": 1276643465,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "I just clicked on the url in your answer, <a href=\"http://stackoverflow.quickmediasolutions.com/stackad/\" rel=\"nofollow\">stackoverflow.quickmediasolutions.com/stackad</a> , and I get an alert of &#39;9&#39; - seems to be working. and disregard my snide remark about apiVersion above, I misread the comment. I don&#39;t know why you are not getting a valid instance of RouteFactory but your online example is working just fine. Use it as a point of reference."
            },
            {
              "comment_id": 1427,
              "creation_date": 1276643618,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "edit_count": 2,
              "body": "@code: Don&#39;t worry about it :) I guess the problem is with Google Chrome on Linux (my browser). Let me try it in Firefox. <b>Edit:</b> Yup, it works :P <i>I wonder why it doesn&#39;t work in Chrome...</i>"
            },
            {
              "comment_id": 1428,
              "creation_date": 1276644588,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@works in chrome on windows. sounds like the soapi.generated.js code is not being executed properly. it builds the routemaps at runtime from metadata. I will fire up my linux test farm later tonight and give it a once over."
            },
            {
              "comment_id": 1429,
              "creation_date": 1276644757,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Sorry for all of the trouble. Guess it was my browser all this time :) Hopefully you can figure out what the problem is quickly. I&#39;ll work with Firefox in the meantime."
            },
            {
              "comment_id": 1434,
              "creation_date": 1276651794,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Hey! Guess what - when I include the jQuery library directly before Soapi.js, it works in Chrome! Weird."
            },
            {
              "comment_id": 1435,
              "creation_date": 1276652531,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "yeah, that is weird. i consciously write unobtrusive code. there should be NO conflicts with jquery. in any case, that tidbit will be added as a troubleshooting note in the documentation when it gets generated."
            },
            {
              "comment_id": 1440,
              "creation_date": 1276655179,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 712,
              "post_type": "answer",
              "score": 0,
              "body": "@code: I think I&#39;m going to start a new answer for my app now :) These comments would detract from it anyway."
            }
          ]
        },
        {
          "answer_id": 742,
          "accepted": true,
          "answer_comments_url": "/answers/742/comments",
          "question_id": 666,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1276655238,
          "last_edit_date": 1277101449,
          "last_activity_date": 1277101449,
          "up_vote_count": 5,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 5,
          "community_owned": false,
          "title": "BOUNTY: Build an app with Soapi.JS and gain praise and adulation. And some rep.",
          "body": "<p><a href=\"http://stackapps.com/questions/741/stackad-an-easy-way-to-display-open-source-ads-on-your-site-blog\" rel=\"nofollow\">Here</a> is my entry. It basically allows you to embed the open-source ads from Meta in your blog, etc.</p>\n\n<p>It is simply a .js file you can include on the page.</p>\n\n<hr>\n\n<p><strong>My evaluation:</strong> Soapi.js is a <em>very</em> intuitive library for JavaScript. And by that, I mean the methods are laid out in a way that you would expect them to be. The whole thing is relatively self-documenting and integrates well with my above-mentioned application. I especially like the fact that API changes don't require a huge code rewrite - only a quick download!</p>\n",
          "comments": [
            {
              "comment_id": 1444,
              "creation_date": 1276657440,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "not that you have much competition but you should probably link to this answer from your announcement and beg for votes here as that will determine who picks up the check when the bounty expires. (I will not click check unless there are not enough votes (3 i think) for the site to pick the winner)"
            },
            {
              "comment_id": 1445,
              "creation_date": 1276657989,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 1,
              "edit_count": 1,
              "body": "@code: <b>Don&#39;t let the site pick!</b> If you do, only half the bounty gets awarded. You will just have to pick it yourself."
            },
            {
              "comment_id": 1447,
              "creation_date": 1276658903,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "ahhh, i did not consider that. looks like i have to pick. good catch"
            },
            {
              "comment_id": 1590,
              "creation_date": 1276991934,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@code: The bounty ends tomorrow, so please don&#39;t forget to accept my answer!"
            },
            {
              "comment_id": 1640,
              "creation_date": 1277068341,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "no worries. i will cut the check @ 0:0:0 mountain time."
            },
            {
              "comment_id": 1661,
              "creation_date": 1277091180,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@geo - if you add a brief <i>honest</i> evaluation of soapi.js to this answer i will break all the rules and cut the check early! ;-)"
            },
            {
              "comment_id": 1666,
              "creation_date": 1277101311,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@code: Sorry, got to this late - I&#39;ll write one now. <b>Update:</b> There, wrote one."
            },
            {
              "comment_id": 1667,
              "creation_date": 1277102287,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "@code: In addition, did you see <a href=\"http://stackoverflow.quickmediasolutions.com/stackad/fancy.html\" rel=\"nofollow\">this</a> page that I also made with Soapi.js? Vote for it <a href=\"http://stackapps.com/questions/796/stackad-scroller\">here</a>."
            },
            {
              "comment_id": 1668,
              "creation_date": 1277104892,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "ding ding ding, winna winna big chicken dinna! for the record, now that the heated contest is concluded, this is exactly what I was looking for, a short sweet app written in a matter of hours leveraging  the library. thanks for playing geo. r.e. votes-done and done."
            },
            {
              "comment_id": 1669,
              "creation_date": 1277105327,
              "owner": {
                "user_id": 40,
                "user_type": "registered",
                "display_name": "YOU",
                "reputation": 4512,
                "email_hash": "60528117a57acd11354faa44c70742cf"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "btw, @code, the bounty system has changed and now you have to click <b>350</b> button on the answer you chosen. just accepting it won&#39;t work."
            },
            {
              "comment_id": 1670,
              "creation_date": 1277105528,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Ya, he&#39;s right."
            },
            {
              "comment_id": 1671,
              "creation_date": 1277107758,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@smark et.al hmmm, guess i need to pull myself away from apps and visit meta every once in a while. thanks"
            },
            {
              "comment_id": 1673,
              "creation_date": 1277107845,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Actually it was on the blog :)"
            },
            {
              "comment_id": 1687,
              "creation_date": 1277153270,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@code: Uhm... according to the question above, I get a mention on Soapi.info?"
            },
            {
              "comment_id": 1690,
              "creation_date": 1277170319,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "i have not had a chance to push changes to the site. i have to sleep <i>sometime</i>. it is coming in tonight&#39;s push."
            },
            {
              "comment_id": 1978,
              "creation_date": 1277513351,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "reply_to_user": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 1,
              "body": "@Geo - your soapi apps are linked from soapi.info. thanks for participating and good work."
            },
            {
              "comment_id": 1979,
              "creation_date": 1277513430,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 742,
              "post_type": "answer",
              "score": 0,
              "body": "@code: No problem. Thanks for keeping up to date with the new API version number changes."
            }
          ]
        }
      ],
      "accepted_answer_id": 742,
      "favorite_count": 0,
      "bounty_amount": 350,
      "question_timeline_url": "/questions/666/timeline",
      "question_comments_url": "/questions/666/comments",
      "question_answers_url": "/questions/666/answers",
      "question_id": 666,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1276327934,
      "last_edit_date": 1281852910,
      "last_activity_date": 1281852910,
      "up_vote_count": 3,
      "down_vote_count": 0,
      "view_count": 444,
      "score": 3,
      "community_owned": false,
      "title": "BOUNTY: Build an app with Soapi.JS and gain praise and adulation. And some rep.",
      "body": "<h2>Bounty Contest:</h2>\n\n<p>Build anything using the <a href=\"http://stackapps.com/questions/494/soapi-js-easy-to-use-fluent-javascript-wrapper-for-the-stackoverflow-api\" rel=\"nofollow\">Soapi.JS</a> JavaScript wrapper and either post the code or a link to a live demo.</p>\n\n<p>When the question gets old enough (7 days I think) I will click 'start a bounty' and offer up 300 points. Add the 50 bonus points that the site tacks on and the answer with the most votes when the bounty expires picks up a cool <strong>350</strong> rep and a link from <a href=\"http://soapi.info\" rel=\"nofollow\">http://soapi.info</a>.</p>\n\n<p>Use whatever tools and libraries float your boat, jquery, mootools, dojo etc, but interaction with the API must be driven by <a href=\"http://stackapps.com/questions/494/soapi-js-easy-to-use-fluent-javascript-wrapper-for-the-stackoverflow-api\" rel=\"nofollow\">Soapi.JS</a>.</p>\n\n<p>Good luck and may the most ridiculous app win. ;-)</p>\n\n<p><strong>NOTE</strong> Time allowing, I will be happy to answer <em>any</em> questions about the library and help out with code if you get stuck. Simply post an answer describing your problem and any relevant code.</p>\n",
      "comments": [
        {
          "comment_id": 1202,
          "creation_date": 1276329557,
          "owner": {
            "user_id": 816,
            "user_type": "registered",
            "display_name": "Mark Henderson",
            "reputation": 2498,
            "email_hash": "3fe1ab2f3897d8e3931c5b297c29e994"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 1,
          "body": "I was planning on playing with the soapi.js library in the next few days anyway, so this is some added incentive ;)"
        },
        {
          "comment_id": 1214,
          "creation_date": 1276372830,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Sounds like a challenge to me! I will begin planning something."
        },
        {
          "comment_id": 1329,
          "creation_date": 1276537626,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "@smark - no worries dude. Now I see. I am going to delete my FRIST! that makes me look like a complete idiot now. thanks for the heads up, we can delete these comments if you like... unless you want to look like you are talking to your self ;p"
        },
        {
          "comment_id": 1343,
          "creation_date": 1276544768,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@george, 53346 is a question, I can only assume that you are looking for answer your answer - try 53466. <a href=\"http://soapi.info/code/js/stable/soapi-explore-beta.htm\" rel=\"nofollow\">soapi.info/code/js/stable/soapi-explore-beta.htm</a> is a good tool for building queries and examining the expected results."
        },
        {
          "comment_id": 1347,
          "creation_date": 1276546335,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@george - something to consider: <a href=\"http://stackapps.com/questions/707/api-help-suggestion-answers-id-summary-incorrect\" title=\"api help suggestion answers id summary incorrect\">stackapps.com/questions/707/&hellip;</a> . r.e. your last question, soapi is a complete and faithful rendering of the so api. If the api exposes a method to do what you are asking then soapi provides a route and parameters to do the same. when in doubt use soapi-explore."
        },
        {
          "comment_id": 1358,
          "creation_date": 1276554375,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@George - start an answer and describe what you are trying to do and how you are getting stuck. and please delete all the support comments. comments are not a good place for support dialog as the &#39;comment&#39; comments get buried."
        },
        {
          "comment_id": 1381,
          "creation_date": 1276585567,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@code: Deleted the comments now."
        },
        {
          "comment_id": 3664,
          "creation_date": 1281852937,
          "owner": {
            "user_id": 4,
            "user_type": "moderator",
            "display_name": "Jeff Atwood",
            "reputation": 750,
            "email_hash": "51d623f33f8b83095db84ff35e15dbe8"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "please don&#39;t tag things [library] unless they are actually library entries. This is a contest of some sort."
        },
        {
          "comment_id": 3671,
          "creation_date": 1281899261,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@code: Congrats on the &quot;Most Entries&quot; prize - you deserved it!"
        },
        {
          "comment_id": 3672,
          "creation_date": 1281899653,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 666,
          "post_type": "question",
          "score": 0,
          "body": "@geo - same to you."
        }
      ]
    },
    {
      "tags": [
        "bug",
        "status-completed"
      ],
      "answer_count": 1,
      "answers": [
        {
          "answer_id": 1119,
          "accepted": true,
          "answer_comments_url": "/answers/1119/comments",
          "question_id": 904,
          "owner": {
            "user_id": 2,
            "user_type": "moderator",
            "display_name": "Kevin Montrose",
            "reputation": 15776,
            "email_hash": "0c0f8a17fe71547f718e013591008017"
          },
          "creation_date": 1279237326,
          "last_activity_date": 1279237326,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "/questions/{id}/timeline throwing 500 instead of 404",
          "body": "<p>Indeed, this has been fixed for a while.</p>\n\n<p>My bad.</p>\n",
          "comments": []
        }
      ],
      "accepted_answer_id": 1119,
      "favorite_count": 0,
      "question_timeline_url": "/questions/904/timeline",
      "question_comments_url": "/questions/904/comments",
      "question_answers_url": "/questions/904/answers",
      "question_id": 904,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1277604088,
      "last_edit_date": 1279237559,
      "last_activity_date": 1281832012,
      "up_vote_count": 1,
      "down_vote_count": 0,
      "view_count": 80,
      "score": 1,
      "community_owned": false,
      "title": "/questions/{id}/timeline throwing 500 instead of 404",
      "body": "<p><strong>Kevin, you fixed this bug some time ago, would you like to tag it as status-complete?</strong></p>\n\n<p>Sometime last week, this route stopped throwing 404 like the rest of my 'bad id' tests and started throwing 500.  It seems to be the odd man out.</p>\n\n<pre>\nSoapi.ApiException : A generic error has occurred on the server; developers have been notified.\nStatusCode:InternalServerError\nUrl:http://api.stackoverflow.com/0.9/questions/2147483647/timeline\n  ----> System.Net.WebException : The remote server returned an error: (500) Internal Server Error.\n</pre>\n",
      "comments": []
    },
    {
      "tags": [
        "discussion",
        "dev-tip"
      ],
      "answer_count": 8,
      "answers": [
        {
          "answer_id": 1016,
          "accepted": false,
          "answer_comments_url": "/answers/1016/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 1189,
            "user_type": "registered",
            "display_name": "Chase Florell",
            "reputation": 141,
            "email_hash": "b3d89a508a9f98b52633193292ae91b1"
          },
          "creation_date": 1278343739,
          "last_activity_date": 1278343739,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>Here's a quick and dirty way of how I did mine in .NET</p>\n\n<p>Visual Basic</p>\n\n<pre><code>    Public Shared Function GetReputation(ByVal input As Integer) As String\n\n        Dim _input As String = input.ToString\n        Select Case input\n            Case Is &gt; 99999 : Return _input.Remove(_input.Length - 3) &amp; \"k\"\n            Case Is &gt; 9999 : Return Math.Round(Double.Parse(input / 1000), 1).ToString &amp; \"k\"\n            Case Is &gt; 999 : Return String.Format(\"{0:N0}\", input)\n            Case Else : Return _input\n        End Select\n    End Function\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 2408,
              "creation_date": 1278345057,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1016,
              "post_type": "answer",
              "score": 1,
              "body": "+ this is what I would like to see - implementations in various languages. thanks"
            }
          ]
        },
        {
          "answer_id": 1019,
          "accepted": false,
          "answer_comments_url": "/answers/1019/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 209,
            "user_type": "registered",
            "display_name": "CMS",
            "reputation": 141,
            "email_hash": "932fb89b9d4049cec5cba357bf0ae388"
          },
          "creation_date": 1278348844,
          "last_edit_date": 1281821969,
          "last_activity_date": 1281821969,
          "up_vote_count": 4,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 4,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>Here you go, another JavaScript approach, originally posted on <a href=\"http://stackoverflow.com/questions/3177855/how-to-format-numbers-similar-to-stack-overflow-reputation-format/3177985#3177985\">SO</a>:</p>\n\n<pre><code>function getRepString (rep) {\n\n  rep = rep+''; // coerce to string\n\n  if (rep &lt; 1000) { // return the same number\n    return rep; \n  }\n\n  if (rep &lt; 10000) { // place a comma between\n\n    return rep.charAt(0) + ',' + rep.substring(1);\n  } \n\n  // divide and format\n  return (rep/1000).toFixed(rep % 1000 != 0)+'k';\n\n}\n</code></pre>\n\n<p>Check the output results <a href=\"http://jsbin.com/ivebo3/2\" rel=\"nofollow\">here</a>.</p>\n",
          "comments": [
            {
              "comment_id": 2414,
              "creation_date": 1278349222,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1019,
              "post_type": "answer",
              "score": 3,
              "edit_count": 1,
              "body": "+ for you. this is <i>the</i> way to do it in JS. I have removed the JS tag, so there is no &#39;right&#39; answer now, just an x-language implementation free for all. Thanks for schooling me."
            },
            {
              "comment_id": 2473,
              "creation_date": 1278470345,
              "owner": {
                "user_id": 113,
                "user_type": "registered",
                "display_name": "Igor Zevaka",
                "reputation": 375,
                "email_hash": "fecb84f9ad278f1afa3c57981eba50f3"
              },
              "post_id": 1019,
              "post_type": "answer",
              "score": 0,
              "body": "Using this one now, had a convoluted algorithm for the <code>rep &lt; 10000</code> case."
            }
          ]
        },
        {
          "answer_id": 1027,
          "accepted": false,
          "answer_comments_url": "/answers/1027/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 9,
            "user_type": "registered",
            "display_name": "Bill the Lizard",
            "reputation": 2830,
            "email_hash": "fc763c6ff6c160ddad05741e87e517b6"
          },
          "creation_date": 1278432129,
          "last_activity_date": 1278432129,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>Here's a Java implementation using <a href=\"http://java.sun.com/j2se/1.5.0/docs/api/java/text/NumberFormat.html\" rel=\"nofollow\">NumberFormat</a>.</p>\n\n<pre><code>public static void main(String[] args) {\n\n    int[] values = { 999, 1000, 9999, 10000, 10100 };\n\n    for( int rep : values ) {\n        System.out.println( formatRep(rep) );\n    }\n}\n\npublic static String formatRep(int rep) {\n    if(rep &lt; 1000) {\n        return rep + \"\";\n    }\n    if(rep &lt; 10000) {\n        NumberFormat formatter = new DecimalFormat(\"#,###\");\n        return formatter.format(rep);\n    }\n    else {\n        NumberFormat formatter = new DecimalFormat(\"#,###.#k\");\n        double d = rep / 1000.0;\n        return formatter.format(d);\n    }\n}\n</code></pre>\n\n<p>Output:</p>\n\n<blockquote>\n  <p>999<br>\n  1,000<br>\n  9,999<br>\n  10k<br>\n  10.1k  </p>\n</blockquote>\n\n<p>I'm not sure about that last format for numbers greater than 999k.  I guess we have a few years to wait and see.  :)</p>\n",
          "comments": [
            {
              "comment_id": 2446,
              "creation_date": 1278432223,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1027,
              "post_type": "answer",
              "score": 2,
              "body": "++ proxy thanks from java dudes, which i am not."
            }
          ]
        },
        {
          "answer_id": 1035,
          "accepted": false,
          "answer_comments_url": "/answers/1035/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "creation_date": 1278482380,
          "last_activity_date": 1278482380,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>Good ole' PHP:</p>\n\n<pre><code>// Any number larger than 1000 gets returned like '4.5k'\n\nfunction Numberify($num)\n{\n    if($num &gt; 1000)\n        return (floor($num / 100) / 10) . 'k';\n    return $num\n}\n</code></pre>\n\n<p><em>Do you like the name of the function? :)</em></p>\n",
          "comments": [
            {
              "comment_id": 2664,
              "creation_date": 1278790717,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1035,
              "post_type": "answer",
              "score": 0,
              "body": "+ thanks for contributing."
            },
            {
              "comment_id": 2666,
              "creation_date": 1278793539,
              "owner": {
                "user_id": 18,
                "user_type": "moderator",
                "display_name": "Nathan Osman",
                "reputation": 18281,
                "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1035,
              "post_type": "answer",
              "score": 0,
              "body": "@code: I really need a sensible name for the function... any ideas?"
            },
            {
              "comment_id": 2667,
              "creation_date": 1278794027,
              "owner": {
                "user_id": 1031,
                "user_type": "registered",
                "display_name": "Thomas McDonald",
                "reputation": 794,
                "email_hash": "24cd55ab1a62ffb113ab8c02f64c9301"
              },
              "post_id": 1035,
              "post_type": "answer",
              "score": 1,
              "body": "makeanumberstackoverflowystyle"
            },
            {
              "comment_id": 2668,
              "creation_date": 1278798949,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1035,
              "post_type": "answer",
              "score": 0,
              "edit_count": 1,
              "body": "i am using <code>formatNumber</code> for lack of a better term. no need to be more explicit as the dev will be calling it as a member of your SO client library so context can be assumed."
            },
            {
              "comment_id": 2777,
              "creation_date": 1279205642,
              "owner": {
                "user_id": 1189,
                "user_type": "registered",
                "display_name": "Chase Florell",
                "reputation": 141,
                "email_hash": "b3d89a508a9f98b52633193292ae91b1"
              },
              "post_id": 1035,
              "post_type": "answer",
              "score": 0,
              "body": "you&#39;re missing a few conversions.  Numbers between 1000 and 9999 are formatted to look like <code>1,000</code>, numbers between 10000 and 99999 are formatted to look like <code>10.4k</code>, and finally what your method does is for numbers greater than 100000."
            }
          ]
        },
        {
          "answer_id": 1084,
          "accepted": false,
          "answer_comments_url": "/answers/1084/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 11,
            "user_type": "registered",
            "display_name": "lfoust",
            "reputation": 5785,
            "email_hash": "44a71cbfdb672befcb01b103a05b4c79"
          },
          "creation_date": 1278787435,
          "last_activity_date": 1278787435,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>Just for completeness, here is the C# version I am using ported from the VB version given by @rockinthesixstring:</p>\n\n<pre><code>private string FormatReputation(int reputation)\n{\n     string s = reputation.ToString();\n     if (reputation &gt; 99999)\n         return s.Remove(s.Length - 3) + \"k\";\n     else if (reputation &gt; 9999)\n         return Math.Round((double)reputation / (double)1000, 1).ToString() + \"k\";\n     else if (reputation &gt; 999)\n         return String.Format(\"{0:N0}\", reputation);\n     return s;\n}\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 2665,
              "creation_date": 1278790738,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1084,
              "post_type": "answer",
              "score": 0,
              "body": "+ thanks for contributing."
            }
          ]
        },
        {
          "answer_id": 1386,
          "accepted": false,
          "answer_comments_url": "/answers/1386/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281790468,
          "last_edit_date": 1281828906,
          "last_activity_date": 1281828906,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<h2>c#</h2>\n\n<p>Rounds up - same same SO.</p>\n\n<pre><code>public string FormatReputation(int value)\n{\n    var rep = System.Convert.ToDouble(value);\n\n    if (rep &lt; 10000)\n    {\n        return rep.ToString(\"N0\");\n    }\n\n    return (rep / 1000)\n         .ToString(rep % 1000 == 0 ? \"\" : \"F1\") + 'k';\n}\n</code></pre>\n\n<ul>\n<li>100   => \"100\"</li>\n<li>1200  => \"1,200\"</li>\n<li>9999  => \"9,999\"</li>\n<li>10000 => \"10k\"</li>\n<li>10200 => \"10.2k\"</li>\n</ul>\n\n<p>confirmation as per jjng's comment</p>\n\n<ul>\n<li>10999 => \"11k\"</li>\n<li>12452 => \"12.5k\"</li>\n</ul>\n",
          "comments": []
        },
        {
          "answer_id": 1388,
          "accepted": false,
          "answer_comments_url": "/answers/1388/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 570,
            "user_type": "registered",
            "display_name": "Lucas Jones",
            "reputation": 921,
            "email_hash": "7af33908a4aa18412430e704ca6c1253"
          },
          "creation_date": 1281806151,
          "last_edit_date": 1281828234,
          "last_activity_date": 1281828234,
          "up_vote_count": 2,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 2,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p>These are great feature ideas - thanks for the tips!</p>\n\n<p>I've more or less converted CMS' answer to Python:</p>\n\n<pre><code>class FormattedReputation(int):\n    def format(rep):\n        \"\"\"Formats the reputation score like it is formatted on the sites. Heavily based on CMS' JavaScript implementation at\n        http://stackapps.com/questions/1012/how-to-format-reputation-numbers-similar-to-stack-exchange-sites/1019#1019\"\"\"\n        str_rep = str(rep)\n\n        if rep &lt; 1000:\n            return str_rep\n        elif rep &lt; 10000:\n            return '%s,%s' % (str_rep[0], str_rep[1:])\n        elif rep % 1000 == 0:\n            return '%dk' % (rep / 1000.0)\n        else:\n            return '%.1fk' % (rep / 1000.0)\n</code></pre>\n\n<p>This is used automatically as an alternative to <code>int</code> for reputation fields in Py-StackExchange, so using it on its own is slightly awkward:</p>\n\n<pre>\nlucas@ubuntu:~/projects/py-stackexchange$ python -i se_inter.py\n>>> FormattedReputation(100).format()\n'100'\n>>> FormattedReputation(1000).format()\n'1,000'\n>>> FormattedReputation(1240).format()\n'1,240'\n>>> FormattedReputation(12403).format()\n'12.4k'\n>>> FormattedReputation(100000).format()\n'100k'\n</pre>\n",
          "comments": [
            {
              "comment_id": 3644,
              "creation_date": 1281823662,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1388,
              "post_type": "answer",
              "score": 0,
              "body": "Thanks for that. you might include some test runs, both for your edification and others."
            },
            {
              "comment_id": 3659,
              "creation_date": 1281828405,
              "owner": {
                "user_id": 570,
                "user_type": "registered",
                "display_name": "Lucas Jones",
                "reputation": 921,
                "email_hash": "7af33908a4aa18412430e704ca6c1253"
              },
              "post_id": 1388,
              "post_type": "answer",
              "score": 0,
              "body": "Do you mean like that?"
            }
          ]
        },
        {
          "answer_id": 1392,
          "accepted": false,
          "answer_comments_url": "/answers/1392/comments",
          "question_id": 1012,
          "owner": {
            "user_id": 1695,
            "user_type": "registered",
            "display_name": "Brock Woolf",
            "reputation": 131,
            "email_hash": "c521c11562c3540db79eca1cd632bd5e"
          },
          "creation_date": 1281822995,
          "last_edit_date": 1281825069,
          "last_activity_date": 1281825069,
          "up_vote_count": 3,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 3,
          "community_owned": false,
          "title": "How to format reputation numbers similar to Stack Exchange sites.",
          "body": "<p><strong>Objective-C:</strong></p>\n\n<p>This should work on <code>iOS 3.2</code>, <code>iOS 4.0</code> and <code>Mac OS X 10.4 - 10.6</code> :</p>\n\n<p>I don't have multiple returns because I like a single exit point in my code. Hence I use my trusty friend <code>returnable</code>.</p>\n\n<pre><code>- (NSString*) stringForReputationFormatted:(NSNumber*)reputation\n{\n    NSString *returnable = nil;\n    long rep = [reputation longValue];\n    NSString *returnable = nil;\n\n    if (rep &lt; 1000) {\n        returnable = [reputation stringValue];\n    }\n    else if (rep &lt; 10000) {\n        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];\n        [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];\n        returnable = [numberFormatter stringForObjectValue:reputation];\n        [numberFormatter release];\n    }\n    else {\n        NSString *repStr    = [reputation stringValue];\n        NSString *whole     = [repStr substringToIndex:[repStr length]-3];\n        NSString *decimal   = [repStr substringWithRange:NSMakeRange([repStr length]-3, 1)];\n        if ([decimal intValue] != 0) {\n            returnable = [whole stringByAppendingFormat:@\".%@K\", decimal];\n        } else {\n            returnable = [whole stringByAppendingFormat:@\"K\"];\n        }\n    }\n    return returnable;\n}\n</code></pre>\n\n<p><strong>Edit:</strong> Apologies for the code being so long. <code>NSDateFormatter</code> isn't working right on iOS atm, so I needed to format the string manually.</p>\n\n<p><strong>Tests to confirm:</strong></p>\n\n<pre><code>Raw:-1 Converted:-1\nRaw:0 Converted:0\nRaw:1 Converted:1\nRaw:2 Converted:2\nRaw:10 Converted:10\nRaw:100 Converted:100\nRaw:101 Converted:101\nRaw:999 Converted:999\nRaw:1000 Converted:1,000\nRaw:1001 Converted:1,001\nRaw:3500 Converted:3,500\nRaw:6790 Converted:6,790\nRaw:8900 Converted:8,900\nRaw:9999 Converted:9,999\nRaw:10000 Converted:10K\nRaw:10099 Converted:10K\nRaw:10500 Converted:10.5K\nRaw:11600 Converted:11.6K\nRaw:10799 Converted:10.7K\nRaw:99899 Converted:99.8K\nRaw:195999 Converted:195.9K\n</code></pre>\n",
          "comments": [
            {
              "comment_id": 3643,
              "creation_date": 1281823598,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 1,
              "edit_count": 1,
              "body": "Thanks for that. here, let me buy you some points...."
            },
            {
              "comment_id": 3645,
              "creation_date": 1281823690,
              "owner": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "reply_to_user": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "@code poet: gracious!"
            },
            {
              "comment_id": 3646,
              "creation_date": 1281823998,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "Well, this isn&#39;t 100% the same as SO.  <code>Raw:10799 Converted:10.7K\n</code> should actually be <code>10.8K</code>.  SO rounds up."
            },
            {
              "comment_id": 3648,
              "creation_date": 1281824122,
              "owner": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "edit_count": 6,
              "body": "@jinguy: Looks like i&#39;m not the only one rounding down though. Do you have a link as to where it says it rounds up?"
            },
            {
              "comment_id": 3650,
              "creation_date": 1281824296,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 1,
              "body": "@Brock, no.  I believe everyone does it wrong.  Everyone is simply truncating.  It really doesn&#39;t matter that much though..."
            },
            {
              "comment_id": 3651,
              "creation_date": 1281824379,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "See this example: <a href=\"http://stackoverflow.com/users/21632/adam-bellaire\">stackoverflow.com/users/21632/adam-bellaire</a>"
            },
            {
              "comment_id": 3652,
              "creation_date": 1281824460,
              "owner": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "@jinguy: Okay, well I thought you shouldn&#39;t be displaying for example: <code>10K</code> UNTIL you have actually reached it. Seems like a false reading to round up."
            },
            {
              "comment_id": 3653,
              "creation_date": 1281824531,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "@Brock, I believe 9999 does show as 9,999.  It&#39;s just when you get into th2 5 digits that the rounding kicks in."
            },
            {
              "comment_id": 3654,
              "creation_date": 1281824713,
              "owner": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "@jinguy: Fair enough, I&#39;m going to round down for my SO app though :)"
            },
            {
              "comment_id": 3655,
              "creation_date": 1281824839,
              "owner": {
                "user_id": 39,
                "user_type": "registered",
                "display_name": "jjnguy",
                "reputation": 2876,
                "email_hash": "d787caaf04b85641692a24099fcee990"
              },
              "reply_to_user": {
                "user_id": 1695,
                "user_type": "registered",
                "display_name": "Brock Woolf",
                "reputation": 131,
                "email_hash": "c521c11562c3540db79eca1cd632bd5e"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "@brock, yeah.  I would do it the easy way too.  That&#39;s how we do it in StackWrap4J."
            },
            {
              "comment_id": 3657,
              "creation_date": 1281826935,
              "owner": {
                "user_id": 14,
                "user_type": "registered",
                "display_name": "Sky Sanders",
                "reputation": 10056,
                "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
              },
              "post_id": 1392,
              "post_type": "answer",
              "score": 0,
              "body": "<a href=\"http://stackapps.com/questions/1012/how-to-format-reputation-numbers-similar-to-stack-exchange-sites/1386#1386\" title=\"how to format reputation numbers similar to stack exchange sites\">stackapps.com/questions/1012/&hellip;</a> rounds up as expected."
            }
          ]
        }
      ],
      "favorite_count": 3,
      "question_timeline_url": "/questions/1012/timeline",
      "question_comments_url": "/questions/1012/comments",
      "question_answers_url": "/questions/1012/answers",
      "question_id": 1012,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1278314511,
      "last_edit_date": 1278789556,
      "last_activity_date": 1281828906,
      "up_vote_count": 2,
      "down_vote_count": 0,
      "view_count": 517,
      "score": 2,
      "community_owned": true,
      "title": "How to format reputation numbers similar to Stack Exchange sites.",
      "body": "<p><strong>UPDATE</strong></p>\n\n<p>For JavaScript, see CMS's implementation below. It is much more elegant than the one i provide in the body of this Q.</p>\n\n<hr>\n\n<p><strike>\n    // formats a number similar to the way stack exchange sites \n    // format reputation. e.g.\n    // for numbers&lt; 10000 the output is '9,999'\n    // for numbers > 10000 the output is '10k' with one decimal place when needed\n    function getRepString(rep)\n    {\n        var repString;</p>\n\n<pre><code>    if (rep &lt; 1000)\n    {\n        repString = rep;\n    }\n    else if (rep &lt; 10000)\n    {\n        var mod = rep % 1000;\n\n        repString = ((rep - mod) / 1000)\n        + \",\"\n        + ('000' + mod.toString()).slice(-3);\n    }\n    else\n    {\n        repString = (rep / 1000).toFixed(1).replace(\".0\", \"\") + \"k\";\n    }\n\n    return repString.toString();\n}\n</code></pre>\n\n<p></strike></p>\n\n<p><strong>Output:</strong></p>\n\n<ul>\n<li><code>getRepString(999)</code> == '999'</li>\n<li><code>getRepString(1000)</code> == '1,000'</li>\n<li><code>getRepString(9999)</code> == '9,999'</li>\n<li><code>getRepString(10000)</code> == '10k'</li>\n<li><code>getRepString(10100)</code> == '10.1k'</li>\n</ul>\n\n<p>Post an implementation in the language of your choice.</p>\n",
      "comments": [
        {
          "comment_id": 2402,
          "creation_date": 1278321889,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "a more elegant implementation is heading our way... i hope."
        },
        {
          "comment_id": 2404,
          "creation_date": 1278325206,
          "owner": {
            "user_id": 542,
            "user_type": "registered",
            "display_name": "JonB",
            "reputation": 121,
            "email_hash": "378d75d023244c5ad80c6c663c66e148"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "You mean one that we don&#39;t have to manually do? Surely thats the whole point of giving us the &quot;raw&quot; score? We can format it how we like."
        },
        {
          "comment_id": 2407,
          "creation_date": 1278345022,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 542,
            "user_type": "registered",
            "display_name": "JonB",
            "reputation": 121,
            "email_hash": "378d75d023244c5ad80c6c663c66e148"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "@jonb - no, i mean that someone showed me a more elegant way to do this and i encouraged him to post it here and hope he does, otherwise I am going to have to post it myself.  and, yes, raw data is appropriate for an api return, but i as well as others, in various languages, wish to present this information in a  more friendly format. that is what this post is about."
        },
        {
          "comment_id": 3647,
          "creation_date": 1281824099,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "It looks like most of the implementations here are slightly off.  Numbers like 10999 would show as 11k.  Also 12452 would be 12.5k.  SO rounds up."
        },
        {
          "comment_id": 3656,
          "creation_date": 1281825478,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "reply_to_user": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "@jjn - so what you are saying is that the examples shown truncate instead of round up as SO does? I can&#39;t speak for any but <a href=\"http://stackapps.com/questions/1012/how-to-format-reputation-numbers-similar-to-stack-exchange-sites/1386#1386\" title=\"how to format reputation numbers similar to stack exchange sites\">stackapps.com/questions/1012/&hellip;</a> which performs as desired."
        },
        {
          "comment_id": 3658,
          "creation_date": 1281826993,
          "owner": {
            "user_id": 39,
            "user_type": "registered",
            "display_name": "jjnguy",
            "reputation": 2876,
            "email_hash": "d787caaf04b85641692a24099fcee990"
          },
          "reply_to_user": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "post_id": 1012,
          "post_type": "question",
          "score": 0,
          "body": "@Code, Yeah.  I didn&#39;t test out any of them, but it looks liek a bunch of them truncate instead of rounding."
        }
      ]
    },
    {
      "tags": [
        "support"
      ],
      "answer_count": 0,
      "answers": [],
      "favorite_count": 0,
      "question_timeline_url": "/questions/1368/timeline",
      "question_comments_url": "/questions/1368/comments",
      "question_answers_url": "/questions/1368/answers",
      "question_id": 1368,
      "owner": {
        "user_id": 14,
        "user_type": "registered",
        "display_name": "Sky Sanders",
        "reputation": 10056,
        "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
      },
      "creation_date": 1281623575,
      "last_activity_date": 1281623575,
      "up_vote_count": 6,
      "down_vote_count": 0,
      "view_count": 99,
      "score": 6,
      "community_owned": false,
      "title": "suggest add favicon.ico to api endpoints",
      "body": "<p>It will reduce 404 entries in your logs and in our browser based fiddler results.</p>\n\n<p>Cheap, easy, fast.</p>\n\n<pre><code>GET /favicon.ico HTTP/1.1\nAccept: */*\nAccept-Encoding: gzip, deflate\nUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Tablet PC 2.0; .NET4.0C; .NET4.0E)\nHost: api.stackoverflow.com\nConnection: Keep-Alive\n\n\nHTTP/1.1 404 Not Found\nServer: nginx\nDate: Thu, 12 Aug 2010 14:30:13 GMT\nContent-Type: text/html; charset=us-ascii\nTransfer-Encoding: chunked\nConnection: keep-alive\nContent-Encoding: gzip\n\nfc\n?\n</code></pre>\n",
      "comments": [
        {
          "comment_id": 3567,
          "creation_date": 1281632364,
          "owner": {
            "user_id": 18,
            "user_type": "moderator",
            "display_name": "Nathan Osman",
            "reputation": 18281,
            "email_hash": "bba8a1d044a8309d5f9b562ddd3b8bef"
          },
          "post_id": 1368,
          "post_type": "question",
          "score": 0,
          "edit_count": 1,
          "body": "Hmmm... that&#39;s seems like a good reason. +1"
        }
      ]
    },
    {
      "tags": [
        "app",
        "silverlight",
        "soapi.cs"
      ],
      "answer_count": 2,
      "answers": [
        {
          "answer_id": 1345,
          "accepted": false,
          "answer_comments_url": "/answers/1345/comments",
          "question_id": 1344,
          "owner": {
            "user_id": 14,
            "user_type": "registered",
            "display_name": "Sky Sanders",
            "reputation": 10056,
            "email_hash": "df4a7fbd8a054fd6193ca0ee62952f1f"
          },
          "creation_date": 1281446087,
          "last_edit_date": 1281455208,
          "last_activity_date": 1281455208,
          "up_vote_count": 1,
          "down_vote_count": 0,
          "view_count": 0,
          "score": 1,
          "community_owned": false,
          "title": "Soapi.FindUser (silverlight) Quickly find any user anywhere in the Stackiverse!",
          "body": "<h3>Source Code:</h3>\n\n<p>As is the case with any application written using Soapi for api access, the code needed to get the data you want from the API is the least amount of code you have to write and by far the easiest to understand.</p>\n\n<p>Here is the source code for single page of the application. (There are several helper classes like value converters to format dates, but they are not relevant)</p>\n\n<pre><code>//  \n//  Project: SOAPI\n//  http://soapics.codeplex.com\n//  http://stackapps.com/questions/386\n//  \n//  Copyright 2010, Sky Sanders\n//  Licensed under the GPL Version 2 license.\n//  http://soapics.codeplex.com/license\n//  \n//  Date: Aug 08 2010 \n//  API ver 1.0 rev 2010.0709.04\n//  \n\n#region\n\nusing System;\nusing System.Collections.Generic;\nusing System.Collections.ObjectModel;\nusing System.Linq;\nusing System.Threading;\nusing System.Windows;\nusing System.Windows.Browser;\nusing System.Windows.Controls;\nusing Soapi;\nusing Soapi.Domain;\nusing Soapi.Net;\nusing Soapi.Parameters;\n\n#endregion\n\nnamespace FindUser\n{\n    public partial class MainPage\n    {\n        #region Constants\n\n        private const string ApiKey = \"qgAq_KfDu0KYzlNG-qaTuw\";\n\n        #endregion\n\n        #region Fields\n\n        private readonly ApiContext _context;\n\n        private ObservableCollection&lt;SiteListItem&gt; _sitesToSearch;\n\n        #endregion\n\n        #region Constructors\n\n        public MainPage()\n        {\n            InitializeComponent();\n            SearchButton.IsEnabled = false;\n            FuqqinBusyIndicator.IsBusy = true;\n            FuqqinBusyIndicator.BusyContent = \"Initializing\";\n            RequestCache.Instance.DefaultDuration = new TimeSpan(0, 0, 0, 1);\n\n            // set up an ApiContext\n\n            _context = new ApiContext(ApiKey);\n            _context.Initialized += (e, s) =&gt; Dispatcher.BeginInvoke(() =&gt;\n       