# TeamGrid API v1
# Generated from the published OpenAPI contract. Keep tokens in environment variables.
@baseUrl = https://api.de.teamgrid.app/v1
@token = replace-with-a-reveal-once-credential

### Discover API v1
GET {{baseUrl}}/
Authorization: Bearer {{token}}
Accept: application/json

### Exchange a TeamGrid CLI authorization code
POST {{baseUrl}}/auth/cli/token
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "authorizationCode": "string",
  "clientId": "string",
  "codeVerifier": "string",
  "grantType": "string",
  "redirectUri": "string"
}

### Compensate a failed TeamGrid CLI credential-store write
POST {{baseUrl}}/auth/cli/storage-compensation
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "grantId": "string"
}

### Get the authenticated workspace
GET {{baseUrl}}/workspace
Authorization: Bearer {{token}}
Accept: application/json

### List appointments in a bounded interval
GET {{baseUrl}}/appointments?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&start={{start}}&end={{end}}&userId={{userId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a TeamGrid-managed appointment
POST {{baseUrl}}/appointments
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "allDay": false,
  "busy": false,
  "description": "string",
  "end": {
    "at": "2026-07-29T09:00:00.000Z",
    "timeZone": "string"
  },
  "location": "string",
  "start": {
    "at": "2026-07-29T09:00:00.000Z",
    "timeZone": "string"
  },
  "title": "string",
  "visibility": "default",
  "userId": "string"
}

### Get an appointment
GET {{baseUrl}}/appointments/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a TeamGrid-managed appointment
PATCH {{baseUrl}}/appointments/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "allDay": false,
  "busy": false,
  "description": "string",
  "end": {
    "at": "2026-07-29T09:00:00.000Z",
    "timeZone": "string"
  },
  "location": "string",
  "start": {
    "at": "2026-07-29T09:00:00.000Z",
    "timeZone": "string"
  },
  "title": "string",
  "visibility": "default"
}

### Archive a TeamGrid-managed appointment
DELETE {{baseUrl}}/appointments/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a TeamGrid-managed appointment
POST {{baseUrl}}/appointments/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List absences in a bounded interval
GET {{baseUrl}}/absences?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&start={{start}}&end={{end}}&userId={{userId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create an absence
POST {{baseUrl}}/absences
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "end": "2026-07-29T09:00:00.000Z",
  "reason": null,
  "start": "2026-07-29T09:00:00.000Z",
  "userId": "string"
}

### Get an absence
GET {{baseUrl}}/absences/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update an absence
PATCH {{baseUrl}}/absences/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "end": "2026-07-29T09:00:00.000Z",
  "reason": null,
  "start": "2026-07-29T09:00:00.000Z"
}

### Archive an absence
DELETE {{baseUrl}}/absences/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an absence
POST {{baseUrl}}/absences/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List user availability
GET {{baseUrl}}/availability?start={{start}}&end={{end}}&timeZone={{timeZone}}&userId={{userId}}
Authorization: Bearer {{token}}
Accept: application/json

### List target activity
GET {{baseUrl}}/activity?cursor={{cursor}}&limit={{limit}}&targetType={{targetType}}&targetId={{targetId}}
Authorization: Bearer {{token}}
Accept: application/json

### List target comments
GET {{baseUrl}}/comments?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&targetType={{targetType}}&targetId={{targetId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a target comment
POST {{baseUrl}}/comments
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "targetId": "string",
  "targetType": "contact",
  "text": "string"
}

### Get a comment
GET {{baseUrl}}/comments/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Archive a comment
DELETE {{baseUrl}}/comments/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a comment
POST {{baseUrl}}/comments/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List document metadata
GET {{baseUrl}}/documents?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a document
POST {{baseUrl}}/documents
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "content": "string",
  "name": "string"
}

### Get a document
GET {{baseUrl}}/documents/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a document
PATCH {{baseUrl}}/documents/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "content": "string",
  "name": "string"
}

### Archive a document
DELETE {{baseUrl}}/documents/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a document
POST {{baseUrl}}/documents/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List public-space file metadata
GET {{baseUrl}}/files?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&entityType={{entityType}}&entityId={{entityId}}
Authorization: Bearer {{token}}
Accept: application/json

### Get file metadata
GET {{baseUrl}}/files/{id}?archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Rename a file
PATCH {{baseUrl}}/files/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "name": "string"
}

### Archive a file
DELETE {{baseUrl}}/files/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a file
POST {{baseUrl}}/files/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Create a file download intent
POST {{baseUrl}}/files/{id}/download-intent
Authorization: Bearer {{token}}
Accept: application/json

### Reserve and create a private file upload intent
POST {{baseUrl}}/file-upload-intents
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "destination": {
    "id": "string",
    "type": "contact"
  },
  "file": {
    "fileName": "string",
    "mimeType": "string",
    "size": 0
  }
}

### Finalize a file upload intent
POST {{baseUrl}}/file-upload-intents/{id}/finalize
Authorization: Bearer {{token}}
Accept: application/json

