The Breeze API is a REST style API that enables your application or script to access Breeze resources. It is designed to have predictable resource URLs and to use HTTP response codes for errors. JSON is used for all requests and responses from the API.
Accessing the API uses the following URL schema:
https://api.breeze.pm/<resource>
Where resource is the resource you want to access (e.g. projects, cards, todos etc)
For example, getting a list of projects would result in the URL:
curl -u user:pass https://api.breeze.pm/projects.json
To create or update something you also have to include the Content-Type header and the JSON data.
curl -u user:pass \
-H 'Content-Type: application/json' \
-d '{ "name": "New project" }' \
https://api.breeze.pm/projects.json
Breeze API supports HTTP Basic auth and token based authentication.
To get you started with Breeze API you can just use HTTP Basic authentication with your login info.
curl -u username:password https://api.breeze.pm/projects.json
You can also authenticate by providing your API token in the request. The token has to be sent for each request your application makes to the Breeze API. Remember that anyone who has your api token can see and change everything you have access to. Keep it safe! You can manage your API token from your profile.
curl -u 6dasdg782: https://api.breeze.pm/projects.json
You can also pass the api token as a query parameter in the url.
curl https://api.breeze.pm/projects.json?api_token=6dasdg782
If the user is part of multiple teams/organizations then you must add the team ID to every call. You can append it to every call with team_id or add it to the HTTP header HTTP_X_TEAM_ID. You can get all the team IDs from the user endpoint.
curl https://api.breeze.pm/projects.json?api_token=6dasdg782&team_id=5612
We plan to extend and adapt the API to allow access to more resources in the future. If you have special needs for an API, let us know. Write to support@breeze.pm.
GET /projects.json get all active projects
Response
[ { "id": 1, "name": "Testing Breeze", "description": "testing api", "budget_amount": "13322.0", "budget_hours": 111, "hourly_rate": 12, "currency_symbol": "$", "total_planned": 480, "total_tracked": 182, "star": false, "workspace_id": 189, "created_at": "2025-12-13T10:41:28Z", "users": [ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" }, { "id": 6, "email": "jake@breeze.pm", "name": null } ] }, { "id": 2, "name": "Personal tasks", "description": "", "budget_amount": "0.0", "budget_hours": null, "hourly_rate": 0, "currency_symbol": "$", "total_planned": 0, "total_tracked": 0, "star": false, "created_at": "2025-01-11T09:13:29Z", "users": [ { "id": 2, "email": "rene@breeze.pm", "name": "Rene" } ] } ]
GET /projects/1.json get specific project
Response
{ "id": 1, "name": "Testing Breeze", "description": "testing api", "budget_amount": "13322.0", "budget_hours": 111, "hourly_rate": 12, "currency_symbol": "$", "total_planned": 480, "total_tracked": 182, "star": false, "workspace_id": 189, "created_at": "2025-12-13T10:41:28Z", "users": [ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" }, { "id": 6, "email": "jake@breeze.pm", "name": null } ] }
POST /projects.json create a new project
Request
{ "name": "New project", "description": "nww project from api", "budget_amount": "10000.0", "budget_hours": 100, "hourly_rate": 59, "currency_symbol": "$", "workspace_id": 189, "invitees": ["john@breeze.pm","jake@breeze.pm"] }
PUT /projects/:project_id.json update a specific project
Request
{ "name": "New project", "description": "nww project from api", "budget_amount": "10000.0", "budget_hours": 100, "hourly_rate": 59, "currency_symbol": "$", "workspace_id": 189, }
DELETE /projects/:project_id.json delete a specific project
GET /projects/:project_id/archive.json archive a specific project
GET /projects/:project_id/reactivate.json reactivate a specific project
GET /projects/:project_id/people.json get all the project users
Response
[ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" }, { "id": 6, "email": "jake@breeze.pm", "name": null } ]
POST /projects/:project_id/people.json add people to project
Request
{ "invitees": ["john@breeze.pm","jake@breeze.pm"] }
DELETE /projects/:project_id/people/:user_id.json delete a person from project
Projects can belong to one workspace.
GET /workspaces get a list of all workspaces
[ { "id": 1, "name": "Workspace name 1", "position": 1, "created_at": "2025-12-13T10:41:28Z", }, { "id": 2, "name": "Workspace name 2", "position": 2, "created_at": "2025-12-12T10:41:28Z", } ]
GET /workspaces/1.json get a workspace
{ "id": 1, "name": "Workspace name", "position": 1, "created_at": "2025-12-13T10:41:28Z", "projects": [ { "id": 7, "name": "Project 3" }, { "id": 8, "name": "Project 4" } ] }
POST /workspaces.json create a new workspace
Request
{ "name": "Workspace name", }
PUT /workspaces/:workspace_id.json update a specific workspace
{ "name": "Workspace name", }
DELETE /workspaces/:workspace_id.json delete a specific workspace
GET /projects/:project_id/cards.json get all the cards(tasks) for a specific project
{ "archived": false }
Response
[ { "id": 995, "name": "Todo list", "cards": [ { "id": 2742, "name": "This is a task", "description": "Task description", "position": 1, "stage_id": 995, "swimlane_id": 2, "color": "", "duedate": null, "startdate": null, "planned_time": 0, "total_tracked": 2, "todos_count": 5, "done_todos": 1, "created_at": "2025-11-05T06:04:35Z", "updated_at": "2025-02-23T16:39:06Z", "tags": ["tag1","tag2"], "user": { "id": 5, "email": "john@breeze.pm", "name": "John Doe" "avatar": "https://avatarurl.com/avatar.jpg" }, "users": [ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" }, { "id": 6, "email": "jake@breeze.pm", "name": null } ], "todos": [ { "id": 372, "name": "first todo", "done": false }, { "id": 6, "name": "second todo", "done": false } ] , "time_entries": [ { "user_id": 5, "user_email": "rene@breeze.pm", "user_name": Rene, "tracked": 120 } ] }, { "id": 4105, "name": "Update API", "description": null, "position": 2, "stage_id": 995, "color": null, "duedate": null, "startdate": null, "planned_time": 0, "total_tracked": 0, "todos_count": 0, "done_todos": 0, "created_at": "2025-02-23T16:38:54Z", "updated_at": "2025-02-23T16:39:05Z", "users": [], "todos": [], "time_entries": [] "custom_fields": [] }] }, { "id": 993, "name": "Done list", "cards": [ { "id": 3532, "name": "Try out our API", "description": "API is still beta", "position": 1, "stage_id": 993, "color": "", "duedate": "2025-02-22T16:00:00Z", "startdate": "2025-02-20T16:00:00Z", "planned_time": 120, "total_tracked": 60, "todos_count": 1, "done_todos": 0, "created_at": "2025-12-13T10:52:53Z", "updated_at": "2025-02-25T10:12:23Z", "tags": ["tag1","tag2"], "users": [ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" } ], "todos": [], "time_entries": [ { "user_id": 5, "user_email": "rene@breeze.pm", "user_name": "Rene", "tracked": 120 } ], "custom_fields": [ { "name": "Rating", "value": "***" } ] }] } ]
GET /V2/projects/:project_id/cards.json get all the cards(tasks) for a specific project
The respons is paginated 100 items per page. To get the next page append ?page=XX to the query.
{ "archived": false, "only_archived": false, "status": "status name", "hidden": true, "done": true }
Response
Same as V1 except it's a plain array and not grouped by stages.
GET /projects/:project_id/stages/:stage_id/cards.json get all the cards(tasks) for a specific stage
{ "archived": false, "only_archived": false }
Response
Same as "Get cards V2"
GET /projects/:project_id/swimlanes/:swimlane_id/cards.json get all the cards(tasks) for a specific swimlane
{ "archived": false, "only_archived": false }
Response
Same as "Get cards V2"
GET /v2/projects/:project_id/cards.json get all the cards(tasks) created by user
GET /v2/cards.json get all the cards(tasks) created by user in all projects
{ "creator_id": 2 }
Response
Same as "Get cards V2"
GET /v2/projects/:project_id/cards.json get all the cards(tasks) assigned to a user
GET /v2/cards.json get all the cards(tasks) assigned to a user in all projects
{ "assigned_id": 2 }
Response
Same as "Get cards V2"
GET /projects/:project_id/cards/:card_id.json get a specific card(task)
Response
{ "id": 3532, "name": "Try out our API", "description": "API is still beta", "position": 1, "stage_id": 993, "color": "", "duedate": "2025-02-22T16:00:00Z", "startdate": "2025-02-20T16:00:00Z", "planned_time": 120, "total_tracked": 60, "todos_count": 1, "done_todos": 0, "created_at": "2025-12-13T10:52:53Z", "updated_at": "2025-02-25T10:12:23Z", "tags": ["tag1","tag2"], "users": [ { "id": 5, "email": "john@breeze.pm", "name": "John Doe" }, { "id": 6, "email": "jake@breeze.pm", "name": null } ], "todos": [ { "id": 372, "name": "first todo", "done": false }, { "id": 6, "name": "second todo", "done": false } ] , "time_entries": [ { "user_id": 5, "user_email": "rene@breeze.pm", "user_name": Rene, "tracked": 120 } ] }
POST /projects/:project_id/cards.json create a new card
Request
{ "name": "new task from API", "description": "no description", "duedate": "2025-02-22T16:00:00Z", "startdate": "2025-02-20T16:00:00Z", "planned_time": 120, "stage_id": 9, "swimlane_id": 1, "invitees": ["john@breeze.pm","jake@breeze.pm"], "tags": ["tag1","tag2"], "custom_fields": [ { "name": "Rating", "value": "***" } ] }
PUT /projects/:project_id/cards/:card_id.json update a specific card
Request
{ "name": "new task from API", "description": "no description", "duedate": "2025-02-22T16:00:00Z", "startdate": "2025-02-20T16:00:00Z", "planned_time": 120, "stage_id": 9, "new_project_id": 19, "tags": ["tag1","tag2"], "custom_fields": [ { "name": "Rating", "value": "***" } ] }
GET /projects/:project_id/cards/:card_id.json archive a specific card
Request
{ "deleted_at": "2025-05-06" }
DELETE /projects/:project_id/cards/:card_id.json delete a specific card
POST /projects/:project_id/cards/:card_id/move.json move a card
Request
{ "stage_id": 9, "prev_id": 9 }
POST /projects/:project_id/cards/:card_id/people.json assign people to card
Request
{ "invitees": ["john@breeze.pm","jake@breeze.pm"] }
DELETE /projects/:project_id/cards/:card_id/people/:user_id.json remove person from card
GET /projects/:project_id/stages.json get all lists in the project
Response
[ { "id": 31, "name": "Todo", "position": "1", "created_at": "2025-12-12T10:41:28Z", }, { "id": 42, "name": "Doing", "position": "2", "created_at": "2025-12-13T10:41:28Z", } ]
POST /projects/:project_id/stages.json create a new list for the project
{ "name": "todo list" }
PUT /projects/:project_id/stages/:stage_id.json update specific stage for a project
{ "name": "new name text" }
DELETE /projects/:project_id/stages/:stage_id.json delete list from project
PUT /projects/:project_id/stages/:stage_id/move.json move list after previous list
{ "prev_id": 1285 }
Time entries are included in the card get responses, see Cards documentation.
GET /projects/:project_id/cards/:card_id/time_entry.json get all the time entries for the task
Response
[ { "id": 31, "card_id": 23764, "desc": "description", "logged_date": "2025-12-21", "tracked": 120, "user_id": 2, "created_at": "2025-12-12T10:41:28Z" }, { "id": 32, "card_id": 23764, "desc": "description", "logged_date": "2025-12-22", "tracked": 120, "user_id": 2, "created_at": "2025-12-13T10:41:28Z" } ]
Time entries are also included in the card get responses, see Cards documentation.
POST /projects/:project_id/cards/:card_id/time_entry.json create a new time entry for a card, time entry will be added to the current user
{ "tracked": 120 "logged_date": "2025-01-05" "desc": "Description here" }
PUT /projects/:project_id/cards/:card_id/time_entry/:timeentry_id.json update a time entry for a card, time entry will be updated for the current user
{ "tracked": 60 "logged_date": "2025-01-05" "desc": "Description here" }
DELETE /projects/:project_id/cards/:card_id/time_entry/:timeentry_id.json delete time entry from specific card and user
GET /running_timers.json get all the running timers for you team
Response
[ { "id": 6064552, "tracked": null, "user_id": 2, "card_id": 4514238, "created_at": "2025-06-06T11:58:29.140Z", "started": 1749211109091, "desc": null, "logged_date": "2025-06-06", "card": { "name": "New marketing plan" }, "project": { "id": 81, "name": "Marketing" } } ]
All running time entries have started field with timestamp of when the timer was started.
GET /projects/:project_id/swimlanes.json get all swimlanes for a project
[ { "id": 3, "name": "swimlane name", "project_id": 23, "position": 5, "updated_at": "2025-03-01T09:07:43Z", "created_at": "2025-03-01T09:07:43Z" }, { "id": 4, "name": "swimlane name two", "project_id": 23, "position": 5, "updated_at": "2025-03-01T09:07:43Z", "created_at": "2025-03-01T09:07:43Z" } ]
GET /running_timers.json get all the running timers for you team
Response
[ { "id": 31, "card_id": 23764, "desc": "description", "logged_date": "2025-12-21", "tracked": 120, "user_id": 2, "created_at": "2025-12-12T10:41:28Z" }, { "id": 32, "card_id": 23764, "desc": "description", "logged_date": "2025-12-22", "tracked": 120, "user_id": 2, "created_at": "2025-12-13T10:41:28Z" } ]
POST /projects/:project_id/swimlanes.json create a new swimlane for a project
{ "name": "swimlane name", "position": 2 }
PUT /projects/:project_id/swimlanes/:swimlane_id.json update specific swimlane for a project
{ "name": "swimlane namespan", "position": 2 }
DELETE /projects/:project_id/swimlanes/:swimlane_id.json delete a swimlane from project
GET /projects/:project_id/cards/:card_id/comments.json get all comments for a card
[ { "card_id": 4160, "comment": "comment text", "created_at": "2025-03-01T09:07:43Z", "id": 466, "updated_at": "2025-03-01T09:07:43Z", "user_id": 5, "user": { "id": 5, "email": "john@breeze.pm", "name": "John Doe" "avatar": "https://avatarurl.com/avatar.jpg" }, }, { "card_id": 4160, "comment": "second comment text", "created_at": "2025-02-01T08:07:13Z", "id": 467, "updated_at": "2025-02-01T08:07:13Z", "user_id": 5, "user": { "id": 5, "email": "john@breeze.pm", "name": "John Doe" "avatar": "https://avatarurl.com/avatar.jpg" } } ]
POST /projects/:project_id/cards/:card_id/comments.json create a new comment for a card
{ "comment": "comment text" }
PUT /projects/:project_id/cards/:card_id/comments/:comment_id.json update specific comments for a card
{ "comment": "comment text" }
DELETE /projects/:project_id/cards/:card_id/comments/:comment_id.json delete comment from card
GET /projects/:project_id/cards/:card_id/todo_lists.json get all todo lists for a card
[ { "card_id": 4160, "name": "Todo list 1", "created_at": "2025-03-01T09:07:43Z", "id": 369, "updated_at": "2025-03-01T09:07:43Z", "todos": [ { "card_id": 4160, "name": "Todo 1", "done": false, "created_at": "2025-03-01T09:07:43Z", "id": 369, "updated_at": "2025-03-01T09:07:43Z", }, { "card_id": 4160, "done": true, "name": "Todo 2", "created_at": "2025-02-01T08:07:13Z", "id": 370, "updated_at": "2025-02-01T08:07:13Z", } ] }, { "card_id": 4160, "name": "Todo list 2", "created_at": "2025-02-01T08:07:13Z", "id": 370, "updated_at": "2025-02-01T08:07:13Z", "todos": [] } ]
POST /projects/:project_id/cards/:card_id/todo_lists.json create a new todo list for a card
{ "name": "todo list name" }
PUT /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id.json update specific todo list for a card
{ "name": "todo list name" }
DELETE /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id.json delete todo list from a card
GET /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id/todos.json get all todos for a todo list
[ { "card_id": 4160, "name": "Todo 1", "done": false, "created_at": "2025-03-01T09:07:43Z", "id": 369, "updated_at": "2025-03-01T09:07:43Z", }, { "card_id": 4160, "done": true, "name": "Todo 2", "created_at": "2025-02-01T08:07:13Z", "id": 370, "updated_at": "2025-02-01T08:07:13Z", } ]
POST /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id/todos.json create a new todo for a todo list
{ "name": "todo item text", "done": false }
PUT /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id/todos/:todo_id.json update specific todo for a todo list
{ "name": "todo item text", "done": true }
DELETE /projects/:project_id/cards/:card_id/todo_lists/:todo_list_id/todos/:todo_id.json delete todo from todo list
All activity responses are paginated 50 items per page. To get the next page append ?page=XX to the query.
GET /activities.json get all activity entries
[ { "id": 4160, "created_at": "2025-03-01T09:07:43Z", "user": "Jake", "project_id": 1723, "card_id": 324785, "message": "logged <b>9h</b> of work for <a href="https://app.breeze.pm/projects/4186-name-the-project/cards/71399-asd-asd">Task name</a>", }, { "id": 1040, "created_at": "2025-03-01T02:07:43Z", "user": "John", "project_id": 123, "card_id": 16485, "message": "<b>tagged</b> <a href="https://app.breeze.pm/projects/4186-aaaaaname-the-project/cards/70327-asdasd">Task name</a> with <b> bugs</b>", } ]
GET /activities/:user_id.json get activity entries
GET /projects/:project_id/activities.json get all activity entries
GET /projects/:project_id/activities/:user_id.json get activity entries
All responses are paginated 50 items per page. To get the next page append ?page=XX to the query.
GET /notifications.json get all unread notifications
[ { "id": 4160, "created_at": "2025-03-01T09:07:43Z", "project_id": 1723, "card_id": 324785, "comment_id": null, "marked": false, "description": "notifications from task description @Rene", "created_by": { "id": 5, "email": "john@breeze.pm", "name": "John Doe" } }, { "id": 2040, "created_at": "2025-03-01T02:07:43Z", "project_id": 123, "card_id": 16485, "comment_id": 236622, "marked": false, "description": "notification from a comment @Rene", "created_by": { "id": 5, "email": "john@breeze.pm", "name": "John Doe" } } ]
PUT /notifications/:id.json mark notification read/unread
{ "marked": true }
All activity responses are paginated 50 items per page. To get the next page append ?page=XX to the query.
POST /reports.json generate time tracking report
To use relative time in the reports set the parameter start_date to last_month,last_week, yesterday, today, this_week, this_month .
{ "report_type": "timetracking", "start_date": "2015-06-01", "end_date": "2015-07-01", "projects": [1,2,3], "users": [9,8,7], "stages": ["todo","done"], "tags": ["bugs","features"] }Response
[ { "id": 4160, "created_at": "2025-03-01T09:07:43Z", "logged_date": "2025-03-01", "notbillable": false, "tracked": 120, "user_id": "Jake", "project_id": 1723, "card_id": 324785, "desc": "backend developement", }, { "id": 1040, "created_at": "2025-03-01T02:07:43Z", "logged_date": "2025-03-01", "notbillable": false, "tracked": 60, "user_id": 2, "project_id": 123, "card_id": 16485, "desc": "testing", } ]
GET /me.json shows info about yourself, includes also the API key
{ "id": 2, "name": "Robert, "avatar": "https://s3.amazonaws.com/x22h82gcqu/a7e2c39b721235f17cb4a0e2a90b/CORQ.jpg", "authentication_token": "28734uhjasdb8223", "created_at": "2025-03-01T09:07:43Z", "timezone": "UTC" }, "teams": [ { "team_id": 129, "owner_email": "rene@breeze.pm" }, { "card_id": 234, "owner_email": "jake@breeze.pm" } ]
GET /users.json lists all your team users
[ { "id": 2, "name": "Robert, "avatar":"https://s3.amazonaws.com/x22h82gcqu/a7e2c39b7b4a0e06cb52a90b/CORQ.jpg" } , { "id": 3, "name": "Jake, "avatar":"https://s3.amazonaws.com/x22h82gcqu/a7e2c39b7212350b/avatar.jpg" } ]