Chaser Public API

Build integrations, automate workflows, and manage tasks programmatically.

Looking to connect an AI agent?

You don’t need an API key. Connect via MCP to use Chaser inside tools like ChatGPT, Claude, and Cursor.

Introduction

The Chaser Public API lets you programmatically manage tasks in your Slack workspace. You can create, read, update, complete, reopen, delete tasks, and log time — everything you can do in the Chaser dashboard, available as simple API calls.

The API follows Slack-style conventions: dot-namespaced method names (e.g. tasks.list, tasks.create), JSON request/response bodies, and a consistent {"ok": true} envelope. All write methods use POST. Read methods (tasks.list, tasks.info) accept both GET and POST.

Authentication

All API requests require a Bearer token in the Authorization header. You can create and manage API keys from the Integrations page in your Chaser dashboard.

Authorization: Bearer {your-api-key}

Base URL & Conventions

https://api.trychaser.com/v2/{method}

All responses use a standard envelope with an "ok" field. Successful responses include the relevant data (task, tasks, etc.). Error responses include a machine-readable error string. All timestamps are ISO 8601 format. All parameter names use snake_case. Assignees can be specified as Slack user IDs or email addresses.

GET / POST

tasks.list

List tasks the authenticated user has visibility on. Supports filtering, sorting, and cursor-based pagination. By default returns all open/in-progress tasks.

GET /v2/tasks.list?include_completed=true&limit=20

{  "ok": true,  "tasks": [    {      "id": "507f1f77bcf86cd799439011",      "summary": "Review the Q1 report",      "raw_summary": "Review the Q1 report by Friday",      "status_label": "Acknowledged",      "created_at": "2026-03-20T10:00:00Z",      "updated_at": "2026-03-22T14:30:00Z",      "completed_at": null,      "acknowledged_at": "2026-03-21T09:00:00Z",      "assignee_count": 3,      "completed_count": 1,      "is_pending_volunteer": false,      "due_date": "2026-04-01",      "due_time": "17:00",      "timezone_id": "America/New_York",      "creator": {        "id": "U08AB123C45",        "email": "alice@example.com",        "display_name": "Alice Johnson"      },      "assignees": [        {          "id": "U07SN787V51",          "email": "bob@example.com",          "display_name": "Bob Smith",          "has_acknowledged": true,          "completed_at": null        }      ],      "followers": [        {          "id": "U07SN787V51",          "email": "bob@example.com",          "display_name": "Bob Smith"        }      ],      "channel": { "id": "C07SN787V51", "name": "general" },      "tags": ["urgent", "review"],      "custom_status_label": null,      "multi_assign_strategy": "everyone",      "is_overdue": false,      "recurrence": null,      "link": "https://myteam.slack.com/archives/C07.../p174...",      "time_logs": {        "total_minutes": 45,        "entries": [          {            "user_id": "U07SN787V51",            "logged_at": "2026-03-22T10:00:00Z",            "minutes": 45          }        ]      }    }  ],  "response_metadata": {    "next_cursor": "dGVhbTpDMDYx..."  } }

Parameters

include_open
boolean — Include non-completed tasks. Default: true
include_completed
boolean — Include fully completed tasks. Default: false
overdue
boolean — If true, only overdue incomplete tasks
assignee
string — Slack user ID or email of an assignee
channel
string — Slack channel ID or channel name
tags
string — Comma-separated tag labels (matches any)
created_by
string — Slack user ID or email of the task creator
created_after
string — Tasks created after this date or timestamp
created_before
string — Tasks created before this date or timestamp
due_after
string — Tasks due after this date (YYYY-MM-DD)
due_before
string — Tasks due before this date (YYYY-MM-DD)
completed_after
string — Tasks completed after this date or timestamp
completed_before
string — Tasks completed before this date or timestamp
sort_by
string — Sort field: created_at, due_at, completed_at, updated_at. Default: created_at
GET / POST

tasks.info

Get a single task by ID. Returns the same task object as tasks.list.