### Cancel a file upload intent
DELETE {{baseUrl}}/file-upload-intents/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List products
GET {{baseUrl}}/products?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&disabled={{disabled}}&productGroupId={{productGroupId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a product
POST {{baseUrl}}/products
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "amount": null,
  "annotation": null,
  "costCenter": null,
  "description": null,
  "disabled": null,
  "financeAccount": null,
  "name": "string",
  "priceGroupIds": null,
  "productGroupId": null,
  "productNumber": null,
  "purchasePrice": null,
  "retailPrice": null
}

### Get a product
GET {{baseUrl}}/products/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a product
PATCH {{baseUrl}}/products/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "amount": null,
  "annotation": null,
  "costCenter": null,
  "description": null,
  "disabled": null,
  "financeAccount": null,
  "name": "string",
  "priceGroupIds": null,
  "productGroupId": null,
  "productNumber": null,
  "purchasePrice": null,
  "retailPrice": null
}

### Archive a product
DELETE {{baseUrl}}/products/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List product groups
GET {{baseUrl}}/product-groups?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&parentId={{parentId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a product group
POST {{baseUrl}}/product-groups
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": null,
  "name": "string",
  "parentId": null
}

### Get a product group
GET {{baseUrl}}/product-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a product group
PATCH {{baseUrl}}/product-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": null,
  "name": "string",
  "parentId": null
}

### Archive a product group
DELETE {{baseUrl}}/product-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List projects
GET {{baseUrl}}/projects?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&completed={{completed}}&contactId={{contactId}}&createdById={{createdById}}&individualId={{individualId}}&listId={{listId}}&managerId={{managerId}}&subscriberId={{subscriberId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a project
POST {{baseUrl}}/projects
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "additionalContactIds": null,
  "color": null,
  "contactId": null,
  "description": null,
  "dueAt": "2026-07-29T09:00:00.000Z",
  "individualId": null,
  "listId": null,
  "managerId": null,
  "name": "string",
  "plannedEndAt": "2026-07-29T09:00:00.000Z",
  "plannedStartAt": "2026-07-29T09:00:00.000Z",
  "showInScheduling": null
}

### Get a project
GET {{baseUrl}}/projects/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a project
PATCH {{baseUrl}}/projects/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "additionalContactIds": null,
  "color": null,
  "contactId": null,
  "description": null,
  "dueAt": "2026-07-29T09:00:00.000Z",
  "individualId": null,
  "listId": null,
  "managerId": null,
  "name": "string",
  "plannedEndAt": "2026-07-29T09:00:00.000Z",
  "plannedStartAt": "2026-07-29T09:00:00.000Z",
  "showInScheduling": null
}

### Get project sharing
GET {{baseUrl}}/projects/{id}/sharing
Authorization: Bearer {{token}}
Accept: application/json

### Replace project sharing
PUT {{baseUrl}}/projects/{id}/sharing
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "entries": [
    {
      "permissions": [
        "string"
      ],
      "userId": null,
      "workspaceId": "string"
    }
  ]
}

### Complete a project asynchronously
POST {{baseUrl}}/projects/{id}/complete
Authorization: Bearer {{token}}
Accept: application/json

### Reopen a project asynchronously
POST {{baseUrl}}/projects/{id}/reopen
Authorization: Bearer {{token}}
Accept: application/json

### Archive a project asynchronously
POST {{baseUrl}}/projects/{id}/archive
Authorization: Bearer {{token}}
Accept: application/json

### Restore a project asynchronously
POST {{baseUrl}}/projects/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Get a project lifecycle operation
GET {{baseUrl}}/project-lifecycle-operations/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List project templates
GET {{baseUrl}}/project-templates?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&createdAtFrom={{createdAtFrom}}&createdAtTo={{createdAtTo}}&originProjectId={{originProjectId}}
Authorization: Bearer {{token}}
Accept: application/json

### Capture a project as a template
POST {{baseUrl}}/project-templates
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "color": "string",
  "description": "string",
  "projectId": "string",
  "title": "string"
}

### Get project-template metadata
GET {{baseUrl}}/project-templates/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update project-template metadata
PATCH {{baseUrl}}/project-templates/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "color": "string",
  "description": "string",
  "title": "string"
}

### Archive a project template
DELETE {{baseUrl}}/project-templates/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived project template
POST {{baseUrl}}/project-templates/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Instantiate a project template asynchronously
POST {{baseUrl}}/project-templates/{id}/instantiate
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "additionalContactIds": null,
  "color": null,
  "contactId": null,
  "description": "string",
  "dueAt": "2026-07-29T09:00:00.000Z",
  "individualId": null,
  "listId": null,
  "managerId": null,
  "name": "string",
  "plannedEndAt": "2026-07-29T09:00:00.000Z",
  "plannedStartAt": "2026-07-29T09:00:00.000Z",
  "showInScheduling": null
}

### Get a project-template instantiation operation
GET {{baseUrl}}/project-template-instantiations/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List planned work in a bounded window
GET {{baseUrl}}/planned-work?cursor={{cursor}}&limit={{limit}}&start={{start}}&end={{end}}&taskId={{taskId}}&projectId={{projectId}}&userId={{userId}}
Authorization: Bearer {{token}}
Accept: application/json

