To get an index of all to-dos on a list, see to-do lists.
Per Project:
GET /projects/1/todos.jsonshows a list of all to-dos for this project; completed and remaining.GET /projects/1/todos/completed.jsonshows a list of all completed to-dos for this project.GET /projects/1/todos/remaining.jsonshows a list of all remaining/active to-dos for this project.GET /projects/1/todos.json?due_since=2014-07-10will return all the to-dos due after the date specified.
Per To-do List:
GET /projects/1/todolists/1/todos.jsonshows a list of all to-dos for this to-do list; completed and remaining.GET /projects/1/todolists/1/todos/completed.jsonshows a list of all completed to-dos for this to-do list.GET /projects/1/todolists/1/todos/remaining.jsonshows a list of all remaining to-dos for this to-do list.GET /projects/1/todolists/1/todos/trashed.jsonshows a list of all trashed to-dos for this to-do list.
[
{
"id": 1,
"todolist_id": 1000,
"position": 1,
"content": "Test it",
"due_at": null,
"due_on": null,
"created_at": "2012-03-24T09:53:35-05:00",
"updated_at": "2012-03-24T10:56:33-05:00",
"completed_at": false,
"comments_count": 1,
"private": false,
"trashed": false,
"creator": {
"id": 127326141,
"name": "David Heinemeier Hansson",
"avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/avatar.96.gif?r=3",
"fullsize_avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/original.gif?r=3"
},
"assignee": {
"id": 149087659,
"type": "Person",
"name": "Jason Fried"
},
"completed": false,
"url": "http://37s.bcx.dev/999999999/api/v1/projects/605816632/todos/1.json",
"app_url": "http://37s.bcx.dev/999999999/projects/605816632/todos/1",
"todolist": {
"completed": false,
"completed_count": 1,
"created_at": "2012-03-24T09:53:35-05:00",
"creator": {
"id": 127326141,
"name": "David Heinemeier Hansson",
"avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/avatar.96.gif?r=3",
"fullsize_avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/original.gif?r=3"
},
"description": "What we will do next",
"id": 1000,
"name": "Launch list",
"position": 3,
"private": false,
"remaining_count": 2,
"trashed": false,
"created_at": "2012-03-24T09:53:35-05:00",
"url": "http://37s.bcx.dev/735644780/api/v1/projects/605816632/todolists/1.json",
"app_url": "https://basecamp.com/999999999/projects/605816632/todolists/1"
}
},
{
"id": 2,
"todolist_id": 1000,
"position": 2,
"content": "Test it",
"due_at": null,
"due_on": null,
"created_at": "2012-03-24T09:53:35-05:00",
"updated_at": "2012-03-24T10:56:33-05:00",
"completed_at": false,
"comments_count": 0,
"private": false,
"trashed": false,
"creator": {
"id": 127326141,
"name": "David Heinemeier Hansson",
"avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/avatar.96.gif?r=3",
"fullsize_avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/original.gif?r=3"
},
"assignee": {
"id": 149087659,
"type": "Person",
"name": "Jason Fried"
},
"completed": false,
"url": "http://37s.bcx.dev/999999999/api/v1/projects/605816632/todos/2.json",
"app_url": "http://37s.bcx.dev/999999999/projects/605816632/todos/2",
"todolist": {
"completed": false,
"completed_count": 1,
"created_at": "2012-03-24T09:53:35-05:00",
"creator": {
"id": 127326141,
"name": "David Heinemeier Hansson",
"avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/avatar.96.gif?r=3",
"fullsize_avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/original.gif?r=3"
},
"description": "What we will do next",
"id": 1000,
"name": "Launch list",
"position": 3,
"private": false,
"remaining_count": 2,
"trashed": false,
"created_at": "2012-03-24T09:53:35-05:00",
"url": "http://37s.bcx.dev/735644780/api/v1/projects/605816632/todolists/1.json",
"app_url": "https://basecamp.com/999999999/projects/605816632/todolists/1"
}
}
]GET /projects/1/todos/1.jsonwill return the specified to-do.
{
"id": 1,
"todolist_id": 1000,
"position": 1,
"content": "Test it",
"due_at": null,
"due_on": null,
"created_at": "2012-03-24T09:53:35-05:00",
"updated_at": "2012-03-24T10:56:33-05:00",
"completed_at": false,
"comments_count": 1,
"private": false,
"trashed": false,
"creator": {
"id": 127326141,
"name": "David Heinemeier Hansson",
"avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/avatar.96.gif?r=3",
"fullsize_avatar_url": "https://asset0.37img.com/global/9d2148cb8ed8e2e8ecbc625dd1cbe7691896c7d9/original.gif?r=3"
},
"assignee": {
"id": 149087659,
"type": "Person",
"name": "Jason Fried"
},
"completed": false,
"url": "http://37s.bcx.dev/999999999/api/v1/projects/605816632/todos/1.json",
"app_url": "http://37s.bcx.dev/999999999/projects/605816632/todos/1",
"attachments": [],
"subscribers": [
{
"id": 149087659,
"name": "Jason Fried"
},
{
"id": 127326141,
"name": "David Heinemeier Hansson"
}
]
}POST /projects/1/todolists/1/todos.jsonwill add a new to-do to the specified to-do list from the parameters passed. Thedue_atparameter should be in ISO 8601 format (like "2012-03-27T16:00:00-05:00"). The assignee parameters need atypefield with thePersonspecified. Theidis then the id of the person who was assigned.
{
"content": "This is my new thing!",
"due_at": "2012-03-27",
"assignee": {
"id": 149087659,
"type": "Person"
}
}This will return 201 Created, with the URL of the new to-do in the Location header along with the current JSON representation of the to-do if the creation was a success. See the Get to-do endpoint for more info. If the assignee type is unrecognized or the due_at is in a wrong format, you'll see a 400 Bad Request.
Attaching files to a to-do requires both the token and the name of the attachment. The token is returned from the Create attachments endpoint, which you must hit first before creating an upload.
The name parameter must be a valid filename with an extension. Multiple
attachments are allowed.
{
"content": "This is my new thing!",
"due_at": "2012-03-27",
"assignee": {
"id": 149087659,
"type": "Person"
},
"attachments": [
{
"token": "4f73595a-39a6fd18317b1eeffb9c4734e95a179aa4b1b7c8",
"name": "cover_page.pdf"
},
{
"token": "4f73595f-78efbe63c77a4f5c752ce7d113d0361220f70b69",
"name": "final_draft.pdf"
}
]
}PUT /projects/1/todos/1.jsonwill update the to-do from the parameters passed. Thecompletedfield can be set to eithertrueorfalseto check or uncheck the to-do.
{
"content": "New content thing!",
"due_at": "2012-03-27",
"assignee": {
"id": 149087659,
"type": "Person"
},
"completed": true
}This will return 200 OK if the update was a success along with the current JSON representation of the to-do in the response body. See the Get to-do endpoint for more info. If the assignee type is unrecognized or the due_at is in a wrong format, you'll see a 400 Bad Request.
Sending a payload with assignee set to null will un-assign the to-do, and setting due_at to null will remove the due date.
{
"due_at": null,
"assignee": null
}Updating the position of a to-do is also possible through this endpoint by passing an integer between 1 and n, where n is the number of to-dos in this list.
{
"position": 2
}Note: If the position is out of bounds, the to-do will be moved to the bottom.
DELETE /projects/1/todos/1.jsonwill delete the to-do specified and return204 No Contentif that was successful. If the user does not have access to delete the to-do, you'll see403 Forbidden.
To-dos inherit the privacy of their to-do lists. A to-do on a private to-do list is private. If a to-do list is made private or public, so are all of its to-dos.
Comments on a to-do inherit the privacy of its to-do list. If a to-do list is made public or private, so are all comments on all of its to-dos.