Dashtrack is in beta. Sign up to be first to know about launch.

API Documentation

Build custom integrations with the Dashtrack REST API. Manage projects, tasks, time tracking, and more programmatically.

Authentication

All API requests require authentication using an API key. Include your API key in the request header:

Authorization: Bearer dt_your_api_key_here

Generate API keys from your account Settings → API Keys page. Keys are prefixed with dt_.

Base URL & Rate Limits

Base URL

https://dashtrack.io/api/v1

Important: Do not use www. in API requests. The redirect will strip authentication headers.

Rate Limits

  • Starter: 100 requests per hour
  • Professional: 1,000 requests per hour
  • Agency: 10,000 requests per hour
  • Enterprise: Custom limits available

Rate limit headers are included in all responses: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Endpoints

Projects

GET/projects

List all non-archived projects accessible with your API key

Optional Query Parameters:

  • id (string): Fetch a single project by ID

Response:

{ "projects": [ { "id": "uuid", "name": "Website Redesign", "url": "https://example.com", "description": "Full website redesign project", "retainer_hours": 40, "project_type": "retainer", "archived": false } ] }
GET/projects/{projectId}

Fetch a single project by ID

Response:

{ "project": { "id": "uuid", "name": "Website Redesign", "url": "https://example.com", "description": "Full website redesign project", "retainer_hours": 40, "project_type": "retainer", "archived": false } }
PATCH/projects/{projectId}

Update a project (partial updates supported)

Request Body (all fields optional):

{ "name": "Updated Project Name", "description": "Updated description", "url": "https://newurl.com", "project_type": "retainer", "archived": false }
DELETE/projects/{projectId}

Archive a project (soft delete)

GET/projects/{projectId}/stats

Get aggregate statistics for a project including task counts, time logged, and team info

Response:

{ "project_id": "uuid", "project_name": "Website Redesign", "project_type": "retainer", "retainer_hours": 40, "total_logged_hours": 25.5, "retainer_remaining_hours": 14.5, "total_tasks": 24, "tasks_by_status": { "todo": 8, "in-progress": 6, "done": 10 }, "team_member_count": 3 }

Tasks

GET/projects/{projectId}/tasks

List all tasks for a project with optional filters

Query Parameters:

  • status (string): Filter by status (todo, in-progress, done)
  • assigned_to (string): Filter by user ID
  • task_list (string): Filter by task list name
POST/projects/{projectId}/tasks

Create a new task for a project

Request Body:

{ "name": "Design homepage mockup", "description": "Create initial mockup designs", "due_date": "2025-02-15T00:00:00Z", "start_date": "2025-02-01T00:00:00Z", "task_list": "Design", "assigned_to": ["user-uuid-1", "user-uuid-2"], "status": "todo", "priority": "high" }

Required: name (string)

status: todo (default), in-progress, done

priority: low, medium, high, or null. Values are case-insensitive and normalized to title case.

assigned_to: Array of user UUIDs or display names. UUIDs are automatically resolved to display names for consistency with UI-created tasks.

due_date, start_date: ISO 8601 datetime format

Response (201 Created):

{ "task": { "id": "uuid", "name": "Design homepage mockup", "description": "Create initial mockup designs", "status": "todo", "priority": "high", "due_date": "2025-02-15T00:00:00Z", "project_client_id": "project-uuid", "created_at": "2025-02-01T12:00:00Z" } }
GET/tasks/{taskId}

Fetch a single task by ID

PATCH/tasks/{taskId}

Update a task (partial updates supported)

Request Body (all fields optional):

{ "name": "Updated task name", "status": "in-progress", "priority": "high", "due_date": "2025-02-20", "assigned_to": ["user-uuid"] }
DELETE/tasks/{taskId}

Delete a task permanently

Leads (Business Development)

GET/leads

List all leads from the business development section

Query Parameters (optional):

status - Filter by status

rep - Filter by sales representative

POST/leads

Create a new lead

Request Body:

{ "name": "Acme Corporation", "email": "contact@acme.com", "phone": "+44 123 456 7890", "company": "Acme Corp", "notes": "Interested in website redesign", "status": "Proposal Wanted", "rep": "Cai", "tags": ["Create Proposal", "Chase Up"], "chaser_date": "2025-02-15T00:00:00Z" }

Required: name, status

status: First Contact Made, Proposal Wanted, Proposal Sent, Chaser, Needs Closing, Closed, Dead Leads, No Response (case-insensitive)

tags: Proposal Sent, Chaser Sent, Deliberating, Create Proposal, Chase Up, Pending Development, Stuck, In Progress, On Hold, Waiting on Cai, Sent for Review, Won

GET/leads/{leadId}

Fetch a single lead by ID

PATCH/leads/{leadId}

Update a lead (partial updates supported)

Request Body (all fields optional):

{ "name": "Updated Company Name", "status": "Proposal Sent", "tags": ["Chaser Sent"], "notes": "Follow up next week" }
DELETE/leads/{leadId}

Delete a lead permanently

Time Tracking

GET/projects/{projectId}/time

Get time entries for a project with optional filters

Query Parameters:

  • from (string): Start date filter (YYYY-MM-DD)
  • to (string): End date filter (YYYY-MM-DD)
  • user_id (string): Filter by user ID

Response:

{ "project_id": "uuid", "project_name": "Website Redesign", "retainer_hours": 40, "total_logged_hours": 25.5, "total_entries": 15, "entries": [ { "id": "uuid", "duration_seconds": 3600, "description": "Homepage design work", "start_time": "2025-02-01T09:00:00Z", "user": { "id": "uuid", "name": "John Doe", "email": "john@example.com" } } ] }

Meeting Notes

GET/projects/{projectId}/notes

List meeting notes for a project

POST/projects/{projectId}/notes

Create a new meeting note for a project

Request Body:

{ "notes": "Meeting notes content here...", "meeting_date": "2025-02-01", "checkboxes": [ { "label": "Follow up with client", "is_checked": false }, { "label": "Send proposal", "is_checked": true } ] }

Required: notes. All other fields are optional.

Team

GET/team

List all team members (useful for resolving user IDs)

Response:

{ "team": [ { "id": "uuid", "name": "John Doe", "email": "john@example.com", "role": "Developer", "user_type": "staff", "avatar_url": "https://..." } ] }

Holidays

GET/holidays

Get holiday requests and stats for the authenticated user or team

Query Parameters:

  • scope (string): me (default) or team for all requests
  • status (string): Filter by status (pending, approved, declined)

Response:

{ "user": { "id": "uuid", "name": "John Doe", "email": "john@example.com" }, "stats": { "allocation": 25, "used": 10, "pending": 2, "available": 15, "entitlement_hours": 0 }, "requests": [...] }

Error Codes

200Success
201Created - Resource successfully created
400Bad Request - Invalid parameters or JSON body
401Unauthorized - Invalid or missing API key
403Forbidden - No access to this resource
404Not Found - Resource does not exist
429Too Many Requests - Rate limit exceeded
500Internal Server Error

Example Request

Create a new task:

curl -X POST https://dashtrack.io/api/v1/projects/{projectId}/tasks \ -H "Authorization: Bearer dt_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "name": "Design homepage mockup", "description": "Create initial design mockups for the homepage", "status": "todo", "priority": "high", "due_date": "2025-02-15" }'

Need Help?

Contact our support team for assistance with API integration

Contact Support