### Get a planned-work replacement operation
GET {{baseUrl}}/planned-work-operations/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Get a task planned-work schedule
GET {{baseUrl}}/tasks/{id}/planned-work
Authorization: Bearer {{token}}
Accept: application/json

### Replace task planned work asynchronously
PUT {{baseUrl}}/tasks/{id}/planned-work
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "dayLoads": [
    0
  ],
  "plannedEnd": "2026-07-29T09:00:00.000Z",
  "plannedStart": "2026-07-29T09:00:00.000Z"
}

### List project statements
GET {{baseUrl}}/project-statements?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&projectId={{projectId}}&productId={{productId}}&createdBy={{createdBy}}&dateFrom={{dateFrom}}&dateTo={{dateTo}}&createdAtFrom={{createdAtFrom}}&createdAtTo={{createdAtTo}}&type={{type}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a project statement
POST {{baseUrl}}/project-statements
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "amount": null,
  "comment": null,
  "count": null,
  "date": "2026-07-29T09:00:00.000Z",
  "description": null,
  "isCharge": false,
  "productNumber": null,
  "purchasePrice": null,
  "title": "string",
  "projectId": "string",
  "productId": null,
  "type": "manual"
}

### Get a project statement
GET {{baseUrl}}/project-statements/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a project statement
PATCH {{baseUrl}}/project-statements/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "amount": null,
  "comment": null,
  "count": null,
  "date": "2026-07-29T09:00:00.000Z",
  "description": null,
  "isCharge": false,
  "productNumber": null,
  "purchasePrice": null,
  "title": "string"
}

### Archive a project statement
DELETE {{baseUrl}}/project-statements/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a project statement
POST {{baseUrl}}/project-statements/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List tasks
GET {{baseUrl}}/tasks?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&assigneeId={{assigneeId}}&completed={{completed}}&contactId={{contactId}}&groupId={{groupId}}&listId={{listId}}&personalListId={{personalListId}}&projectId={{projectId}}&serviceId={{serviceId}}&subscriberId={{subscriberId}}&tagId={{tagId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a task
POST {{baseUrl}}/tasks
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "assigneeId": null,
  "billable": null,
  "contactId": null,
  "description": null,
  "descriptionFormat": "plain-text",
  "dueAt": "2026-07-29T09:00:00.000Z",
  "groupId": null,
  "listId": null,
  "name": "string",
  "plannedEndAt": "2026-07-29T09:00:00.000Z",
  "plannedMinutes": null,
  "plannedStartAt": "2026-07-29T09:00:00.000Z"
}

### Update multiple tasks safely
POST {{baseUrl}}/tasks/bulk-update
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "items": [
    {
      "data": {
        "billable": null,
        "contactId": null,
        "description": null,
        "descriptionFormat": "plain-text",
        "dueAt": "2026-07-29T09:00:00.000Z",
        "name": "string",
        "plannedEndAt": "2026-07-29T09:00:00.000Z",
        "plannedMinutes": null,
        "plannedStartAt": "2026-07-29T09:00:00.000Z",
        "serviceId": null,
        "subscriberIds": null,
        "tagIds": null
      },
      "id": "string",
      "revision": "string"
    }
  ]
}

### Get a task
GET {{baseUrl}}/tasks/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a task
PATCH {{baseUrl}}/tasks/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "assigneeId": null,
  "billable": null,
  "contactId": null,
  "description": null,
  "descriptionFormat": "plain-text",
  "dueAt": "2026-07-29T09:00:00.000Z",
  "groupId": null,
  "listId": null,
  "name": "string",
  "plannedEndAt": "2026-07-29T09:00:00.000Z",
  "plannedMinutes": null,
  "plannedStartAt": "2026-07-29T09:00:00.000Z"
}

### Archive a task
DELETE {{baseUrl}}/tasks/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived task
POST {{baseUrl}}/tasks/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Duplicate a task
POST {{baseUrl}}/tasks/{id}/duplicate
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "copyChecklist": true,
  "copyCustomFieldValues": true,
  "name": null
}

### Move or reorder a task
POST {{baseUrl}}/tasks/{id}/move
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "assigneeId": null,
  "axis": "assignee",
  "groupId": null,
  "listId": null,
  "nextTaskId": null,
  "personalListId": null,
  "previousTaskId": null,
  "projectId": null
}

### Replace a task checklist
PUT {{baseUrl}}/tasks/{id}/subtasks
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "subtasks": [
    {
      "completed": null,
      "id": null,
      "title": "string"
    }
  ]
}

### Complete a task
POST {{baseUrl}}/tasks/{id}/complete
Authorization: Bearer {{token}}
Accept: application/json

### Reopen a completed task
POST {{baseUrl}}/tasks/{id}/reopen
Authorization: Bearer {{token}}
Accept: application/json

### Start task time tracking
POST {{baseUrl}}/tasks/{id}/timer/start
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "at": "2026-07-29T09:00:00.000Z",
  "userId": "string"
}

### Stop task time tracking
POST {{baseUrl}}/tasks/{id}/timer/stop
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "at": "2026-07-29T09:00:00.000Z",
  "userId": "string"
}

