# applyTaskSet

Run a whole TASK_SET against a contact: creates every step as a task in one call, all assigned to the acting user and linked to the contact (and any dealIds). Each step's due date is ITS OWN relative offset from one shared “now”, snapped to its own preferred time-of-day; the referenced template's timing is ignored inside a set. Steps run in due order and stop at the FIRST failure, KEEPING what was created: the payload carries the tasks that landed plus failedStep { index, taskTemplateId, message }, and it does NOT error, so read failedStep before reporting success. Rejects a template not of type TASK_SET. Set ids: listContentTemplates(type: TASK_SET).

- Call: `POST https://server.goliathdata.com/api/v1/call` with `{ "operationId": "applyTaskSet", "variables": {...} }`
- Scope: `WRITE`
- Type: mutation
- Idempotency: honors `Idempotency-Key` (24 h)
- Rate-limited: no

## Variables

- `templateId`: `ID!` (required)
- `contactId`: `ID!` (required)
- `dealIds`: `[ID!]`

## Response (data, an example)

```json
{
  "workflowAutomationsMutation": {
    "applyTaskSet": {
      "tasks": [
        {
          "id": "<ID>",
          "title": "…",
          "description": "…",
          "endDate": "2026-01-01T00:00:00.000Z",
          "completedAt": "2026-01-01T00:00:00.000Z"
        }
      ],
      "failedStep": {
        "index": 0,
        "taskTemplateId": "<ID>",
        "message": "…"
      }
    }
  }
}
```

## Example

```bash
curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "operationId": "applyTaskSet",
    "variables": {
      "templateId": "<templateId>",
      "contactId": "<contactId>"
    }
  }'
```