GET /v2/tasks.info?task_id=507f1f77bcf86cd799439011 Response: {  "ok": true,  "task": {    "id": "507f1f77bcf86cd799439011",    "summary": "Review the Q1 report",    "raw_summary": "Review the Q1 report by Friday",    "status_label": "Acknowledged",    "created_at": "2026-03-20T10:00:00Z",    "updated_at": "2026-03-22T14:30:00Z",    "completed_at": null,    "acknowledged_at": "2026-03-21T09:00:00Z",    "assignee_count": 1,    "completed_count": 0,    "is_pending_volunteer": false,    "due_date": "2026-04-01",    "due_time": "17:00",    "timezone_id": "America/New_York",    "creator": { "id": "U08AB123C45", "email": "alice@example.com", "display_name": "Alice Johnson" },    "assignees": [      { "id": "U07SN787V51", "email": "bob@example.com", "display_name": "Bob Smith", "has_acknowledged": true, "completed_at": null }    ],    "followers": [],    "channel": { "id": "C07SN787V51", "name": "general" },    "tags": ["urgent"],    "custom_status_label": null,    "multi_assign_strategy": "everyone",    "is_overdue": false,    "recurrence": null,    "link": "https://myteam.slack.com/archives/C07.../p174...",    "time_logs": { "total_minutes": 0, "entries": [] },
   "history": [{"action": "complete", "user": {...}, "at": "2026-03-21T09:00:00Z"}]  } }

Parameters

task_id
string — Required. The ID of the task to retrieve.

history will include an audit log of changes to the task. action property can be one of the following: complete, complete_for_other, acknowledge, reopen, delete, edit, reassign, set_due_date, follow, stop_following, add_follower, adjust_time_logged, repeat, stop_repeat, add_tag, remove_tag, set_custom_status, pass.

POST

tasks.create

Create a new task. Supports natural language due date detection, automatic assignee resolution from emails, and channel lookup by name.

POST /v2/tasks.create { "summary": "Review the Q1 report", "assignees": ["U07SN787V51", "jane@example.com"], "due_date": "2026-04-01", "due_time": "17:00", "channel": "general" } Response: { "ok": true, "task": { "id": "682a1b33dcf86cd799439022", "summary": "Review the Q1 report", "raw_summary": "Review the Q1 report", "status_label": "Not Acknowledged", "created_at": "2026-03-26T10:00:00Z", "updated_at": "2026-03-26T10:00:00Z", "completed_at": null, "acknowledged_at": null, "assignee_count": 2, "completed_count": 0, "is_pending_volunteer": false, "due_date": "2026-04-01", "due_time": "17:00", "timezone_id": "America/New_York", "creator": { "id": "U08AB123C45", "email": "alice@example.com", "display_name": "Alice Johnson" }, "assignees": [ { "id": "U07SN787V51", "email": "bob@example.com", "display_name": "Bob Smith", "has_acknowledged": false, "completed_at": null }, { "id": "U09CD456E78", "email": "jane@example.com", "display_name": "Jane Doe", "has_acknowledged": false, "completed_at": null } ], "followers": [], "channel": { "id": "C07SN787V51", "name": "general" }, "tags": [], "custom_status_label": null, "multi_assign_strategy": "everyone", "is_overdue": false, "recurrence": null, "link": "https://myteam.slack.com/archives/C07.../p175...", "time_logs": { "total_minutes": 0, "entries": [] } } }

Parameters

summary
string — Required. Task description.
assignees
string[] — Slack user IDs or emails. Defaults to API key owner.
due_date
string — YYYY-MM-DD or natural language (e.g. "next Friday").
due_time
string — HH:MM format (24-hour).
channel
string — Slack channel ID or name. Defaults to DM with API key owner.
custom_status_label
string — Custom status label.
detect_due_date
boolean — Use LLM to extract due dates from summary. Default: true.
send_dm_notification
boolean — Send DM confirming task creation. Default: true.
POST

tasks.update

Update task fields. Only included fields are modified — omitted fields keep their existing values.

POST /v2/tasks.update { "task_id": "507f1f77bcf86cd799439011", "summary": "Updated summary", "due_date": "2026-04-15" } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Updated summary", "raw_summary": "Updated summary", "status_label": "Acknowledged", "created_at": "2026-03-20T10:00:00Z", "updated_at": "2026-03-26T11:00:00Z", "completed_at": null, "due_date": "2026-04-15", "due_time": "17:00", ... } }

Parameters

task_id
string — Required. Task to update.
summary
string — New summary text.
due_date
string | null — YYYY-MM-DD or null to clear.
due_time
string | null — HH:MM or null to clear.
assignees
string[] — Replace full assignee list (Slack user IDs or emails).
custom_status_label
string | null — Set or clear custom status.
POST

tasks.delete