### List time entries
GET {{baseUrl}}/time-entries?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&billable={{billable}}&billed={{billed}}&createdById={{createdById}}&from={{from}}&serviceId={{serviceId}}&to={{to}}&taskId={{taskId}}&userId={{userId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a time entry
POST {{baseUrl}}/time-entries
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "billable": null,
  "comment": null,
  "endAt": "2026-07-29T09:00:00.000Z",
  "serviceId": null,
  "startAt": "2026-07-29T09:00:00.000Z",
  "taskId": "string",
  "userId": "string"
}

### Get a time entry
GET {{baseUrl}}/time-entries/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a time entry
PATCH {{baseUrl}}/time-entries/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "billable": null,
  "comment": null,
  "endAt": "2026-07-29T09:00:00.000Z",
  "serviceId": null,
  "startAt": "2026-07-29T09:00:00.000Z"
}

### Archive a time entry
DELETE {{baseUrl}}/time-entries/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Get time-entry billing state
GET {{baseUrl}}/time-entries/{id}/billing
Authorization: Bearer {{token}}
Accept: application/json

### Update time-entry billing state
PUT {{baseUrl}}/time-entries/{id}/billing
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "billed": false
}

### Restore an archived time entry
POST {{baseUrl}}/time-entries/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List contacts
GET {{baseUrl}}/contacts?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&category={{category}}&companyId={{companyId}}&createdById={{createdById}}&customerId={{customerId}}&groupId={{groupId}}&parentContactId={{parentContactId}}&type={{type}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a contact
POST {{baseUrl}}/contacts
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "birthday": "2026-07-29T09:00:00.000Z",
  "category": "customer",
  "companyTitle": null,
  "customerId": null,
  "emails": null,
  "firstName": null,
  "gender": "female",
  "groupId": null,
  "lastName": null,
  "nickname": null,
  "notes": null,
  "parentContactId": null
}

### List call notes
GET {{baseUrl}}/call-notes?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a call note
POST {{baseUrl}}/call-notes
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "callId": "string",
  "content": "string"
}

### Get a call note
GET {{baseUrl}}/call-notes/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Archive a call note
DELETE {{baseUrl}}/call-notes/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived call note
POST {{baseUrl}}/call-notes/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List contact groups
GET {{baseUrl}}/contact-groups?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a contact group
POST {{baseUrl}}/contact-groups
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "parentId": null,
  "title": "string"
}

### Get a contact group
GET {{baseUrl}}/contact-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a contact group
PATCH {{baseUrl}}/contact-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "parentId": null,
  "title": "string"
}

### Archive a contact group
DELETE {{baseUrl}}/contact-groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived contact group
POST {{baseUrl}}/contact-groups/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Get a contact
GET {{baseUrl}}/contacts/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a contact
PATCH {{baseUrl}}/contacts/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "birthday": "2026-07-29T09:00:00.000Z",
  "category": "customer",
  "companyTitle": null,
  "customerId": null,
  "emails": null,
  "firstName": null,
  "gender": "female",
  "groupId": null,
  "lastName": null,
  "nickname": null,
  "notes": null,
  "parentContactId": null
}

### List workspace users
GET {{baseUrl}}/users?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### List workspace lists
GET {{baseUrl}}/lists?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&type={{type}}&parentId={{parentId}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a list
POST {{baseUrl}}/lists
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "name": "string",
  "parentId": null,
  "type": "tasks"
}

### Get a list
GET {{baseUrl}}/lists/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a list
PATCH {{baseUrl}}/lists/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "name": "string"
}

### Archive a list
DELETE {{baseUrl}}/lists/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived list
POST {{baseUrl}}/lists/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List services
GET {{baseUrl}}/services?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a service
POST {{baseUrl}}/services
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "billable": false,
  "billingRate": null,
  "title": "string"
}

### Get a service
GET {{baseUrl}}/services/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a service
PATCH {{baseUrl}}/services/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "billable": false,
  "billingRate": null,
  "title": "string"
}

### Archive a service
DELETE {{baseUrl}}/services/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived service
POST {{baseUrl}}/services/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List tags
GET {{baseUrl}}/tags?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a tag
POST {{baseUrl}}/tags
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "color": "string",
  "name": "string"
}

### Get a tag
GET {{baseUrl}}/tags/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a tag
PATCH {{baseUrl}}/tags/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "color": "string",
  "name": "string"
}

### Archive a tag
DELETE {{baseUrl}}/tags/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived tag
POST {{baseUrl}}/tags/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List custom-field definitions
GET {{baseUrl}}/custom-field-definitions?cursor={{cursor}}&limit={{limit}}&archived={{archived}}&defaultEnabled={{defaultEnabled}}&fieldType={{fieldType}}&targetType={{targetType}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a custom-field definition
POST {{baseUrl}}/custom-field-definitions
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "configuration": null,
  "defaultEnabled": false,
  "description": "string",
  "required": false,
  "title": "string",
  "fieldType": "contact",
  "targetType": "contact"
}

