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.
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 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.
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": { ... } }
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": { ... } }
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 }
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": { ... } }
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": { ... } }
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": { ... } }
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": { ... } }
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": { ... } }
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
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