Chaser Public API

Build integrations, automate workflows, and manage tasks programmatically. The Chaser API uses Slack-style MCP & LLM friendly methods.

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": [] } } }

Parameters

task_id
string — Required. The ID of the task to retrieve.
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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true }

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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true, "task": { ... } }

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.

Response: { "ok": true, "task": { ... } }

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