### Get a custom-field definition
GET {{baseUrl}}/custom-field-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a custom-field definition
PATCH {{baseUrl}}/custom-field-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "configuration": null,
  "defaultEnabled": false,
  "description": "string",
  "required": false,
  "title": "string"
}

### Archive a custom-field definition
DELETE {{baseUrl}}/custom-field-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an archived custom-field definition
POST {{baseUrl}}/custom-field-definitions/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Read custom-field values for one resource
POST {{baseUrl}}/custom-field-values/{targetType}/{resourceId}/batch-read
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "fieldIds": [
    "string"
  ]
}

### Get a custom-field value
GET {{baseUrl}}/custom-field-values/{targetType}/{resourceId}/{fieldId}
Authorization: Bearer {{token}}
Accept: application/json

### Set a custom-field value
PUT {{baseUrl}}/custom-field-values/{targetType}/{resourceId}/{fieldId}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "value": null
}

### Clear a custom-field value
DELETE {{baseUrl}}/custom-field-values/{targetType}/{resourceId}/{fieldId}
Authorization: Bearer {{token}}
Accept: application/json

### List developer audit events
GET {{baseUrl}}/audit-events?cursor={{cursor}}&limit={{limit}}&actorId={{actorId}}&actorType={{actorType}}&createdAtFrom={{createdAtFrom}}&createdAtTo={{createdAtTo}}&credentialId={{credentialId}}&eventType={{eventType}}&outcome={{outcome}}&requestId={{requestId}}&source={{source}}&targetId={{targetId}}&targetType={{targetType}}
Authorization: Bearer {{token}}
Accept: application/json

### List webhooks
GET {{baseUrl}}/webhooks?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a webhook
POST {{baseUrl}}/webhooks
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "actions": [
    "string"
  ],
  "url": "string"
}

### List webhook delivery history
GET {{baseUrl}}/webhook-deliveries?cursor={{cursor}}&limit={{limit}}&webhookId={{webhookId}}&state={{state}}&event={{event}}
Authorization: Bearer {{token}}
Accept: application/json

### Get webhook delivery metadata
GET {{baseUrl}}/webhook-deliveries/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Get a webhook
GET {{baseUrl}}/webhooks/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update or reactivate a webhook
PATCH {{baseUrl}}/webhooks/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "actions": [
    "string"
  ],
  "disabled": false,
  "url": "string"
}

### Remove a webhook
DELETE {{baseUrl}}/webhooks/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List workspace members
GET {{baseUrl}}/members?cursor={{cursor}}&limit={{limit}}&includePii={{includePii}}
Authorization: Bearer {{token}}
Accept: application/json

### Get a workspace member
GET {{baseUrl}}/members/{id}?includePii={{includePii}}
Authorization: Bearer {{token}}
Accept: application/json

### Remove a workspace member
DELETE {{baseUrl}}/members/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Change a member role
PATCH {{baseUrl}}/members/{id}/role
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "roleId": "string"
}

### List pending invitations
GET {{baseUrl}}/invitations?cursor={{cursor}}&limit={{limit}}&includePii={{includePii}}
Authorization: Bearer {{token}}
Accept: application/json

### Invite a workspace member
POST {{baseUrl}}/invitations
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "email": "string",
  "firstname": "string",
  "lastname": "string",
  "position": "string",
  "roleId": "string"
}

### Get a pending invitation
GET {{baseUrl}}/invitations/{id}?includePii={{includePii}}
Authorization: Bearer {{token}}
Accept: application/json

### Cancel a pending invitation
DELETE {{baseUrl}}/invitations/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Resend a pending invitation
POST {{baseUrl}}/invitations/{id}/resend
Authorization: Bearer {{token}}
Accept: application/json

### List workspace roles
GET {{baseUrl}}/roles?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a workspace role
POST {{baseUrl}}/roles
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "name": "string",
  "permissions": [
    "string"
  ]
}

### Get a workspace role
GET {{baseUrl}}/roles/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a workspace role
PATCH {{baseUrl}}/roles/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "name": "string",
  "permissions": [
    "string"
  ]
}

### Delete a workspace role
DELETE {{baseUrl}}/roles/{id}
Authorization: Bearer {{token}}
Accept: application/json

### List workspace groups
GET {{baseUrl}}/groups?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a workspace group
POST {{baseUrl}}/groups
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "memberIds": [
    "string"
  ],
  "name": "string",
  "visibility": "all"
}

### Get a workspace group
GET {{baseUrl}}/groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a workspace group
PATCH {{baseUrl}}/groups/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "memberIds": [
    "string"
  ],
  "name": "string",
  "visibility": "all"
}

### Delete a workspace group
DELETE {{baseUrl}}/groups/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Search authorized TeamGrid resources
POST {{baseUrl}}/search
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "limit": 1,
  "term": "string",
  "types": [
    "contacts"
  ]
}

### Create an asynchronous export
POST {{baseUrl}}/exports
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "createdAtFrom": "2026-07-29T09:00:00.000Z",
  "createdAtTo": "2026-07-29T09:00:00.000Z",
  "fields": [
    "string"
  ],
  "fileName": "string",
  "format": "string",
  "includeArchived": false,
  "maxRows": 1,
  "resourceType": "auditEvents",
  "updatedFrom": "2026-07-29T09:00:00.000Z",
  "updatedUntil": "2026-07-29T09:00:00.000Z"
}

