<p>Tracks is designed to be integrated with scripts, web services, and third-party applications. This page serves as the documentation of our REST API.</p>
<h2>Tracks REST API</h2>
<p>The Tracks REST API allows developers to integrate Tracks into their applications. It allows applications to access and modify Tracks data, and is implemented as Vanilla XML over HTTP.</p>
<p>The API is a <a href="http://en.wikipedia.org/wiki/REST">RESTful</a> service. All data is available through the API as a resource to which can be referred using a unique identifier. It responds to a number of the HTTP methods, specifically GET, PUT, POST and UPDATE, and all responses from the API are in a simple XML format encoded as UTF-8.</p>
<h2>Authentication</h2>
<p>Authentication is handled using <a href="http://en.wikipedia.org/wiki/Basic_authentication">Basic HTTP authentication</a>. Your Tracks username and password is used as the authentication credentials for the API. Note that in Basic HTTP authentication, your password is sent in clear text. If you need a more secure authentication solution, you should configure your web server to run Tracks under HTTPS.</p>
<h2>Retrieving data from the API</h2>
<p>To retrieve data you only need to do an HTTP GET on a resource identifier. For example, if you want to get all the contexts with <a href="http://en.wikipedia.org/wiki/CURL">cURL</a>:</p>
<p>You also can apply the pattern shown above with projects instead of contexts.</p>
<p>All data is available according to the following resource paths:</p>
<ul>
<li>/todos.xml</li>
<li>/todos/<code>ID</code>.xml</li>
<li>/contexts.xml</li>
<li>/contexts/<code>ID</code>.xml</li>
<li>/contexts/<code>ID</code>/todos.xml</li>
<li>/projects.xml</li>
<li>/projects/<code>ID</code>.xml</li>
<li>/projects/<code>ID</code>/todos.xml</li>
</ul>
<h2>Writing to the API</h2>
<p>The API provides mechanisms for adding, updating and deleting resources using the HTTP methods <code>PUT</code>, <code>POST</code> and <code>DELETE</code> in combination with the content.</p>
<p>Creating a new project, using curl:</p>
<pre>
<code>
$ curl -u username:p4ssw0rd \
-d "project[name]=Build a treehouse for the kids" \
<%= home_url %>projects.xml -i
>> HTTP/1.1 201 Created
Location: <%= home_url %>projects/65.xml
...
</code>
</pre>
<p>The response is an <code>HTTP/1.1 201 Created</code> with <code>Location</code> header indicating where the new project resource can be found. Now we can add a todo to this project, using curl:</p>
<pre>
<code>
$ curl -u username:p4ssw0rd \
-d "todo[description]=Model treehouse in SketchUp&todo[context_id]=2&todo[project_id]=65" \
<%= home_url %>todos.xml -i
>> HTTP/1.1 201 Created
Location: <%= home_url %>todos/452.xml
...
</code>
</pre>
<p>The response is a again an <code>HTTP/1.1 201 Created</code> with <code>Location</code> header indicating where the new todo resource can be found. Changing the todo notes, again using curl:</p>
<pre>
<code>
$ curl -u username:p4ssw0rd -X PUT \
-d "todo[notes]=use maple texture" \
<%= home_url %>todos/452.xml -i
>> HTTP/1.1 200 OK
...
<?xml version="1.0" encoding="UTF-8"?>
<todo>
...
<description>Model treehouse in SketchUp</description>
<notes>use maple texture</notes>
...
</todo>
</code>
</pre>
<p>The response is an <code>HTTP/1.1 200 OK</code> with in the body the XML representation of the updated todo. We provide a shorcut method to toggle a todo done or undone without having to perform the update with the right field values:</p>
<p>If we want to delete that todo we can call its unique resource identifier (the URL) with the HTTP method <code>DELETE</code>, again with curl:</p>
<pre>
<code>
$ curl -u username:p4ssw0rd -X DELETE \
<%= home_url %>todos/452.xml -i
>> HTTP/1.1 200 OK
...
</code>
</pre>
<p>The API returns an <code>HTTP/1.1 200 OK</code> and the todo is now deleted.</p>
<h2>Dealing with the response and response status</h2>
<p>All successful operations respond with a status code of <code>200 OK</code> or <code>201 Created</code> depending on the operation. Sometimes a list, say <code>GET /contexts/2/todos.xml</code> will not have any items, it will return an empty list.</p>
<p>The XML for empty list responses look like this, again with curl:</p>
<p><a href="http://weblog.rubyonrails.org/2007/9/30/rails-2-0-0-preview-release">ActiveResource</a> is a thin but powerful wrapper around RESTful services exposed by <a href="http://www.rubyonrails.org">Ruby on Rails</a>. It will be part of Rails 2.0 but until then you can get it with <code>gem install activeresource --source http://gems.rubyonrails.org --include-dependencies</code>.</p>
<pre>
<code>
$ script/console
Loading development environment (Rails 1.2.4)
>> class Context < ActiveResource::Base; end
<p>Inspired by <a href="http://www.37signals.com">37 Signals</a> ’s Highrise wrapper, we’ve put together a small ruby wrapper (find it in the doc/ directory) for the API which sets up the ActiveResource models for you to play with in an IRB session:</p>