Delete a task. Deleted tasks are no longer returned by the API.

POST /v2/tasks.delete { "task_id": "507f1f77bcf86cd799439011" } Response: { "ok": true }
task_id
string — Required. Task to delete.
POST

tasks.complete

Complete the task for the current user (the API key owner). For multi-assign tasks, only marks completion for your assignment.

POST /v2/tasks.complete { "task_id": "507f1f77bcf86cd799439011" } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Review the Q1 report", "status_label": "Completed", "completed_at": "2026-03-26T12:00:00Z", "assignee_count": 1, "completed_count": 1, ... } }
task_id
string — Required. Task to complete.
POST

tasks.completeForAll

Complete the task for all assignees at once.

POST /v2/tasks.completeForAll { "task_id": "507f1f77bcf86cd799439011" } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Review the Q1 report", "status_label": "Completed", "completed_at": "2026-03-26T12:00:00Z", "assignee_count": 3, "completed_count": 3, ... } }
task_id
string — Required. Task to complete for all assignees.
POST

tasks.completeFor

Complete the task for specific assignees.

POST /v2/tasks.completeFor { "task_id": "507f1f77bcf86cd799439011", "assignees": ["U07SN787V51", "jane@example.com"] } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Review the Q1 report", "status_label": "2 of 3 Completed", "completed_at": null, "assignee_count": 3, "completed_count": 2, ... } }
task_id
string — Required. Task to complete for specific assignees.
assignees
string[] — Required. Slack user IDs or emails to complete for.
POST

tasks.reopen

Reopen a completed task. You can optionally update fields (summary, due_date, due_time, assignees) at the same time.

POST /v2/tasks.reopen { "task_id": "507f1f77bcf86cd799439011", "summary": "Reopened with updated instructions", "due_date": "2026-04-20" } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Reopened with updated instructions", "status_label": "Not Acknowledged", "completed_at": null, "due_date": "2026-04-20", ... } }
task_id
string — Required. Task to reopen.

All fields except task_id are optional. You can update summary, due_date, due_time, and assignees when reopening. Response: { "ok": true, "task": { ... } }

POST

tasks.acknowledge

Acknowledge a task for the current user (the API key owner).

POST /v2/tasks.acknowledge { "task_id": "507f1f77bcf86cd799439011" } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Review the Q1 report", "status_label": "Acknowledged", "acknowledged_at": "2026-03-26T09:00:00Z", ... } }
task_id
string — Required. Task to acknowledge.
POST

tasks.logTime

Log time on a task in minutes. Use negative values to subtract time. Time log entries are append-only.

POST /v2/tasks.logTime { "task_id": "507f1f77bcf86cd799439011", "minutes": 45 } Response: { "ok": true, "task": { "id": "507f1f77bcf86cd799439011", "summary": "Review the Q1 report", "time_logs": { "total_minutes": 90, "entries": [ { "user_id": "U08AB123C45", "logged_at": "2026-03-22T10:00:00Z", "minutes": 45 }, { "user_id": "U08AB123C45", "logged_at": "2026-03-26T14:00:00Z", "minutes": 45 } ] }, ... } }

Parameters

task_id
string — Required. Task to log time on.
minutes
integer — Required. Minutes to log. Use negative values to subtract.

Rate Limiting

The API allows 300 requests per minute per authenticated user (same bucket as other Chaser web API rate limits). When exceeded, you'll receive a 429 Too Many Requests response with the error rate_limit_exceeded. Contact support for higher limits.

Errors

All error responses include "ok": false and a machine-readable error string. Use these error strings for programmatic error handling.

{ "ok": false, "error": "task_not_found" }

HTTP Status Codes

400
Bad request — validation errors, invalid state
401
Missing or invalid API key
404
Task not found
429
Rate limit exceeded
500
Unexpected server error

Error Strings

missing_summary
Task summary is required
invalid_due_date_format
Due date is not a valid YYYY-MM-DD or parseable natural language
invalid_due_time_format
Due time is not a valid HH:MM value
invalid_api_key
API key is missing or not recognized
task_not_found
No task exists with the given ID
task_already_completed
Task is already completed
task_not_completed
Cannot reopen a task that isn't completed
assignee_not_found
One or more assignee emails/IDs could not be resolved
channel_not_found
Channel name or ID could not be resolved
rate_limit_exceeded
Too many requests
summary_too_long
Summary exceeds maximum length