Modern REST API for WebWork Time Tracker with OAuth2 authentication. This API provides access to workspaces, members, projects, and time tracking features.
WebWork Time Tracker API V2 Documentation (2.0.0)
Manage contracts (project-member assignments) within workspaces. Contracts define which members are assigned to which projects, with settings for rates, hours limits, and screenshot modes. Rate information is only visible if you have permission to view rates and the project is billable.
Request
Retrieve all timesheets for a specific workspace. Supports filtering by status, date range, user ID, and specific timesheet ID. Results are paginated and can be sorted by creation date.
Filters:
id: Filter by specific encrypted timesheet IDstatus: Filter by timesheet status (e.g., open, submitted, approved, rejected)date_from/date_to: Filter by date rangeuser_id: Filter by user IDorder_by: Sort by creation date (asc or desc)
Response Structure:
- Totals: Each timesheet includes user information (
user_id,member), date range (date_from,date_to),total_minutes, submission details, and status. - Daily Breakdown: The
daily_breakdownobject contains daily tracked time grouped by date. Each date has an array of project entries showingproject_id,project_name,contract_id, andtotal_minutesfor that day. - Amount Information:
total_amountfields (both at timesheet level and in daily breakdown) are only included if the authenticated user has permission to see rates in the workspace.
Pagination:
- Results are paginated with configurable page size
- Default: 20 items per page, maximum: 100
Filter by specific encrypted timesheet ID. The ID is an encrypted string.
Filter by timesheet status. Possible values: pending, submitted, approved, rejected.
Filter timesheets starting from this date (inclusive). Format: YYYY-MM-DD.
Filter timesheets up to this date (inclusive). Format: YYYY-MM-DD.
Filter timesheets by user ID. Returns only timesheets belonging to the specified user.
Sort order for timesheets by created_at. Possible values: asc (ascending), desc (descending).
- Production Serverhttps://api.webwork-tracker.com/api/v2/timesheets
- cURL
- JS
- Python
- PHP
- Go
- Java 8
- C#
- C++
curl -i -X GET \
'https://api.webwork-tracker.com/api/v2/timesheets?workspace_id=1' \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>'{ "success": true, "data": [ { … } ], "meta": { "api_version": "2.0.0", "timestamp": "2024-01-15T10:30:00.000000Z", "pagination": { … } } }
Request
Approve a submitted timesheet. Only workspace owners and executive managers can approve timesheets. The timesheet must be in 'submitted' status to be approved.
- Production Serverhttps://api.webwork-tracker.com/api/v2/timesheets/{timesheetId}/approve
- cURL
- JS
- Python
- PHP
- Go
- Java 8
- C#
- C++
curl -i -X PUT \
https://api.webwork-tracker.com/api/v2/timesheets/abc123xyz/approve \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"workspace_id": 1
}'{ "success": true, "data": { "id": "abc123xyz", "status": "approved", "user_id": 45696, "user_name": "John Smith", "user_email": "john.smith@example.com", "date_from": "2024-01-01", "date_to": "2024-01-15" }, "message": "Timesheet approved by Jane Doe at 2024-01-15 10:30:00 | Member: John Smith | Period: 2024-01-01 to 2024-01-15", "meta": { "api_version": "2.0.0", "timestamp": "2024-01-15T10:30:00Z" } }
Request
Reject a submitted timesheet with a reason. Only workspace owners and executive managers can reject timesheets. The timesheet must be in 'submitted' status to be rejected. A reason must be provided.
- Production Serverhttps://api.webwork-tracker.com/api/v2/timesheets/{timesheetId}/reject
- cURL
- JS
- Python
- PHP
- Go
- Java 8
- C#
- C++
curl -i -X PUT \
https://api.webwork-tracker.com/api/v2/timesheets/abc123xyz/reject \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"workspace_id": 1,
"reason": "Please correct the hours for Monday - they seem too high"
}'Timesheet rejected successfully
Dynamic message with rejector name, timestamp, member name, pay period, and rejection reason. Suitable for Slack bot notifications.
{ "success": true, "data": { "id": "abc123xyz", "status": "rejected", "user_id": 45696, "user_name": "John Smith", "user_email": "john.smith@example.com", "date_from": "2024-01-01", "date_to": "2024-01-15" }, "message": "Timesheet rejected by Jane Doe at 2024-01-15 10:30:00 | Member: John Smith | Period: 2024-01-01 to 2024-01-15 | Reason: Please correct the hours for Monday", "meta": { "api_version": "2.0.0", "timestamp": "2024-01-15T10:30:00Z" } }
Request
Submit a timesheet for approval. The timesheet must be in 'pending' or 'rejected' status to be submitted. Once submitted, it will be reviewed by workspace owners or executive managers.
- Production Serverhttps://api.webwork-tracker.com/api/v2/timesheets/{timesheetId}/submit
- cURL
- JS
- Python
- PHP
- Go
- Java 8
- C#
- C++
curl -i -X PUT \
https://api.webwork-tracker.com/api/v2/timesheets/abc123xyz/submit \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"workspace_id": 1
}'{ "success": true, "data": { "id": "abc123xyz", "status": "submitted", "user_id": 45696, "user_name": "John Smith", "user_email": "john.smith@example.com", "date_from": "2024-01-01", "date_to": "2024-01-15" }, "message": "Timesheet submitted by John Smith at 2024-01-15 10:30:00 | Member: John Smith | Period: 2024-01-01 to 2024-01-15", "meta": { "api_version": "2.0.0", "timestamp": "2024-01-15T10:30:00Z" } }
Request
Unsubmit a previously submitted timesheet. This returns the timesheet to 'pending' status, allowing the user to make changes before resubmitting.
- Production Serverhttps://api.webwork-tracker.com/api/v2/timesheets/{timesheetId}/unsubmit
- cURL
- JS
- Python
- PHP
- Go
- Java 8
- C#
- C++
curl -i -X PUT \
https://api.webwork-tracker.com/api/v2/timesheets/abc123xyz/unsubmit \
-H 'Authorization: Bearer <YOUR_TOKEN_HERE>' \
-H 'Content-Type: application/json' \
-d '{
"workspace_id": 1
}'{ "success": true, "data": { "id": "abc123xyz", "status": "open", "user_id": 45696, "user_name": "John Smith", "user_email": "john.smith@example.com", "date_from": "2024-01-01", "date_to": "2024-01-15" }, "message": "Timesheet unsubmitted by Jane Doe at 2024-01-15 10:30:00 | Member: John Smith | Period: 2024-01-01 to 2024-01-15", "meta": { "api_version": "2.0.0", "timestamp": "2024-01-15T10:30:00Z" } }