### Get export job status
GET {{baseUrl}}/exports/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Create an export download intent
POST {{baseUrl}}/exports/{id}/download-intent?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Download a completed export through TeamGrid
GET {{baseUrl}}/exports/{id}/download
Authorization: Bearer {{token}}
Accept: application/json

### List public automation actions
GET {{baseUrl}}/automation-actions
Authorization: Bearer {{token}}
Accept: application/json

### List automation definitions
GET {{baseUrl}}/automation-definitions?cursor={{cursor}}&limit={{limit}}&archived={{archived}}
Authorization: Bearer {{token}}
Accept: application/json

### Create an automation definition
POST {{baseUrl}}/automation-definitions
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "flow": [
    {
      "actionId": "automationTask",
      "branches": [
        {
          "flow": null,
          "key": null
        }
      ],
      "config": [
        {
          "key": null,
          "value": null
        }
      ],
      "input": [
        {
          "key": null,
          "value": null
        }
      ],
      "output": [
        {
          "key": null,
          "value": null
        }
      ]
    }
  ],
  "name": "string",
  "trigger": {
    "data": {
      "type": "projects"
    },
    "event": "change"
  }
}

### Get an automation definition
GET {{baseUrl}}/automation-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update an automation definition
PATCH {{baseUrl}}/automation-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "flow": [
    {
      "actionId": "automationTask",
      "branches": [
        {
          "flow": null,
          "key": null
        }
      ],
      "config": [
        {
          "key": null,
          "value": null
        }
      ],
      "input": [
        {
          "key": null,
          "value": null
        }
      ],
      "output": [
        {
          "key": null,
          "value": null
        }
      ]
    }
  ],
  "name": "string",
  "trigger": {
    "data": {
      "type": "projects"
    },
    "event": "change"
  }
}

### Archive an automation definition
DELETE {{baseUrl}}/automation-definitions/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Restore an automation definition
POST {{baseUrl}}/automation-definitions/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### List immutable automation definition versions
GET {{baseUrl}}/automation-definitions/{id}/versions?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### List automation runs
GET {{baseUrl}}/automation-runs?cursor={{cursor}}&limit={{limit}}&definitionId={{definitionId}}&referenceId={{referenceId}}&referenceType={{referenceType}}&state={{state}}
Authorization: Bearer {{token}}
Accept: application/json

### Get an automation run
GET {{baseUrl}}/automation-runs/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Abort a running automation
POST {{baseUrl}}/automation-runs/{id}/abort
Authorization: Bearer {{token}}
Accept: application/json

### List integration installation status
GET {{baseUrl}}/integration-installations
Authorization: Bearer {{token}}
Accept: application/json

### Get the scoped public event catalog
GET {{baseUrl}}/events/catalog
Authorization: Bearer {{token}}
Accept: application/json

### List cell-local resource changes
GET {{baseUrl}}/changes?cursor={{cursor}}&limit={{limit}}&operations={{operations}}&resourceTypes={{resourceTypes}}&startAtLatest={{startAtLatest}}
Authorization: Bearer {{token}}
Accept: application/json

### Get credential-aware system capabilities
GET {{baseUrl}}/system/capabilities
Authorization: Bearer {{token}}
Accept: application/json

### Get public workspace entitlements
GET {{baseUrl}}/workspace/entitlements
Authorization: Bearer {{token}}
Accept: application/json

### Get public workspace settings
GET {{baseUrl}}/workspace/settings
Authorization: Bearer {{token}}
Accept: application/json

### Update public workspace settings
PATCH {{baseUrl}}/workspace/settings
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "currency": "AUD",
  "defaultLanguage": "de",
  "defaultPlannedTime": 0,
  "defaultProductivity": 0,
  "defaultShowInScheduling": false,
  "name": "string"
}

### Rotate a credential-owned webhook signing secret
POST {{baseUrl}}/webhooks/{id}/secret-rotation
Authorization: Bearer {{token}}
Accept: application/json

### Send a signed test webhook delivery
POST {{baseUrl}}/webhooks/{id}/test-delivery
Authorization: Bearer {{token}}
Accept: application/json

### Inspect the current credential
GET {{baseUrl}}/auth/context
Authorization: Bearer {{token}}
Accept: application/json

### Revoke the current credential
DELETE {{baseUrl}}/auth/context
Authorization: Bearer {{token}}
Accept: application/json

### List personal access tokens owned by the current user
GET {{baseUrl}}/me/personal-access-tokens?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a personal access token
POST {{baseUrl}}/me/personal-access-tokens
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "expiresAt": "2026-07-29T09:00:00.000Z",
  "name": "string",
  "scopes": [
    "string"
  ]
}

### Revoke a personal access token
DELETE {{baseUrl}}/me/personal-access-tokens/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Rotate a personal access token
POST {{baseUrl}}/me/personal-access-tokens/{id}/rotation
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "expiresAt": "2026-07-29T09:00:00.000Z",
  "gracePeriodSeconds": 60,
  "scopes": [
    "string"
  ]
}

