Practical guide for working with Teamwork projects, tasks, milestones, and time tracking through Fp Switchboard.
- All IDs are numeric integers. Endpoint uses “people” not “users”
- V1 dates:
YYYYMMDD. V3 dates: ISO 8601. V1 keys: hyphenated. V3: camelCase
- Tasks require a tasklist:
POST /tasklists/{id}/tasks.json
- Custom fields: Create in V3, attach in V1, retrieve in V2
- Rate limit: 150/min (Grow), 300/min (Scale). Check
X-Rate-Limit-Remaining
Endpoint paths use “people” but task assignments use userIds.
| Example |
|---|
| Wrong | GET /projects/api/v3/users.json |
| Correct | GET /projects/api/v3/people.json (but assignees.userIds in task body) |
V1 uses YYYYMMDD, V3 uses ISO 8601. Key names also differ.
| Version | Example |
|---|
| V1 | start-date: "20250115" |
| V3 | startAt: "2025-01-15" |
Cannot create orphan tasks. Must specify tasklist in URL.
| Example |
|---|
| Wrong | POST /projects/api/v3/tasks.json |
| Correct | POST /projects/api/v3/tasklists/{tasklistId}/tasks.json |
Custom fields require using multiple API versions together:
- Create in V3
- Attach in V1
- Retrieve in V2 with
includeCustomFields=true
| V1 | V3 |
|---|
todo-item | task |
start-date | startAt |
due-date | dueAt |
| Hyphenated keys | camelCase keys |
- Get or create project
- Get or create tasklist in project
POST /projects/api/v3/tasklists/{tasklistId}/tasks.json
- Use camelCase keys (
name, startAt, dueAt)
GET /projects/api/v1/pendingfiles/presignedurl.json
- Upload to S3 URL with exact
Content-Length
- Attach using ref ID:
pendingFileAttachments: ["tf_..."]
| ID Type | Format | Example |
|---|
| Project/Task/Person ID | Numeric integer | 12345 |
- “List my Teamwork projects”
- “Show tasks assigned to me this week”
- “Create a task in the Development tasklist”
- “Log 2 hours on task 12345”
- “List milestones for the Q1 project”
| Plan | Limit |
|---|
| Grow | 150 requests/minute |
| Scale | 300 requests/minute |
| Header | Check X-Rate-Limit-Remaining |