### List service accounts
GET {{baseUrl}}/service-accounts?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a service account and its initial credential
POST {{baseUrl}}/service-accounts
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "expiresAt": "2026-07-29T09:00:00.000Z",
  "name": "string",
  "scopes": [
    "string"
  ]
}

### Get a service account
GET {{baseUrl}}/service-accounts/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Enable or disable a service account
PATCH {{baseUrl}}/service-accounts/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "reason": "string",
  "status": "active"
}

### Permanently revoke a service account
DELETE {{baseUrl}}/service-accounts/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Create an independent service account credential
POST {{baseUrl}}/service-accounts/{id}/credentials
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "description": "string",
  "expiresAt": "2026-07-29T09:00:00.000Z",
  "name": "string",
  "scopes": [
    "string"
  ]
}

### Revoke a service account credential
DELETE {{baseUrl}}/service-accounts/{id}/credentials/{credentialId}
Authorization: Bearer {{token}}
Accept: application/json

### Rotate a service account credential
POST {{baseUrl}}/service-accounts/{id}/credentials/{credentialId}/rotation
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "expiresAt": "2026-07-29T09:00:00.000Z",
  "gracePeriodSeconds": 60,
  "scopes": [
    "string"
  ]
}

### Get the complete service account resource grant set
GET {{baseUrl}}/service-accounts/{id}/resource-grants
Authorization: Bearer {{token}}
Accept: application/json

### Replace the complete service account resource grant set
PUT {{baseUrl}}/service-accounts/{id}/resource-grants
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "grants": [
    {
      "anchorId": "string",
      "anchorType": "workspace",
      "capabilities": [
        "string"
      ],
      "expiresAt": "2026-07-29T09:00:00.000Z",
      "inheritance": "domainDescendants",
      "resourceKey": "string"
    }
  ]
}

### List task recurrences
GET {{baseUrl}}/task-recurrences?cursor={{cursor}}&limit={{limit}}&projectId={{projectId}}&status={{status}}
Authorization: Bearer {{token}}
Accept: application/json

### Create a task recurrence
POST {{baseUrl}}/task-recurrences
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "changeReason": "string",
  "name": "string",
  "policy": {
    "candidates": null,
    "conditions": [
      null
    ],
    "engineVersion": "string",
    "limits": {
      "maxOccurrences": null,
      "until": null
    },
    "materialization": {
      "catchUp": "all",
      "catchUpLimit": 1,
      "lead": null,
      "overlap": "allow"
    },
    "schemaVersion": 0,
    "timeBasis": {
      "disambiguation": "compatible",
      "mode": "elapsed",
      "timeZone": "string"
    },
    "transforms": [
      null
    ]
  },
  "sourceTaskId": "string",
  "template": {
    "billable": false,
    "contactId": "string",
    "customFieldValues": null,
    "description": "string",
    "descriptionFormat": "markdown-v1",
    "groupId": "string",
    "listId": "string",
    "name": "string",
    "personalListId": "string",
    "plannedTime": 0,
    "projectId": "string",
    "serviceId": "string"
  },
  "templatePatch": {
    "billable": false,
    "contactId": "string",
    "customFieldValues": null,
    "description": "string",
    "descriptionFormat": "markdown-v1",
    "groupId": "string",
    "listId": "string",
    "name": "string",
    "personalListId": "string",
    "plannedTime": 0,
    "projectId": "string",
    "serviceId": "string"
  }
}

### Preview a draft task recurrence
POST {{baseUrl}}/task-recurrences/preview
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "context": null,
  "count": 20,
  "from": "2026-07-29T09:00:00.000Z",
  "policy": {
    "candidates": null,
    "conditions": [
      null
    ],
    "engineVersion": "string",
    "limits": {
      "maxOccurrences": null,
      "until": null
    },
    "materialization": {
      "catchUp": "all",
      "catchUpLimit": 1,
      "lead": null,
      "overlap": "allow"
    },
    "schemaVersion": 0,
    "timeBasis": {
      "disambiguation": "compatible",
      "mode": "elapsed",
      "timeZone": "string"
    },
    "transforms": [
      null
    ]
  },
  "template": {
    "billable": false,
    "contactId": "string",
    "customFieldValues": null,
    "description": "string",
    "descriptionFormat": "markdown-v1",
    "groupId": "string",
    "listId": "string",
    "name": "string",
    "personalListId": "string",
    "plannedTime": 0,
    "projectId": "string",
    "serviceId": "string"
  },
  "until": "2026-07-29T09:00:00.000Z"
}

### Get a task recurrence
GET {{baseUrl}}/task-recurrences/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Update a task recurrence
PATCH {{baseUrl}}/task-recurrences/{id}
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "changeReason": "string",
  "name": "string",
  "policy": {
    "candidates": null,
    "conditions": [
      null
    ],
    "engineVersion": "string",
    "limits": {
      "maxOccurrences": null,
      "until": null
    },
    "materialization": {
      "catchUp": "all",
      "catchUpLimit": 1,
      "lead": null,
      "overlap": "allow"
    },
    "schemaVersion": 0,
    "timeBasis": {
      "disambiguation": "compatible",
      "mode": "elapsed",
      "timeZone": "string"
    },
    "transforms": [
      null
    ]
  },
  "template": {
    "billable": false,
    "contactId": "string",
    "customFieldValues": null,
    "description": "string",
    "descriptionFormat": "markdown-v1",
    "groupId": "string",
    "listId": "string",
    "name": "string",
    "personalListId": "string",
    "plannedTime": 0,
    "projectId": "string",
    "serviceId": "string"
  }
}

### Archive a task recurrence
DELETE {{baseUrl}}/task-recurrences/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Preview a stored task recurrence
GET {{baseUrl}}/task-recurrences/{id}/preview?from={{from}}&until={{until}}&count={{count}}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a task recurrence
POST {{baseUrl}}/task-recurrences/{id}/restore
Authorization: Bearer {{token}}
Accept: application/json

### Pause a task recurrence
POST {{baseUrl}}/task-recurrences/{id}/pause
Authorization: Bearer {{token}}
Accept: application/json

### Resume a task recurrence
POST {{baseUrl}}/task-recurrences/{id}/resume
Authorization: Bearer {{token}}
Accept: application/json

### End a task recurrence
POST {{baseUrl}}/task-recurrences/{id}/end
Authorization: Bearer {{token}}
Accept: application/json

### Remove a task recurrence from its tasks
POST {{baseUrl}}/task-recurrences/{id}/remove-from-tasks
Authorization: Bearer {{token}}
Accept: application/json

### Transfer task recurrence ownership
POST {{baseUrl}}/task-recurrences/{id}/owner
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "id": "string",
  "kind": "developerPrincipal"
}

### Replace a recurrence template from a task
POST {{baseUrl}}/task-recurrences/{id}/definition-from-task
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "changeReason": "string",
  "policy": {
    "candidates": null,
    "conditions": [
      null
    ],
    "engineVersion": "string",
    "limits": {
      "maxOccurrences": null,
      "until": null
    },
    "materialization": {
      "catchUp": "all",
      "catchUpLimit": 1,
      "lead": null,
      "overlap": "allow"
    },
    "schemaVersion": 0,
    "timeBasis": {
      "disambiguation": "compatible",
      "mode": "elapsed",
      "timeZone": "string"
    },
    "transforms": [
      null
    ]
  },
  "taskId": "string"
}

### List task recurrence versions
GET {{baseUrl}}/task-recurrences/{id}/versions
Authorization: Bearer {{token}}
Accept: application/json

### Get a task recurrence version
GET {{baseUrl}}/task-recurrences/{id}/versions/{versionId}
Authorization: Bearer {{token}}
Accept: application/json

### Restore a task recurrence version
POST {{baseUrl}}/task-recurrences/{id}/versions/{versionId}/restore
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "changeReason": "string"
}

### List task recurrence occurrences
GET {{baseUrl}}/task-recurrences/{id}/occurrences?cursor={{cursor}}&limit={{limit}}
Authorization: Bearer {{token}}
Accept: application/json

### Get a task recurrence occurrence
GET {{baseUrl}}/task-recurrences/{id}/occurrences/{occurrenceKey}
Authorization: Bearer {{token}}
Accept: application/json

### Override a task recurrence occurrence
PUT {{baseUrl}}/task-recurrences/{id}/occurrences/{occurrenceKey}/override
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "action": "materialize",
  "placeholderToken": "string",
  "scheduledForLocal": "string",
  "templatePatch": {
    "billable": false,
    "contactId": "string",
    "customFieldValues": null,
    "description": "string",
    "descriptionFormat": "markdown-v1",
    "groupId": "string",
    "listId": "string",
    "name": "string",
    "personalListId": "string",
    "plannedTime": 0,
    "projectId": "string",
    "serviceId": "string"
  }
}

### Clear a task recurrence occurrence override
DELETE {{baseUrl}}/task-recurrences/{id}/occurrences/{occurrenceKey}/override
Authorization: Bearer {{token}}
Accept: application/json

### Retry a failed task recurrence occurrence
POST {{baseUrl}}/task-recurrences/{id}/occurrences/{occurrenceKey}/retry
Authorization: Bearer {{token}}
Accept: application/json

### Recheck a task recurrence asynchronously
POST {{baseUrl}}/task-recurrences/{id}/recheck
Authorization: Bearer {{token}}
Accept: application/json

### Submit an event to a task recurrence
POST {{baseUrl}}/task-recurrences/{id}/events
Authorization: Bearer {{token}}
Accept: application/json
Content-Type: application/json

{
  "causationId": "string",
  "correlationId": "string",
  "eventId": "string",
  "eventType": "string",
  "occurredAt": "2026-07-29T09:00:00.000Z",
  "payload": null,
  "schemaVersion": 0,
  "sourceId": "string"
}

### Get a task recurrence operation
GET {{baseUrl}}/task-recurrence-operations/{id}
Authorization: Bearer {{token}}
Accept: application/json

### Cancel a task recurrence operation
POST {{baseUrl}}/task-recurrence-operations/{id}/cancel
Authorization: Bearer {{token}}
Accept: application/json
